Skip to content

Holiday calendar for Germany

On October 31, Hamburg has the day off and Cologne doesn't. On August 15, Munich does and Nuremberg doesn't. The holiday calendar knows every municipality and delivers public holidays, school holidays, working days and bridge days as a ready-made table for BI and data warehouses. Open data, no sign-up.

Why the federal state is not enough

One holiday, 348 exceptions

In Bavaria, Assumption Day is a public holiday only where Catholic residents outnumber Protestant ones. Since 2025 that applies in 1,708 of 2,056 municipalities.

On August 15, 2026, that meant 82.5% of Bavarians had the day off, not all of them. Anyone planning staff or delivery times with one calendar per state assumes a day off in Nuremberg, Erlangen and Fürth that people there spend at work.

Augsburg has one more holiday, its Peace Festival on August 8. And some municipalities gained or lost Assumption Day with a census: Baiersdorf had it until 2013, then not, and has had it again since 2025. The holiday calendar records these changes with validity periods, so analyses across several years stay correct.

MunicipalityTue, August 8Tue, August 15Tue, October 31
HamburgWorking daySummer holidaysWorking dayReformation Day
AugsburgPeace FestivalSummer holidaysAssumption DaySummer holidaysWorking dayAutumn holidays
MunichWorking daySummer holidaysAssumption DaySummer holidaysWorking dayAutumn holidays
NurembergWorking daySummer holidaysWorking daySummer holidaysWorking dayAutumn holidays
Three Tuesdays in 2028, from Hamburg to Augsburg. Dot: public holiday, light dot: school holidays

What's inside

The columns you would otherwise build yourself

Besides the holidays, the calendar contains what almost every BI project ends up needing.

  • School holidays

    All 16 states since the 2009/10 school year, as a column per day and as periods. Where dates are not set yet, the value is empty rather than wrong.

  • Working-day arithmetic

    Every working day has a running number. Three working days after an order is simply that number plus three, in any database and any BI tool.

  • Bridge days

    Flagged, with the number of consecutive days off that one day of leave gets you. The Friday after Ascension Day gets you four.

  • Comparable day last year

    The same weekday 364 days earlier. Easter, carnival and the days around Christmas follow their own dates, so year-on-year comparisons compare like with like.

  • Daylight saving time

    Days with 23 and 25 hours are flagged. Hourly values, from energy data for example, then add up to correct daily totals.

  • Share of the population

    The percentage of people in Germany or in a state who have a public holiday or school holidays on a given day, weighted by each municipality's population.

  • History since 2010

    Every legal change with its date: Women's Day in Berlin since 2019, Reformation Day in the north since 2018, plus the one-off holidays.

  • Open format

    Rules, municipality lists and school holidays are YAML and CSV on GitHub. Corrections and new countries come in as pull requests.

Connect

Three ways to the data

All files are public at data.trakora.com, with no sign-up and no key.

  1. 01

    Query directly

    DuckDB attaches the database by URL and loads only the parts a query needs. Each table can also be read on its own as a Parquet file.

    ATTACH 'https://data.trakora.com/holiday-calendar/v1/latest/holiday_calendar.duckdb' (READ_ONLY);
    
    SELECT date, holiday_name, school_holiday_name
    FROM holiday_calendar.region_day
    WHERE region_id = 'DE-02000000'  -- Hamburg
      AND year(date) = 2027
      AND (is_public_holiday OR is_school_holiday);
    SELECT date, calendar_profile_id, bridge_days_off
    FROM 'https://data.trakora.com/holiday-calendar/v1/latest/fact_calendar_day.parquet'
    WHERE is_bridge_day AND year(date) = 2027;
  2. 02

    Download once

    The complete current release, as one file with every table or each table separately as Parquet and CSV.

    All tables in one DuckDB fileholiday_calendar.duckdb · 5.5 MBDuckDB
    TableContentRowsParquetCSV
    dim_dateOne row per day with ISO week, Easter and comparable day9,496105 kB1.3 MB
    dim_countryThe countries with time zone and weekend12 kB0 kB
    dim_calendar_profileThe calendar profiles183 kB2 kB
    dim_holidayThe public and school holidays282 kB2 kB
    holiday_ruleThe rules behind them, with legal basis275 kB3 kB
    school_holiday_periodSchool holidays as periods, per state and school year1,9089 kB229 kB
    dim_regionEvery municipality with district, state, population and coordinates10,753321 kB1.7 MB
    bridge_region_profileWhich calendar profile a municipality has, and when10,77121 kB436 kB
    fact_calendar_dayOne day per calendar profile: holiday, school holidays, working day, bridge day, daylight saving170,928889 kB19.5 MB
    agg_population_dayShare of the population with a public holiday and with school holidays, nationwide and per state161,432122 kB6.1 MB
  3. 03

    Keep in sync

    For data pipelines: load everything once, then only the changes. Every release ships change files that mark each row as new, changed or deleted. The manifest describes all releases, the primary keys and every column.

    1. Read the manifest and pick every release after the last one you loaded
    2. Load their change files in order
    3. Replace or delete rows by primary key
    4. Store the number of the last release
    pip install duckdb
    curl -O https://raw.githubusercontent.com/Trakora/holiday-calendar/main/python/sync_duckdb.py
    python sync_duckdb.py holidays.duckdb

Rather have it built in?

We connect the holiday calendar to your data warehouse or BI tool and set up the updates.

Start a project

Sources and checks

Where the data comes from

The holidays follow the holiday laws of the German states. Municipalities, population and coordinates come from the municipality register of the Federal Statistical Office. The Bavarian statistics office publishes where Assumption Day applies only as a map. We derive the list from census data and check it for every census against the official number of municipalities with the holiday.

School holidays come from the holiday calendars of the Standing Conference of education ministers (KMK). For 2020 to 2022 they show the dates as originally decided. Short-notice changes the states made during the pandemic are not included.

Before every release, tests check known dates for individual municipalities, and all holidays are compared with an independent source. In Saxony and Thuringia, Corpus Christi applies only in some municipalities and parts of them. We are still verifying those lists and will only add them once they are backed by sources.

Rules, municipality lists and school holidays are open on GitHub, in a format that works for any country. Every change is checked there automatically before it goes into a release.

License: CC BY 4.0. When passing the data on, please credit: “Trakora Holiday Calendar, CC BY 4.0. Contains data from: Federal Statistical Office of Germany (Destatis), municipality register and Census 2022”.

A date is missing or wrong?

Corrections go through GitHub: as an issue with date, place and source, or directly as a pull request. A source is required, ideally a link to the law or the official announcement.

Report on GitHub

Questions

Questions about the holiday calendar

What does the holiday calendar cost?

Nothing. The data is licensed under CC BY 4.0 and public, with no sign-up and no key. Commercial use is fine, with attribution. If you want help building it in, you can hire us for that.

How current is the data?

A new release comes out whenever a holiday law changes, and at least once a year with the new municipality register. The version and date are in the manifest and at the top of this page.

What is a calendar profile?

A group of municipalities with the same holidays, for example the Bavarian municipalities with Assumption Day. The daily table has one row per profile and day instead of per municipality and day. That is about 170,000 rows instead of more than 100 million, and a mapping table links each municipality to its profile.

Which tools does it work with?

Anything that reads Parquet or CSV, which covers practically every data warehouse, BI tool and ETL tool. With DuckDB you can query the database directly by URL. For ongoing updates, the manifest describes primary keys and change files so that any pipeline can connect to them. Ready-made pipelines for the common platforms are on GitHub.

Which countries are included?

Germany so far, with school holidays from the 2009/10 to the 2028/29 school year. We are working on Austria and Switzerland right now, to cover all of DACH. The format is the same for every country. If you want to add a country, the guide is on GitHub.

Why is Corpus Christi missing for Saxony and Thuringia?

Because there it applies only in some municipalities, sometimes only in parts of them, and the lists are not yet fully backed by official sources. Until then they are better left out than included unchecked.

How do I report a missing or wrong date?

As an issue on GitHub, with the date, the municipality or state and a source. If you like, change the file yourself and open a pull request. Once checked, the change goes into the next release.