Skip to content

Public holidays API

Everything on this site is also published as plain files you can fetch from any language, any spreadsheet, any agent. There is no key, no quota and no tracking. The files are static, cached at the edge, and rebuilt whenever the dataset changes.

Endpoints

PathWhat you get
/api/v1/countries.jsonEvery country and territory with ISO code, slug, weekend days and available years.
/api/v1/{cc}.jsonAll years for one country, with holidays and yearly working days totals. cc is the lower case ISO 3166 alpha 2 code, for example be.
/api/v1/{cc}/{year}.jsonOne country and one year: holidays, working days per month, long weekends and bridge days.
/api/v1/{cc}/{year}.icsiCalendar file, subscribe to it or import it into Google Calendar, Outlook or Apple Calendar.
/api/v1/{cc}/{year}.csvComma separated values: date, weekday, name, observed, estimated.
/{country-slug}/{year}.mdThe country page as Markdown, ideal for language models and note taking tools.
/llms.txtIndex of the site written for language models, with links to every dataset.

Example

curl https://openworkdays.com/api/v1/lu/2026.json
{
  "country": "Luxembourg",
  "code": "LU",
  "year": 2026,
  "scope": "national",
  "weekend": [
    5,
    6
  ],
  "weekend_days": [
    "Saturday",
    "Sunday"
  ],
  "summary": {
    "public_holidays": 11,
    "observed_days": 0,
    "holiday_dates": 11,
    "holidays_on_weekdays": 7,
    "holidays_on_weekends": 4,
    "working_days": 254,
    "weekend_days": 104,
    "calendar_days": 365
  },
  "holidays": [
    {
      "date": "2026-01-01",
      "name": "New Year's Day",
      "weekday": "Thursday"
    },
    {
      "date": "2026-04-06",
      "name": "Easter Monday",
      "weekday": "Monday"
    },
    {
      "date": "2026-05-01",
      "name": "Labor Day",
      "weekday": "Friday"
    },
    "..."
  ],
  "working_days_by_month": [
    {
      "month": 1,
      "name": "January",
      "calendar_days": 31,
      "weekend_days": 9,
      "holidays_on_weekdays": 1,
      "working_days": 21
    },
    {
      "month": 2,
      "name": "February",
      "calendar_days": 28,
      "weekend_days": 8,
      "holidays_on_weekdays": 0,
      "working_days": 20
    },
    "..."
  ],
  "long_weekends": [
    {
      "start": "2026-04-04",
      "end": "2026-04-06",
      "days": 3,
      "holidays": [
        "Easter Monday"
      ]
    },
    "..."
  ],
  "bridge_days": [
    {
      "take_off": "2026-01-02",
      "break_start": "2026-01-01",
      "break_end": "2026-01-04",
      "days": 4,
      "holidays": [
        "New Year's Day"
      ]
    },
    "..."
  ]
}

Fields

holidays[].date, name, weekday
ISO 8601 date, English name, and the weekday name. A date can appear twice when two holidays coincide.
holidays[].observed
Present and true when the entry is a substitute day off granted because the holiday fell on a weekend.
holidays[].estimated
Present and true when the date depends on a lunar or astronomical observation and has not been confirmed by the authorities. It can move by one day.
summary.working_days
Calendar days minus weekend days minus public holidays that fall on weekdays.
working_days_by_month[]
The same breakdown for each month.
long_weekends[] and bridge_days[]
Breaks of three or more consecutive days off involving a holiday, and single working days squeezed between days off.
working_weekend_days[]
Weekend dates that are official working days (China, Hungary, Latvia and a few others move weekend days to build longer breaks). They count as working days.
weekend
Weekday numbers that are weekend days, Monday being 0 and Sunday 6.
scope
national, or the region used when a country is represented by its main region (the United Kingdom uses England and Wales).

Working days in your own code

Fetch the year file, build a set of holiday dates, then count the days that are neither in the weekend list nor in that set. The site's own calculator does exactly this in about forty lines of JavaScript, which you can read at /static/calc.js.

const year = await fetch("https://openworkdays.com/api/v1/be/2026.json").then(r => r.json());
const holidays = new Set(year.holidays.map(h => h.date));
const weekend = new Set(year.weekend);
function isWorkingDay(d) {
  const iso = d.toISOString().slice(0, 10);
  const weekday = (d.getUTCDay() + 6) % 7;      // Monday = 0
  return !weekend.has(weekday) && !holidays.has(iso);
}

Terms

The data is published under Creative Commons Attribution 4.0. Use it in products, internal tools, models and research; keep a link to OpenWorkdays where the data is shown. Please cache responses on your side rather than fetching the same file thousands of times a day; the files change at most a few times a month.

Need something more: regional holidays, historical years, a signed SLA, custom feeds, or help integrating working day logic into your product? Write to hello@openworkdays.com.