Antworten, Formate und CSV
Wie Antworten aufgebaut sind, wie Zahlen und Daten codiert sind und wie du Listen als CSV in Excel oder deine Datenbank bekommst.
JSON
#Alle Antworten kommen als JSON in UTF-8 mit dem Header Content-Type: application/json; charset=utf-8. Feldnamen sind deutsch, kleingeschrieben und mit Unterstrich, zum Beispiel mindestlohn_brutto_stunde. REST-API, SDK, CLI mit --format json und MCP (im Feld structuredContent) liefern dieselben Felder in derselben Form.
Ein Beispiel, die Feiertage in Hessen 2027 (die Liste ist hier auf zwei Einträge gekürzt):
Zahlen, Beträge und Daten
#| Art | Darstellung | Beispiel |
|---|---|---|
| Geldbeträge | Zahl in Euro mit Punkt als Dezimaltrenner, ohne Währungszeichen | 13.9 |
| Prozentsätze | Zahl in Prozent, nicht als Anteil | 14.6 steht für 14,6 Prozent |
| Daten | Zeichenkette im Format JJJJ-MM-TT | 2027-01-01 |
| Wahrheitswerte | true oder false | true |
| Kein Wert | null, wenn ein Feld für diesen Fall nicht zutrifft oder offen ist | null |
| Listen | JSON-Array, auch wenn es nur einen Eintrag hat | [] |
Rechne mit Geldbeträgen in deiner Software am besten in Cent oder mit Dezimaltypen, nicht mit Gleitkommazahlen. Die API liefert Beträge genau so, wie sie in der Rechtsquelle stehen.
Einheiten der Bestandteile
Datensätze aus Bestandteilen, etwa Minijob-Abgaben oder steuerfreie Beträge, nennen je Wert das Feld einheit:
| einheit | Bedeutung |
|---|---|
euro | Euro |
euro_stunde | Euro je Stunde |
euro_tag | Euro je Tag |
euro_monat | Euro im Monat |
euro_jahr | Euro im Jahr |
euro_km | Euro je Kilometer |
euro_uebernachtung | Euro je Übernachtung |
prozent | Prozent |
prozent_listenpreis | Prozent des Bruttolistenpreises |
tage | Tage |
anzahl | reine Anzahl ohne Einheit |
fahrten | Fahrten |
arbeitsplaetze | Arbeitsplätze |
km | Kilometer |
Felder in jeder Antwort
#| Feld | Bedeutung |
|---|---|
datensatz | Kennung des Datensatzes, zum Beispiel mindestlohn |
rechtsgrundlage | Norm, auf der Wert oder Berechnung beruht |
hinweise | Liste mit Einschränkungen und Annahmen, die du deinen Nutzern zeigen solltest |
datenstand | Datum und laufende Nummer der letzten Änderung im Änderungsprotokoll, die diesen Datensatz betrifft, zum Beispiel 2026-09-24.14 |
Tabellen-Datensätze liefern zusätzlich gueltig_ab, gueltig_bis, quelle und stand, siehe Gültigkeit in der Antwort. Alle Felder jedes Datensatzes stehen in der Referenz.
datenstand ist für Prüfer gedacht: Zwei Antworten mit demselben Datenstand beruhen auf demselben geprüften Bestand, unabhängig davon, wann du sie abgerufen hast. Die id führt direkt zum Eintrag im Änderungsprotokoll. Denselben Wert trägt auch der Header X-Datenstand und, bei CSV, nur dieser Header (CSV hat kein Feld dafür).
CSV
#Listen gibt es mit format=csv auch als CSV-Datei: jeden Verlauf, die Feiertage, die Feiertage an Arbeitstagen beim Arbeitstage-Rechner und die Bestandteile der Beitragssätze. Für einzelne Werte gibt es kein CSV, die API antwortet dann mit ungueltiger_parameter.
- Aufbau nach RFC 4180: erste Zeile mit Spaltennamen, Zeilenende CRLF, Felder mit Trennzeichen oder Anführungszeichen in Anführungszeichen.
- UTF-8 mit BOM, damit Excel Umlaute richtig anzeigt.
- Verschachtelte Felder werden zu eigenen Spalten: aus
quelle.titelwirdquelle_titel. - Der Dateiname kommt im Header
Content-Disposition, zum Beispiel feiertage.csv.
CSV in Excel
#Ein Excel mit deutschen Einstellungen erwartet Semikolons als Trennzeichen und Kommas in Dezimalzahlen. Mit trennzeichen=semikolon bekommst du genau das, und die Datei öffnet sich per Doppelklick richtig:
IMPORTDATA keinen Header mitschicken und damit keinen Schlüssel. Lade die CSV-Datei herunter und importiere sie, oder nutze Apps Script mit UrlFetchApp und dem Header Authorization.Header der Antwort
#| Header | Inhalt |
|---|---|
Content-Type | application/json oder text/csv, jeweils mit charset=utf-8 |
X-Kontingent-Limit | Abfragen im Monat laut Tarif, bei jeder Antwort mit Schlüssel |
X-Kontingent-Verbraucht | Verbrauchte Abfragen im laufenden Monat, einschließlich dieser |
X-Datenstand | derselbe Wert wie das Feld datenstand, auch bei CSV |
Cache-Control | bei Datensatz-Antworten private, max-age=…, must-revalidate bis zur nächsten Mitternacht deutscher Zeit, siehe Abfragen sparen; sonst no-store |
ETag | aus Datenstand und Anfrage, für If-None-Match, siehe Abfragen sparen |
Access-Control-Allow-Origin | *, Aufrufe aus dem Browser sind technisch möglich, siehe REST-API |
WWW-Authenticate | nur bei Status 401 |
Komplettexport und Offline-Daten
#GET https://api.quellenkontor.dev/v1/export liefert den gesamten Tabellenbestand auf einmal: für jeden Datensatz mit Verlauf (15 von 23) den vollständigen Verlauf als JSON, dazu einen Link auf die CSV-Datei des Datensatzes. Praktisch für einen ersten Import in eine eigene Datenbank oder ein Backup. Reine Rechner ohne Tabelle, etwa Kündigungsfrist oder Dienstwagen, gehören nicht dazu, sie haben keinen Verlauf zum Exportieren.
Der Export braucht einen Schlüssel und zählt als eine einzelne Abfrage, unabhängig davon, wie viele Datensätze er enthält.
Offline-Stand in JavaScript- und Python-SDK
Beide SDKs bringen denselben Verlauf, den auch /export liefert, fest im Paket mit. Ist die API nach allen Wiederholungen nicht erreichbar, rechnet das SDK die passende Stufe für den angefragten Stichtag selbst aus dem mitgelieferten Stand aus, statt einen Fehler zu werfen. Die Antwort trägt dann offline: true und den datenstand des Pakets, nicht den der gerade amtlichen Quelle, und es fehlen die berechneten Zusatzfelder wie zitat, vorheriger_wert oder naechster_wert. Reine Rechner ohne Verlauf bleiben ohne Verbindung ein Netzwerkfehler, für sie gibt es keinen Offline-Stand. Details und die Option zum Abschalten stehen unter SDK JavaScript und SDK Python.
Fehlt etwas oder ist etwas unklar? Schreib uns, wir ergänzen die Doku.