🇵🇪 Perú · 15 public holidays · DL 713 transfer rules

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.

DL 713
Two legal categories

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.

Tie-breaking rule
December edge case

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.

Collision handling
Two holidays, one Monday

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.

GET /v1/PE/holidays/2026 (excerpt — December)
{
  "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 }
}
GET /v1/PE/is-business-day?date=2026-10-08
{
  "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.

GET /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
GET /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)
GET /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"
GET /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
GET /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.

Node.js · Free plan
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.

Also available for 10 more LATAM countries

Same API, same endpoints — just swap the country code.

🇨🇱 CL Chile 🇨🇴 CO Colombia 🇲🇽 MX México 🇦🇷 AR Argentina
🇺🇾 UY Uruguay
🇧🇴 BO Bolivia
🇪🇨 EC Ecuador
🇵🇾 PY Paraguay
🇨🇷 CR Costa Rica
🇵🇦 PA Panamá

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.