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.
| Municipality | Tue, August 8 | Tue, August 15 | Tue, October 31 |
|---|---|---|---|
| Hamburg | Working daySummer holidays | Working day | Reformation Day |
| Augsburg | Peace FestivalSummer holidays | Assumption DaySummer holidays | Working dayAutumn holidays |
| Munich | Working daySummer holidays | Assumption DaySummer holidays | Working dayAutumn holidays |
| Nuremberg | Working daySummer holidays | Working daySummer holidays | Working dayAutumn 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.
- 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; - 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 MBDuckDBTable Content Rows Parquet CSV dim_date One row per day with ISO week, Easter and comparable day 9,496 105 kB 1.3 MB dim_country The countries with time zone and weekend 1 2 kB 0 kB dim_calendar_profile The calendar profiles 18 3 kB 2 kB dim_holiday The public and school holidays 28 2 kB 2 kB holiday_rule The rules behind them, with legal basis 27 5 kB 3 kB school_holiday_period School holidays as periods, per state and school year 1,908 9 kB 229 kB dim_region Every municipality with district, state, population and coordinates 10,753 321 kB 1.7 MB bridge_region_profile Which calendar profile a municipality has, and when 10,771 21 kB 436 kB fact_calendar_day One day per calendar profile: holiday, school holidays, working day, bridge day, daylight saving 170,928 889 kB 19.5 MB agg_population_day Share of the population with a public holiday and with school holidays, nationwide and per state 161,432 122 kB 6.1 MB - 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.
- Read the manifest and pick every release after the last one you loaded
- Load their change files in order
- Replace or delete rows by primary key
- 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.
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.
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.