National + regional + fiestas patronales for all 8,132 Spanish municipios — as one clean JSON feed. Built for payroll, HR, and scheduling that needs to know: is this a working day in this specific town?
"is_holiday": true, "matches": [{ "name": "Día de la Hispanidad", "scope": "nacional" }], "next": { "date": "2026-12-06", "name": "Constitución española", "days_away": 146 }
Get a free key instantly — no signup form, no email required:
Prefer the terminal? curl -s -X POST https://festivos.dsl4.com/v1/signup
Then call the API:
curl -s "https://festivos.dsl4.com/v1/is-holiday?date=2026-05-15&municipio=28079" \ -H "X-API-Key: YOUR_KEY"
Or use the public demo key demo_key_festivos_2026 for evaluation (tight rate limit).
/v1/holidays?municipio=&year=Every holiday (national + regional + island + local) for a municipio in a given year.
/v1/is-holiday?date=&municipio=Is this exact date a holiday here? Returns matches + a local_coverage honesty flag.
/v1/next?municipio=&from=The next upcoming holiday for a municipio. Defaults from to today.
/v1/municipios?q=&ccaa=&province=Search the 8,000+ municipio registry by name or region to find an INE code.
/v1/ccaa · /v1/coverageReference data + the local-coverage honesty ledger. No API key required.
/v1/signupInstant free-tier API key. JSON response, no email required.
municipio accepts a 5-digit INE code (e.g. 28079) or an exact/prefix name match (e.g. San Cristóbal de La Laguna).
Pass your key as an X-API-Key header (preferred) or ?api_key= query param. All /v1/* endpoints require a key except /v1/ccaa, /v1/coverage, and POST /v1/signup.
Each tier has a daily request cap counted per key per UTC day. Every authenticated response tells you where you stand:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 99
Over the cap → 429 with Retry-After. Counter resets at midnight UTC. Invalid keys → 401.
Full spec: OpenAPI 3.1 · llms.txt for agent use
curl -s "https://festivos.dsl4.com/v1/is-holiday?date=2026-05-15&municipio=28079" \ -H "X-API-Key: YOUR_KEY"
const res = await fetch(
"https://festivos.dsl4.com/v1/is-holiday?date=2026-05-15&municipio=28079",
{ headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await res.json();
console.log(data.is_holiday); // trueimport requests
resp = requests.get(
"https://festivos.dsl4.com/v1/is-holiday",
params={"date": "2026-05-15", "municipio": "28079"},
headers={"X-API-Key": "YOUR_KEY"},
)
print(resp.json()["is_holiday"]) # Truecurl -s "https://festivos.dsl4.com/v1/next?municipio=35016" \ -H "X-API-Key: YOUR_KEY"
const res = await fetch("https://festivos.dsl4.com/v1/next?municipio=35016", {
headers: { "X-API-Key": "YOUR_KEY" },
});
const { next } = await res.json();
console.log(next.date, next.name);import requests
resp = requests.get(
"https://festivos.dsl4.com/v1/next",
params={"municipio": "35016"},
headers={"X-API-Key": "YOUR_KEY"},
)
nxt = resp.json()["next"]
print(nxt["date"], nxt["name"])curl -s "https://festivos.dsl4.com/v1/coverage"
const res = await fetch("https://festivos.dsl4.com/v1/coverage");
const data = await res.json();
console.log(data.pct_accounted); // 100import requests
resp = requests.get("https://festivos.dsl4.com/v1/coverage")
print(resp.json()["pct_accounted"]) # 100National + all 19 regional calendars are 100% complete. Local fiestas patronales are real data from official open-data portals and gazette sources — we do not claim full national local coverage. All 8,132 municipios are accounted for: ~7,700 carry real local-fiesta data, the rest are verified none-declared. /v1/holidays returns local_fiestas_declared: true/false/null so you can distinguish "has fiestas" from "verified none" from "unknown". See /v1/coverage for the live machine-readable version.
Already have a free key? Append ?client_reference_id=YOUR_KEY to the Payment Link to upgrade that same key.