API Partner-API · Version 1
Zulassungs-API: Anträge aus Ihrer Software über die KBA-Großkundenschnittstelle einreichen
Die Zulassungs-API ist eine REST-Schnittstelle, mit der Fuhrpark-, Händler- und Leasingsoftware Zulassungsanträge an die i-Kfz-Großkundenschnittstelle des KBA übergibt, ohne selbst XKfz-Nachrichten, Zertifikate oder das Postfach des KBA zu betreiben. Anträge werden per JSON geprüft und eingereicht; Statuswechsel und Bescheide kommen per signiertem Webhook zurück.
Was unterscheidet die Zulassungs-API von einer direkten GKS-Anbindung?
Eine direkte Anbindung an die Großkundenschnittstelle verlangt eine Registrierung als Großkunde, SOAP-Nachrichten im Standard XKfz, ein X.509-Zertifikat und einen eigenen Abruf des KBA-Postfachs. Die Zulassungs-API kapselt diese Teile hinter JSON-Endpunkten; Ihre Software spricht REST, der Softwarepartner spricht mit dem KBA.
| Thema | Direkte GKS-Anbindung | Zulassungs-API |
|---|---|---|
| Protokoll | SOAP, XML-Nachrichten im Standard XKfz (seit 02.09.2026 Version 6.0) | REST mit JSON, OpenAPI 3.1 |
| Zugang | Registrierung als Großkunde, X.509-Zertifikat | API-Schlüssel als Bearer-Token, vergeben von DCS |
| Rückmeldungen | Abruf aus dem KBA-Postfach, höchstens einmal pro Minute | Webhooks bei Statuswechsel und neuen Bescheiden |
| Test | Testumgebung des KBA nach der Registrierung | Sandbox mit eigener Datenbank, Ergebnisse simulierbar |
| Fehler | Quittungscodes in der Antwortnachricht | problem+json nach RFC 9457 mit request_id |
Wie kommt ein Partner von der Sandbox in den Live-Betrieb?
Jeder Zugang startet in der Sandbox: eigene Datenbank, kein Kontakt zum KBA, Schlüssel mit dem Präfix zo24_sbx_. Den Live-Schlüssel (zo24_live_) gibt es erst nach einem erfolgreichen Sandbox-Test; Sandbox-Vorgänge werden nach 30 Tagen automatisch gelöscht.
GET /v1/pingprüft Schlüssel und Zugang,GET /v1/feldregelnliefert die Pflichtfelder je Arbeitsgang.POST /v1/antraege/pruefenprüft Schema und Plausibilität, ohne das KBA zu kontaktieren.POST /v1/antraegereicht ein und verlangt einenIdempotency-Keymit 8 bis 128 Zeichen.POST /v1/sandbox/antraege/{id}/simulierenerzeugt in der Sandbox Ergebnisse, Bescheide und Webhooks.- Nach dem Test schalten wir den Live-Zugang frei; der Aufbau der Aufrufe bleibt gleich, nur Host und Schlüssel ändern sich.
# Antrag in der Sandbox einreichen # SANDBOX_URL erhalten Sie mit dem Zugang curl -X POST "$SANDBOX_URL/v1/antraege" \ -H "Authorization: Bearer zo24_sbx_…" \ -H "Idempotency-Key: fuhrpark-4711-neuzulassung" \ -H "Content-Type: application/json" \ --data @antrag.json # gleiche Anfrage mit gleichem Schlüssel wiederholt: # ursprüngliche Antwort + Kopfzeile Idempotent-Replayed: true
Eine Wiederholung mit gleichem Schlüssel und gleichem Inhalt liefert die ursprüngliche Antwort zurück. Bricht die Verbindung beim Einreichen ab, kann Ihr System also gefahrlos erneut senden, ohne einen zweiten Antrag beim KBA auszulösen.
Welche Endpunkte stellt die Zulassungs-API bereit?
Die API gliedert sich in fünf Bereiche: Zugang, Stammdaten, Anträge, Dokumente und Webhooks. Alle Pfade beginnen mit /v1; die vollständigen Schemas erhalten Partner zusammen mit dem Sandbox-Zugang.
| Methode | Pfad | Zweck |
|---|---|---|
| GET | /v1/ping | Schlüssel und Zugang prüfen |
| GET | /v1/feldregeln | Pflichtfeldregeln je Arbeitsgang |
| POST | /v1/antraege/pruefen | Schema und Plausibilität prüfen, ohne KBA |
| POST | /v1/antraege | Antrag einreichen, Idempotency-Key Pflicht |
| GET | /v1/antraege | Anträge auflisten |
| GET | /v1/antraege/{antrag_id} | Antrag abrufen |
| GET | /v1/antraege/{antrag_id}/status | Status aus der Datenbank, ohne erneute KBA-Abfrage |
| POST | /v1/antraege/{antrag_id}/stornieren | stornieren, solange das KBA den Antrag nicht empfangen hat |
| GET | /v1/antraege/{antrag_id}/dokumente | signierte Anhänge eines Antrags |
| GET | /v1/antraege/{antrag_id}/dokumente/{dokument_id}.pdf | Anhang als PDF |
| GET | /v1/antraege/{antrag_id}/bescheide | eingegangene Bescheide: Zulassungsbescheid, vorläufiger Nachweis, Gebührenbescheid, Abmeldung |
| GET | /v1/antraege/{antrag_id}/bescheide/{nachricht_id}.pdf | Bescheid als PDF |
| GET | /v1/webhooks | Webhooks auflisten |
| POST | /v1/webhooks | Webhook anlegen; das Geheimnis wird nur jetzt angezeigt |
| GET | /v1/webhooks/ereignisse | verfügbare Ereignisse |
| DELETE | /v1/webhooks/{webhook_id} | Webhook löschen |
| POST | /v1/webhooks/{webhook_id}/test | Testereignis senden |
| POST | /v1/sandbox/antraege/{id}/simulieren | nur Sandbox: Ergebnis eines Antrags simulieren |
Wie prüft Ihr System die Signatur eines Webhooks?
Jeder Webhook kommt als POST mit den Kopfzeilen Webhook-Id, Webhook-Timestamp (Unix-Sekunden) und Webhook-Signature: v1=<hex>. Die Signatur ist ein HMAC-SHA256 über <Webhook-Id>.<Webhook-Timestamp>.<Body> mit dem Geheimnis, das beim Anlegen des Webhooks einmal angezeigt wurde.
Ereignisse können mehrfach eintreffen: Entdoppeln Sie über Webhook-Id und verwerfen Sie Zeitstempel, die älter als 5 Minuten sind. Die Nutzlast enthält keine personenbezogenen Daten; Einzelheiten holt Ihr System über die verlinkten Endpunkte.
Ihr Endpunkt muss binnen 10 Sekunden mit einem 2xx-Status antworten; Weiterleitungen werden nicht verfolgt. Schlägt eine Zustellung fehl, wiederholen wir sie bis zu sechsmal in wachsenden Abständen von 30 Sekunden, 2 Minuten, 10 Minuten, 1 Stunde, 6 Stunden und 24 Stunden. Nach 50 fehlgeschlagenen Zustellungen in Folge wird der Webhook automatisch deaktiviert.
| Ereignis | Auslöser |
|---|---|
| antrag.status_geaendert | Status oder Quittungscode eines Antrags hat sich geändert |
| antrag.bescheid_eingegangen | neue Bescheide als PDF liegen vor |
# Python: Webhook-Signatur prüfen import hashlib import hmac import time def webhook_ist_echt(webhook_id, zeitstempel, signatur, body, geheimnis): # Zeitstempel in Unix-Sekunden, max. 5 Minuten alt if abs(time.time() - int(zeitstempel)) > 300: return False nachricht = f"{webhook_id}.{zeitstempel}.".encode() + body erwartet = "v1=" + hmac.new( geheimnis.encode(), nachricht, hashlib.sha256 ).hexdigest() return hmac.compare_digest(erwartet, signatur)
Welche Limits und Fehlerformate gelten für die Zulassungs-API?
Die Limits gelten je API-Schlüssel und werden pro Minute gezählt; wer sie überschreitet, erhält HTTP 429 mit der Kopfzeile Retry-After. Fehler kommen einheitlich als application/problem+json nach RFC 9457 und tragen eine request_id für Rückfragen.
- Anfragen allgemein
- 120 / min
- je Schlüssel
- Prüfen
- 30 / min
- POST /v1/antraege/pruefen
- Einreichen
- 6 / min
- POST /v1/antraege
- Idempotency-Key
- 8–128
- Zeichen, Pflicht beim Einreichen
Was kostet der Zugang zur Zulassungs-API?
Der API-Zugang kostet eine einmalige Einrichtungsgebühr und eine monatliche Gebühr. Beide berechnen wir individuell: die Einrichtung nach dem Umfang der Anbindung und der Zahl der Mandanten, die Monatsgebühr nach Betrieb, Betreuung und erwarteter Vorgangsmenge.
Amtliche Gebühren von Zulassungsbehörde und KBA stehen als eigene Rechnungsposition ohne Aufschlag daneben. Beträge nennen wir im Angebot; eine öffentliche B2B-Preisliste gibt es nicht. Für ein Angebot genügen Ihre Software, die gewünschten Vorgangsarten und die ungefähre Menge je Monat.
Häufige Fragen zur Zulassungs-API
Fallen für die API-Anbindung Gebühren an?
Ja. Für die Einrichtung berechnen wir eine einmalige Gebühr, für den laufenden Betrieb eine monatliche Gebühr. Beide richten sich nach Umfang der Anbindung und Vorgangsmenge und stehen in Ihrem Angebot; amtliche Gebühren kommen ohne Aufschlag hinzu.
Brauchen wir für die API eine eigene Registrierung beim KBA?
Nein. Die API-Zugänge vergibt DCS Digital Code Solutions; eingereicht wird über unseren registrierten Großkunden-Zugang. Ihr System braucht weder ein X.509-Zertifikat noch eine eigene Kennung beim KBA.
Wie handelt eine Partnersoftware für mehrere eigene Mandanten?
Partner-Zugänge geben mit der Kopfzeile X-Mandant-Id an, für welchen eigenen Mandanten ein Aufruf gilt. So bedient eine Plattform mehrere Betriebe über einen Schlüssel, und jeder Antrag bleibt dem richtigen Mandanten zugeordnet.
Gibt es eine maschinenlesbare Beschreibung der Schnittstelle?
Ja. Die Schnittstelle ist in OpenAPI 3.1 beschrieben. Diese Beschreibung und die technische Anleitung erhalten Partner zusammen mit ihrem Sandbox-Zugang; daraus lassen sich Clients für die gängigen Programmiersprachen erzeugen.
Kann ein eingereichter Antrag zurückgezogen werden?
Nur solange das KBA ihn noch nicht empfangen hat; dafür gibt es den Endpunkt zum Stornieren. Danach entscheidet die Zulassungsbehörde, und der Status kommt per Webhook zurück.
Sandbox-Zugang anfragen
Beschreiben Sie kurz Ihre Software und die Vorgänge, die Sie anbinden wollen – den Sandbox-Schlüssel vergeben wir nach Rücksprache, zusammen mit einem Angebot für Einrichtung und Monatsgebühr.
Stand der Angaben: · Quelle: Partner-API, Version 1.0.0
Wie planen Sie die Einführung Ihrer Anbindung?
Vereinbaren Sie die benötigten Datenflüsse und die Behandlung von Fehlern vor dem Produktivstart. Unser Umstiegsleitfaden behandelt den Umgang mit offenen Anträgen. Die Auswahlhilfe für Portal und API unterstützt die fachliche Abstimmung mit dem Betrieb.