Peru Holiday API
Peru has 15 public holidays split into two legal categories: inamovibles (observed on their original date) and trasladables (shift to the following Monday). The API returns the actual celebration date — no DL 713 logic required.
Free plan includes commercial use · no credit card required
Why Peru's calendar can't be hardcoded
Decreto Legislativo 713 and D.S. 012-92-TR establish Peru's holiday transfer rules. Most holidays shift to the following Monday when they don't fall on Monday — but inamovibles stay on their original date regardless. The logic is non-trivial to implement correctly.
Inamovibles (Año Nuevo, Fiestas Patrias, Navidad, Viernes Santo, Día del Trabajo) are observed on their original date. Trasladables shift to the following Monday.
In 2026, Inmaculada Concepción (Dec 8) and Batalla de Ayacucho (Dec 9) both shift to Monday. To avoid colliding, D.S. 012-92-TR places them on consecutive days: Monday Dec 14 and Tuesday Dec 15.
In June 2026, Día del Campesino and San Pedro y San Pablo both shift to the same Monday (June 29). They count as one non-working day, not two — you still get 21 business days in June.
API response for Peru
The API returns the actual celebration date. October 8th is a regular business day in 2026 — Combate de Angamos shifted to October 12th.
{
"success": true,
"data": [
{
"date": "2026-12-14",
"name": "Inmaculada Concepción",
"original_date": "2026-12-08",
"shifted": true,
"inamovible": false,
"type": "national"
},
{
"date": "2026-12-15",
"name": "Batalla de Ayacucho",
"original_date": "2026-12-09",
"shifted": true,
"inamovible": false,
"type": "national"
},
{
"date": "2026-12-25",
"name": "Navidad",
"original_date": "2026-12-25",
"shifted": false,
"inamovible": true,
"type": "national"
}
],
"meta": { "country": "PE", "year": 2026, "total": 15 }
} {
"success": true,
"data": {
"date": "2026-10-08",
"is_business_day": true,
"day_of_week": "Thursday"
},
"meta": { "country": "PE" }
}
// Oct 8 is a regular business day — Combate de Angamos shifted to Oct 12 Endpoints for Peru
Replace :country with PE.
Free plan includes holidays, is-business-day, and next-holiday.
/v1/PE/holidays/:year Free All public holidays for Peru with actual celebration dates. Includes inamovible flag and original_date for shifted holidays.
"inamovible": true / false, "shifted": true / false /v1/PE/is-business-day?date=YYYY-MM-DD Free Check if a date is a business day in Peru. Returns true for original dates when the holiday has been shifted (e.g., Oct 8th in 2026).
"is_business_day": true (Oct 8) / false (Oct 12) /v1/PE/business-days/add?date=YYYY-MM-DD&days=N Starter Add N business days, skipping weekends and Peruvian holidays at their actual observed dates. December is especially tricky — 19 business days.
"result_date": "2026-12-18" /v1/PE/business-days/between?from=YYYY-MM-DD&to=YYYY-MM-DD Starter Count business days between two dates in Peru. April has 19 days (Jueves + Viernes Santo). December has 19 — three holidays in the last 2 weeks.
"business_days": 19 /v1/PE/last-business-day?date=YYYY-MM-DD Starter Last business day of the month. December 2026 is particularly tricky with holidays on Dec 14, 15, and 25.
"last_business_day": "2026-12-30" The October 8th trap
Combate de Angamos falls on October 8th — but Peru shifts it to the following Monday. In 2026 that's October 12th. Checking Oct 8th in your code will give you a false "business day" result.
const API = "https://api.feriados.io/v1";
const KEY = process.env.FERIADOS_API_KEY;
// ❌ Wrong: hardcoding original holiday dates
const wrongHolidays = [
"2026-10-08", // Combate de Angamos original — but observed Oct 12
"2026-11-01", // Todos los Santos original — but observed Nov 2
"2026-12-08", // Inmaculada original — but observed Dec 14
];
// ✅ Correct: the API handles DL 713 transfer rules
async function addBusinessDays(date, days) {
const res = await fetch(
`${API}/PE/business-days/add?date=${date}&days=${days}`,
{ headers: { Authorization: `Bearer ${KEY}` } }
);
const { data } = await res.json();
return data.result_date;
}
// Add 5 business days from Oct 7 — correctly skips Oct 12 (not Oct 8)
const result = await addBusinessDays("2026-10-07", 5);
// → "2026-10-15" (skipping the Monday Oct 12 holiday) Common use cases for Peru
December is the highest-risk month — three holidays in the last two weeks, with two of them on consecutive days due to the tie-breaking rule.
Payments scheduled for October 8th are correct — it's a regular business day. But October 12th will fail. The API gives you the right answer.
is-business-day Free December delivery estimates in Peru need to account for three holidays in the last two weeks, including two consecutive days (Dec 14–15).
business-days/add Starter Payroll in Peru needs actual worked days. April has 19 business days, December has 19 — not 22. The transfer rules make each year different.
business-days/between Starter Legal deadlines in Peru run in business days. The shifted dates under DL 713 mean your SLA counter needs the actual observed date — not the original.
business-days/between Starter Also available for 10 more LATAM countries
Same API, same endpoints — just swap the country code.
Ready for production
Free API key in 30 seconds. Free plan includes is-business-day for Peru with commercial use.
Starter plan from $9/mo for full operational logic.