Public holiday API and dataset
Everything on this site is also a JSON file. National public holidays for 44 countries across 2025, 2026 and 2027, generated at build time from the same code that renders the pages, so the API and the tables cannot disagree. No key, no rate limit, no account. CC BY 4.0.
Try it
curl https://holidaygrid.net/data/singapore/2027.jsonResponse
{
"meta": { "datasetVersion": "1.0.0", "license": "https://creativecommons.org/licenses/by/4.0/", ... },
"country": { "countryCode": "SG", "slug": "singapore", "dateFormat": "D MMMM YYYY", ... },
"year": 2027,
"status": { "status": "gazetted", "authority": "the Ministry of Manpower", "publishedOn": "2026-06-18", ... },
"counts": { "holidays": 11, "onWeekends": 3, "movedToAnotherDay": 1, ... },
"holidays": [
{ "date": "2027-01-01", "name": "New Year's Day", "weekday": "Friday",
"movingRule": "fixed", "scope": "national" },
...
]
}Endpoints
| URL | Returns |
|---|---|
| /data/schema.json | Field-by-field description of everything below. |
| /data/countries.json | All 44 countries, with holiday counts per year. |
| /data/holidays.json | Every country and every covered year in one file. |
| /data/{country}.json | One country, all covered years. For example /data/netherlands.json. |
| /data/{country}/{year}.json | One country and year, with long weekends, bridge days and working days. For example /data/australia/2026.json. |
| /data/year/{year}.json | One year across every country. For example /data/year/2026.json. |
| /corrections.json | Every correction applied to the source dataset, with its legal source. |
The one thing to know before you use it
A holiday that falls on a weekend and is made up on another day is one object, not two. Its date is the nominal calendar date and its observedDate is the day people are actually off. If you want the day off, take observedDate ?? date. If you want the calendar date, take date. Counting both is how holiday totals end up higher than the government's own, and it is the single most common bug in this category.
Status, and why a year can be provisional
Every country and year carries a status. gazetted means an authority published that exact year and the object names it, with the publication date. statutory means the calendar is set in standing law and needs no annual announcement. computedmeans the year is past the point that country's authority has settled, so the dates come from the rules currently in force. Treat computed as a planning estimate. It is the honest label, not a disclaimer.
Licence and attribution
The dataset is published under CC BY 4.0. Use it commercially, redistribute it, build on it. Attribution is the only condition, and a link to holidaygrid.net satisfies it. The upstream dataset it builds on, date-holidays, is ISC and CC BY 3.0, which CC BY 4.0 is compatible with.
Suggested citation: HolidayGrid, National public holidays dataset v1.0.0, holidaygrid.net/data, CC BY 4.0
Practical notes
Access-Control-Allow-Origin: *on every file, so it works from a browser.- Every date field is ISO 8601. Localised date strings never appear in the JSON.
- Files are static and served from a CDN. There is no rate limit because there is nothing to rate limit, but please cache rather than polling.
- The set of years rolls forward with the calendar. Read
meta.generatedAtandyearsrather than hardcoding. - Prefer a calendar subscription over polling this API for a single country: the
.icsfeeds update themselves.
Found something wrong?
Genuine errors get fixed and the fix gets published in the corrections log with its source. Tell us. If the error is in the upstream dataset rather than in our layer, we report it there too.