If you’re building a product that operates in Latin America and need to know whether a given date is a business day, you have two options: maintain holiday lists for each country yourself, or use an API that does it for you.
This guide covers what you need to know to implement business day validation for LATAM countries, and where the complexity hides.
Why LATAM is harder than it looks
Most developers assume holiday calendars are simple: a list of fixed dates per year. In Latin America, that assumption breaks quickly.
Colombia moves 8 holidays to the following Monday every year (Ley Emiliani). The actual celebration date changes each year based on what day of the week the original date falls on. You can’t reuse last year’s list.
Argentina adds 2-4 extra “bridge holidays” per decree throughout the year, sometimes announced 2-3 weeks in advance. No one knows at the start of the year how many there will be.
Mexico has election-year considerations and some regional holidays that affect operations in specific states.
Brazil (not yet covered) has state-level holidays that vary significantly — São Paulo has different non-working days than Rio de Janeiro.
The point: a hardcoded list per country isn’t just inconvenient. For several countries, it’s architecturally wrong.
What you actually need
For most applications, the endpoints you’ll use are:
# Is this date a business day?
GET /v1/{country}/is-business-day?date=YYYY-MM-DD
# Add N business days to a date
GET /v1/{country}/business-days/add?date=YYYY-MM-DD&days=N
# Count business days between two dates
GET /v1/{country}/business-days/between?from=YYYY-MM-DD&to=YYYY-MM-DD
# Get all holidays for a year
GET /v1/{country}/holidays/{year}
# Next upcoming holiday
GET /v1/{country}/next-holiday
Country codes follow ISO 3166-1 alpha-2: CL (Chile), CO (Colombia), MX (Mexico), AR (Argentina), PE (Peru), UY (Uruguay), PY (Paraguay), BO (Bolivia), EC (Ecuador), CR (Costa Rica), PA (Panama).
Authentication
All endpoints require a Bearer token:
curl "https://api.feriados.io/v1/CL/is-business-day?date=2026-04-03" \
-H "Authorization: Bearer frd_your_api_key"
Response:
{
"success": true,
"data": {
"date": "2026-04-03",
"is_business_day": false,
"day_of_week": "Friday"
},
"meta": { "country": "CL", "total": 1 }
}
Code examples
Node.js
const API = "https://api.feriados.io/v1";
const HEADERS = { "Authorization": `Bearer ${process.env.FERIADOS_API_KEY}` };
// Check if today is a business day
async function isBusinessDay(country, date) {
const res = await fetch(
`${API}/${country}/is-business-day?date=${date}`,
{ headers: HEADERS }
);
const { data } = await res.json();
return data.is_business_day;
}
// Calculate delivery date (N business days from now)
async function getDeliveryDate(country, fromDate, businessDays) {
const res = await fetch(
`${API}/${country}/business-days/add?date=${fromDate}&days=${businessDays}`,
{ headers: HEADERS }
);
const { data } = await res.json();
return data.result_date;
}
// Usage
const today = new Date().toISOString().slice(0, 10);
const isWorkday = await isBusinessDay("CO", today);
const deliveryDate = await getDeliveryDate("MX", today, 5);
Python
import os
import requests
from datetime import date
API = "https://api.feriados.io/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['FERIADOS_API_KEY']}"}
def is_business_day(country: str, check_date: str) -> bool:
r = requests.get(
f"{API}/{country}/is-business-day",
params={"date": check_date},
headers=HEADERS
)
return r.json()["data"]["is_business_day"]
def add_business_days(country: str, start_date: str, days: int) -> str:
r = requests.get(
f"{API}/{country}/business-days/add",
params={"date": start_date, "days": days},
headers=HEADERS
)
return r.json()["data"]["result_date"]
# Usage
today = date.today().isoformat()
if not is_business_day("AR", today):
print("Today is a holiday in Argentina, skipping job")
Multi-country example
The same interface works across all 11 countries:
const countries = ["CL", "CO", "MX", "AR", "PE"];
// Check business day status for all countries at once
const results = await Promise.all(
countries.map(async (country) => {
const res = await fetch(
`${API}/${country}/is-business-day?date=${today}`,
{ headers: HEADERS }
);
const { data } = await res.json();
return { country, isBusinessDay: data.is_business_day };
})
);
// { country: 'CL', isBusinessDay: true }
// { country: 'CO', isBusinessDay: false } ← holiday in Colombia
// { country: 'MX', isBusinessDay: true }
// ...
Pricing
| Plan | Requests/month | Business day logic | Price |
|---|---|---|---|
| Free | 1,000 | Basic validation only (is-business-day, holidays, next-holiday) | $0 |
| Starter | 25,000 | Full (add, subtract, between, last) | $9/mo |
| Team | 100,000 | Full + iCal live feed | $19/mo |
| Business | Fair use | Full + legislative alerts & webhooks | $59/mo |
The Free plan includes commercial use. No credit card required.
Get your API key at feriados.io/register.
See also: Chile Holiday API → · Colombia Holiday API → · Mexico Holiday API → · Argentina Holiday API → · Peru Holiday API → · Why your app fails on holidays → · Full API documentation →