Holiday API for Portugal
Holidays for all 308 Portuguese municipalities, with the official source for every date.
National, regional and municipal holidays, plus working-day calculations, in a REST API. Every date links to the publication that sets it.
Coverage
Every municipality covered. Verification at the official source is under way.
Every holiday states the tier of the source it rests on. The tier tells you what evidence we hold for a date, not whether the date is right: most municipalities are still at tier C, with a date from public sources, regularly checked against other sources, that we have not yet confirmed at an official source.
308 municipalities covered 55 verified at the official source verification in progress
Regional holidays of the Azores and Madeira are not in the data yet.
Resolution or notice published in the Diário da República, 2nd series, or in a municipal bulletin.
Published on the municipality's own domain.
Encyclopaedias or compiled lists, used as a provisional base. It never counts as verified and moves up a tier when we find the official source.
Example
Guimarães, 2026
The municipal holiday on 24 June, with the link to its source, the tier of that source and the date of the last verification.
Requestcurl
$ curl -G https://api.calendas.pt/v1/holidays \-H "Authorization: Bearer $CALENDAS_API_KEY" \-d year=2026 \-d municipality=guimaraes
Response200 · application/json
{ "data": { "year": 2026, "municipality": { "ine_code": "0308", "name": "Guimarães", "slug": "guimaraes", "district": "Braga", "region": null }, "holidays": [ { "date": "2026-01-01", "name": "Ano Novo", "name_en": "New Year's Day", "commemorates": null, "commemorates_en": null, "slug": "ano-novo", "scope": "national", "recurrence": "1 de janeiro", "recurrence_en": "1 January", "source_url": "https://diariodarepublica.pt/dr/legislacao-consolidada/lei/2009-34546475", "source_kind": "legislacao", "source_title": "Diário da República · Código do Trabalho (Lei n.º 7/2009), art. 234.º", "source_tier": "A", "verified_at": "2026-10-30", "evidence": { "confirmed_years": [], "recurrence_confirmed": false } }, …, { "date": "2026-06-24", "name": "Feriado municipal de Guimarães", "name_en": "Guimarães municipal holiday", "commemorates": "Batalha de São Mamede (1128)", "commemorates_en": null, "slug": "feriado-municipal-guimaraes", "scope": "municipal", "recurrence": "24 de junho", "recurrence_en": "24 June", "source_url": "https://www.visitguimaraes.travel/pages/1150/?geo_article_id=986", "source_kind": "pagina_institucional", "source_title": null, "source_tier": "B", "verified_at": "2026-11-01", "evidence": { "confirmed_years": [], "recurrence_confirmed": false } } ] }, "warnings": []}
2 of the 15 holidays of the year are shown; the full answer lists all of them. https://api.calendas.pt/v1/holidays?year=2026&municipality=guimaraes
Why it matters
A holiday is data. It needs an origin and a verification date.
Municipal holidays change.
A municipality can change its holiday by resolution. That is why every holiday of a municipality has the period in which it is in force, and a verification date.
Static lists do not say where they come from.
A copied spreadsheet does not show the source nor when it was confirmed. Here every date carries source_url, source_title, source_tier and verified_at.
A payroll mistake is expensive.
Work on a public holiday gives the right to extra pay or compensatory rest. A missing holiday, or one on the wrong date, ends up on the payslip.
Who it is for
For teams that build HR and payroll software.
HR and attendance
Leave planners, rosters and time tracking with the holidays of the municipality of each workplace.
Payroll and ERP
Business days, deadlines and premiums calculated on the right date, with the source that backs it.
International platforms
Teams in Portugal with the right local holidays, and holiday names in English too (name_en).