feriados.io vs Nager.Date
Nager.Date is a free, open-source holiday data API — great for prototyping. feriados.io is a business calendar engine: it calculates deadlines, counts working days, and handles LATAM-specific rules that Nager.Date doesn't model.
The core difference
Nager.Date tells you which days are holidays. feriados.io tells you which days are holidays and what to do with that information — add business days to a date, count working days between two dates, find the last business day of the month.
If your product just needs to display a holiday calendar, Nager.Date works fine and costs nothing. If your product processes payroll, calculates delivery dates, enforces SLAs, or validates payment dates — you need date arithmetic, and Nager.Date has none of that.
The IsTodayPublicHoliday gotcha
Nager.Date's closest equivalent to an is-business-day endpoint
is IsTodayPublicHoliday.
It has two significant limitations: it only works for today,
and it returns an HTTP status code instead of a JSON response.
// Only works for TODAY — not arbitrary dates
const res = await fetch(
"https://date.nager.at/api/v3/IsTodayPublicHoliday/CL"
);
// Returns HTTP 200 if today is a holiday
// Returns HTTP 204 (no body) if it's not
// No JSON. No date field. No holiday name.
// Can't check 2026-09-18 — only "today"
// Also: doesn't check weekends.
// Saturday returns 204 → "not a holiday" ✓
// But Saturday is still not a business day. // Works for any date — past or future
const res = await fetch(
"https://api.feriados.io/v1/CL/is-business-day" +
"?date=2026-09-18",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
const { data } = await res.json();
// data.is_business_day → false
// data.is_holiday → true
// data.holiday.name → "Fiestas Patrias"
// data.holiday.irrenunciable → true
// Checks both holidays AND weekends. Feature comparison
| Feature | feriados.io | Nager.Date |
|---|---|---|
| Holiday data by country | ✓ | ✓ |
| Next public holiday Both support this | ✓ | ✓ |
| Check if today is a holiday Nager returns a status code, not JSON | ✓ | ✓ (HTTP 200/204) |
| Check if any date is a business day Nager only checks today, not arbitrary dates | ✓ | ✗ |
| Checks weekends + holidays together Nager's check is holidays only | ✓ | ✗ |
| Add N business days to a date Not available in Nager.Date | ✓ | ✗ |
| Subtract N business days Not available in Nager.Date | ✓ | ✗ |
| Count business days between dates Not available in Nager.Date | ✓ | ✗ |
| Last business day of the month Not available in Nager.Date | ✓ | ✗ |
| Batch date validation Not available in Nager.Date | ✓ | ✗ |
| Chile irrenunciable flag feriados.io-specific field | ✓ | ✗ |
| Colombia Ley Emiliani (verified shifted dates) Nager has CO data but LATAM-specific rules not documented | ✓ | Partial |
| Argentina decree puentes (near real-time) Open-source update cadence varies | ✓ | Unclear |
| Live iCal subscription | ✓ Team+ | ✗ |
| Custom business calendars | ✓ Starter+ | ✗ |
| Webhook alerts for legislative changes | ✓ Business | ✗ |
| Authentication required Nager is open — no API key, no SLA | ✓ | ✗ |
| Uptime SLA Community-hosted, best effort | ✓ 99.9% Business | ✗ |
| Price | Free → $9/mo | Free |
| LATAM countries Coverage overlaps, accuracy differs | 11 | 11+ |
When to choose each
- ✓ You need to calculate deadlines, delivery dates, or SLAs in business days
- ✓ You process payments or run scheduled jobs that must skip holidays
- ✓ You need to validate arbitrary dates — not just today
- ✓ You need the Chile irrenunciable flag for HR or payroll
- ✓ You need verified Ley Emiliani dates for Colombia
- ✓ You need real-time Argentina decree monitoring
- ✓ Your product needs an uptime SLA
- ✓ You're scaling and need predictable rate limits and support
- → You only need to display a list of holidays — no date arithmetic
- → You're prototyping and want zero setup (no API key required)
- → Your use case doesn't require checking arbitrary past or future dates
- → You need holiday data for countries outside Latin America
- → Budget is zero and basic accuracy is acceptable
Migrating from Nager.Date
The main changes are: add an Authorization header,
swap the parameter order in the URL, and update the response field names.
All endpoints you already use have a direct equivalent.
| In Nager.Date | In feriados.io | What changes |
|---|---|---|
| GET /api/v3/AvailableCountries | GET /v1/countries | Add Authorization header. |
| GET /api/v3/PublicHolidays /{year}/{countryCode} | GET /v1/{country}/holidays/{year} | Country moves before year in path. Response: data[].name (was localName). Adds irrenunciable field. |
| GET /api/v3/NextPublicHolidays /{countryCode} | GET /v1/{country}/next-holiday | Returns one holiday (the next one) instead of the full upcoming list. Adds days_until field. |
| GET /api/v3/IsTodayPublicHoliday /{countryCode} (HTTP 200 / 204, no JSON) | GET /v1/{country}/is-business-day ?date=YYYY-MM-DD | Works for any date. Returns JSON. Checks weekends + holidays. Adds is_business_day, day_of_week, holiday. |
| Not available | POST /v1/{country}/business-days/add ?fromDate=...&days=N | New. Add N business days to a date. |
| Not available | POST /v1/{country}/business-days/between ?fromDate=...&toDate=... | New. Count business days between two dates. |
| Not available | GET /v1/{country}/last-business-day ?date=YYYY-MM-DD | New. Last business day of the month. |
// Before (Nager.Date) — no auth needed
const res = await fetch(
"https://date.nager.at/api/v3/PublicHolidays/2026/CL"
);
const holidays = await res.json();
// holidays[0].date, holidays[0].localName, holidays[0].name
// After (feriados.io)
const res = await fetch(
"https://api.feriados.io/v1/CL/holidays/2026",
{ headers: { Authorization: `Bearer ${process.env.FERIADOS_API_KEY}` } }
);
const { data: holidays } = await res.json();
// holidays[0].date, holidays[0].name, holidays[0].irrenunciable Try feriados.io free
Free API key in 30 seconds. 1,000 requests/month with commercial use. Business day endpoints from $9/mo.
Also comparing: vs Calendarific · vs Holiday API →