feriados.io vs Holiday API
Both return holiday data and both have workday calculation endpoints. The difference is depth of LATAM coverage: transfer rules, irrenunciable flags, and real-time decree monitoring for Argentina.
The core difference
Holiday API is a global-first holiday data provider with basic workday arithmetic. feriados.io is a LATAM-first business calendar engine built specifically around how Latin American governments actually manage their calendars.
If you're building a product that operates in Latin America — not just displaying holidays, but processing payments, calculating payroll, computing delivery dates, or enforcing SLAs — the accuracy of the underlying data matters more than the number of countries covered.
Feature comparison
| Feature | feriados.io | Holiday API |
|---|---|---|
| Holiday data by country | ✓ | ✓ |
| Add N business days to a date Both support this | ✓ | ✓ |
| Count business days between dates Both support this | ✓ | ✓ |
| Subtract N business days Holiday API workday endpoint goes forward only | ✓ | Partial |
| Last business day of the month Not available in Holiday API | ✓ | ✗ |
| Validate if date is a business day No direct is-business-day endpoint | ✓ | ✗ |
| Batch date validation (up to 366 dates) Not available in Holiday API | ✓ | ✗ |
| Custom business calendars Add company-specific non-working days as overlay | ✓ Starter+ | ✗ |
| Chile irrenunciable flag feriados.io-specific field | ✓ | ✗ |
| Colombia Ley Emiliani (verified shifted dates) Not documented in Holiday API docs | ✓ | Unclear |
| Mexico floating Monday (verified) Not documented in Holiday API docs | ✓ | Unclear |
| Argentina decree puentes (near real-time) Update cadence not documented | ✓ | Unclear |
| Decree alerts via webhook | ✓ Business | ✗ |
| Live iCal subscription URL | ✓ Team+ | ✗ |
| Free plan with commercial use Holiday API free is restricted to historical data only | ✓ | Limited |
| LATAM countries | 11 | 11+ |
| Global countries Holiday API has broader global coverage | 11 | 100+ |
Why LATAM accuracy matters more than you think
A holiday API that lists January 6th as "Reyes Magos" in Colombia is technically correct — that is the holiday. But January 6th is a regular business day in 2026. The holiday is observed on January 12th. If your payment processor checks January 6th and gets "holiday", it's wrong. If it checks January 12th and doesn't know it's a holiday, it's also wrong.
18 of 20 holidays shift to the following Monday. Checking original dates gives wrong results. feriados.io returns the actual observed date and flags it as shifted.
7 holidays cannot legally be worked. The API response flags each holiday as irrenunciable: true or false — a distinction Holiday API doesn't surface in their responses.
2–4 bridge holidays are decreed mid-year, sometimes with 10 days notice. feriados.io updates within 24 hours. Whether Holiday API does the same is not documented.
When to choose each
- ✓ Your product operates in Latin America and correctness matters (fintech, payroll, logistics)
- ✓ You need irrenunciable flag for Chile — HR or payroll systems
- ✓ You process payments in Colombia and need Ley Emiliani handled correctly
- ✓ You need real-time decree monitoring for Argentina
- ✓ You want is-business-day as a validation step before running transactions
- ✓ You need last-business-day for monthly cutoffs and billing
- ✓ You want predictable, transparent pricing without annual lock-in surprises
- → You need holiday coverage for countries outside Latin America
- → Basic workday arithmetic is enough and LATAM transfer rules are not a concern
- → You need state or province-level data across many global regions
- → Your use case doesn't require real-time decree monitoring
What you'd have to build yourself with Holiday API
Holiday API has no is-business-day endpoint.
To check if a date is workable in Colombia you'd need to fetch the year's holidays, apply Ley Emiliani shift logic,
then evaluate the date. feriados.io handles all of that in a single request.
// 1. Fetch all holidays for the year
const { response } = await holidayapi.holidays({
country: "CO", year: 2026
});
// 2. Apply Ley Emiliani shift logic yourself
// (18 of 20 Colombian holidays move to Monday)
function applyEmiliani(holidays) {
return holidays.map(h => {
const d = new Date(h.date);
if (EMILIANI_HOLIDAYS.includes(h.name)) {
// find next Monday...
}
return h;
});
}
const observed = applyEmiliani(response.holidays);
// 3. Check weekend + holiday lookup
const day = new Date(targetDate).getDay();
const isWeekend = day === 0 || day === 6;
const isHoliday = observed.some(h => h.date === targetDate);
// 4. Finally answer the question
const isBusinessDay = !isWeekend && !isHoliday; // One API call — done
const res = await fetch(
"https://api.feriados.io/v1/CO" +
"/is-business-day?date=2026-01-12",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
const { data } = await res.json();
// data.is_business_day → true
// data.holiday → null
//
// Jan 6 (Reyes Magos) is observed Jan 12
// per Ley Emiliani — already handled. // Not available — Holiday API workday
// endpoint only goes forward.
// You'd need to implement a reverse loop:
let current = new Date(fromDate);
let counted = 0;
while (counted < daysToSubtract) {
current.setDate(current.getDate() - 1);
// check weekend + fetch holidays...
if (isWorkday(current, holidays)) counted++;
}
// Result: many requests + custom logic const res = await fetch(
"https://api.feriados.io/v1/CO" +
"/business-days/subtract" +
"?fromDate=2026-03-10&days=5",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
const { data } = await res.json();
// data.result_date → "2026-03-03"
// (Argentina/Colombia rules applied) Migrating from Holiday API
The main changes are: move the API key from a query param to a header, move the country into the URL path, and update the response field name. Workday arithmetic endpoints have direct equivalents — plus several new ones not available in Holiday API.
| In Holiday API | In feriados.io | What changes |
|---|---|---|
| GET /v1/holidays ?key=KEY&country=CO&year=2026 | GET /v1/CO/holidays/2026 Authorization: Bearer KEY | Key moves to header. Country and year go in the URL path. |
| response.holidays[] | data[] | Rename the array in your code. |
| GET /v1/workday ?key=KEY&country=CO&start=...&days=N | POST /v1/CO/business-days/add ?fromDate=...&days=N | Method changes to POST. Key moves to header. Response field: result_date. |
| Not available (forward only) | POST /v1/CO/business-days/subtract ?fromDate=...&days=N | New. Subtract N business days from a date. |
| Not available | GET /v1/CO/is-business-day ?date=YYYY-MM-DD | New. Validate a date directly — no holiday list needed. |
| Not available | POST /v1/CO/business-days/between ?fromDate=...&toDate=... | New. Count business days between two dates. |
| Not available | GET /v1/CO/last-business-day ?date=YYYY-MM-DD | New. Last business day of the month. |
// Before (Holiday API)
const { response } = await holidayapi.workday({
country: "CO", start: "2026-01-07", days: 5
});
const resultDate = response.workday.date;
// After (feriados.io)
const res = await fetch(
"https://api.feriados.io/v1/CO/business-days/add?fromDate=2026-01-07&days=5",
{ headers: { Authorization: `Bearer ${process.env.FERIADOS_API_KEY}` } }
);
const { data } = await res.json();
const resultDate = data.result_date;
// Also includes: data.from, data.business_days_added, data.country An honest note on this comparison
Holiday API's documentation on LATAM transfer rules (Ley Emiliani, floating Mondays, Argentina puentes) is not publicly detailed. We've marked those rows as "Unclear" rather than assume they don't handle them. If accurate LATAM date logic is critical to your product, we recommend testing both APIs against known edge cases — like January 12th in Colombia 2026, or February 2nd vs February 5th in Mexico 2026.
feriados.io is purpose-built for LATAM and we document exactly how each country's transfer rules work. You can verify our logic against the Colombia 2026 holiday list or the Mexico 2026 floating Monday dates.
Try feriados.io free
Free API key in 30 seconds. 1,000 requests/month with commercial use. Test against any of the LATAM edge cases above — no credit card required.
Also comparing: vs Calendarific · vs Nager.Date →