Effective dates, validity and future values
Every value applies from a specific day. Here is how to query values for any date, spot upcoming changes and handle gaps.
Date or year
#You query table datasets for an effective date. The response contains the value that applies on that day. Without one, the current day in Germany applies. Datasets whose values always apply for a whole calendar year take a year instead of a date.
| Dataset | Parameter | Without it | History |
|---|---|---|---|
| Minimum wage and mini-job limit | datum | today | yes |
| Apprentice minimum pay | beginn | today | yes |
| Care minimum wage | datum | today | yes |
| Social security reference values | jahr | current year | yes |
| Social security contribution rates | datum | today | yes |
| Meal and accommodation values | jahr | current year | yes |
| Wage garnishment exemptions | datum | today | yes |
| Midi-job transition zone | datum | today | yes |
| Mini-job levies: flat-rate charges for employers | datum | today | yes |
| Artists' social security levy | jahr | current year | yes |
| Disability compensatory levy | jahr | current year | yes |
| Tax-free amounts and employee expense allowances | datum | today | yes |
| Domestic travel expenses | datum | today | yes |
| Tax-free premiums for Sunday, holiday and night work | datum | today | yes |
| Income tax: basic allowance and bracket thresholds | jahr | current year | yes |
An example: on December 31, 2026, the minimum wage is €13.9 per hour; on January 1, 2027 it is €14.6. Two requests, one day apart:
Calculators take their own inputs, for example the start of employment (Eintritt) and the date notice is received (Zugang). Which ones apply is listed in the reference for each dataset.
Validity in the response
#Every response from a table dataset states since when and until when the value applies, and what it is based on:
| Field | Meaning |
|---|---|
gueltig_ab | First day on which the value applies |
gueltig_bis | Last day on which the value applies. null means: applies until a new rule is promulgated |
rechtsgrundlage | Law, ordinance or official notice the value is based on |
quelle | Title and address of the source documenting the value |
stand | Day we last checked the dataset against the sources |
vorheriger_wert | Previous step, where the dataset provides one, for example for the minimum wage |
naechster_wert | Next promulgated step, otherwise null |
With naechster_wert you can spot an adopted change today and prepare your software for it.
Future and provisional values
#We add future values as soon as they are officially promulgated, meaning they appear in the Federal Law Gazette (Bundesgesetzblatt) or the Federal Gazette (Bundesanzeiger). We do not add draft bills or cabinet decisions. Until promulgation, the API explicitly says that a value is missing. It never guesses.
Value not set yet
For years without a promulgated value, the API responds with status 404 and the code kein_wert. The contribution ceilings (Rechengrößen) are currently available up to 2026. A request for 2027 gives:
Partly set
For the contribution rates (Beitragssätze), all components are promulgated through December 31, 2026. For later effective dates, the API returns the most recently adopted rates and sets vorlaeufig to true. Request for June 1, 2027:
Announced, but no value yet
Sometimes it is already certain that a value will change, but not yet by how much. Example: from January 1, 2027, the flat-rate health insurance contribution for a commercial mini-job (gewerblicher Minijob) follows the average additional contribution rate, which is not published until autumn. Until then, the component appears in the response with wert: null, status: "ausstehend" (pending) and the legal basis of the new rule, instead of silently being missing:
Values set yearly
Some values apply only for one calendar year, for example the rate of the artists' social security levy (Künstlersozialabgabe). For years after the most recent ordinance, the API responds with kein_wert, even though the old rate will probably continue to apply.
Before 2015
The tables go back to January 1, 2015, and the apprentice minimum pay (Mindestausbildungsvergütung) back to a training start of January 1, 2020. Earlier effective dates also result in kein_wert.
History since 2015
#Every table has a history with all steps since 2015. Querying the history counts as one normal request. It is useful for importing the values into your own database once, in full. Every row has an end date in gueltig_bis; only the currently applicable step has null.
With von and bis you only get the steps that apply within that period; for datasets built from components, adding bestandteil returns just one entry:
With format=csv you get the same history as a CSV file, see Responses and CSV.
Day boundaries and time zone
#All dates are calendar days without a time, in the format YYYY-MM-DD. "Today" means the current day in Germany (Europe/Berlin). A new value applies from 00:00 German time on its effective date. If your server runs in a different time zone, pass the date explicitly instead of relying on "today".
Calculators and their limits
#The calculators apply the statutory rule mechanically: notice periods under § 622 BGB, vacation under the Federal Vacation Act (Bundesurlaubsgesetz), maternity protection periods under § 3 MuSchG, public holidays under each state's public holiday act. They do not know about employment or collective agreements, or the specifics of an individual case. Where a calculation makes an assumption, it appears in the hinweise field.
The reference for each calculator describes which rule it applies and which cases it does not cover.
Caching values
#Most values change once or twice a year, usually on January 1 or July 1. You are allowed to cache responses, which saves requests. Two approaches work well:
- Daily cache: store responses per effective date and parameter set for one day. Simple, and accurate enough for most applications.
- Your own table: import the history once and pick up new steps by webhook. That way your software only makes a request when something actually changes.
The API sets Cache-Control: no-store so that caches on the network do not retain responses that carry your key. This does not affect caching inside your own application.
Something missing or unclear? Write to us and we will extend the docs.