API-Referenz
/api/v1/applications/{id}Antrag und Status abrufen
Verwenden Sie diesen Endpunkt für das Polling eines Antrags. Erforderlich ist applications:read.
Liefert Antragsstatus, Ergebnis und nächste Aktion.
Parameter
idpathPflichtÖffentliche Antrags-ID.
Beispiel:app_test_1a2b3c4d5e6f708192a3b4c5Responses
200Antragsobjekt mit aktuellem Status, Ergebnis und nächster Aktion.
401/403API-Schlüssel oder Scope applications:read ist ungültig.
404Antrag fehlt oder gehört zu einem anderen Konto beziehungsweise einer anderen Umgebung.
429Rate Limit erreicht. Retry-After beachten.
Response-Body
Content-Type: application/json. Die erfolgreiche Antwort enthält die nachfolgend beschriebenen Felder.
Response-Felder
| Feld | Typ | Angabe | Beschreibung |
|---|---|---|---|
id | string | Immer | Öffentliche Antrags-ID. |
object | string | Immer | Konstanter Wert vehicle_registration_application. |
environment | enum | Immer | test oder live. |
livemode | boolean | Immer | true bei Produktivanträgen. |
procedure | enum | Immer | Ausgeschriebener Vorgang. |
procedure_code | enum | Immer | AB, WG, WZ, NZ, TZ, UG oder HA. |
submission_mode | enum | Immer | company oder third_party. |
contract_partner_id | string | Optional | Beim Anlegen gebundener Vertragspartner. KOPA-Schlüssel und Stammdaten werden nicht ausgegeben. |
holder | object | Optional | Gespeicherte Halter-ID, Revision und Verifizierungsstatus. Fehlt bei AB ohne Halterreferenz. |
external_reference | string | Optional | Beim Anlegen übergebene Referenz. |
signature_profile | string | Optional | Beim Anlegen gebundenes Signaturprofil. Fehlt ohne Profilangabe. |
status | enum | Immer | Aktueller Antragsstatus. Dieses Feld für Programmlogik verwenden. |
status_details | object | Immer | Anzeigetext, Änderungszeitpunkt und gegebenenfalls Fehlerangaben. |
next_action | object | Optional | Nächste Clientaktion, beispielsweise Signatur oder Fehlerbehebung. |
signature | object | Immer | Signaturpflicht, Status und gegebenenfalls Signatur-URL. |
results | object | Immer | Aktuelle Entscheidung und alle bereits verfügbaren KBA-, Kennzeichen- und Behördenwerte. Optionale Unterfelder werden ausgelassen, solange kein Wert vorliegt. |
results.decision | enum | Immer | pending, approved, rejected oder manual_review. Zusammen mit status für Programmlogik verwenden. |
results.failure_code | string | Optional | Stabiler maschinenlesbarer Code eines fehlgeschlagenen Testereignisses. Kein KBA-Quittungscode. |
results.kba_application_number | string | Optional | Vom KBA vergebene Antragsnummer, sobald sie für den Antrag vorliegt. Nicht mit der öffentlichen id oder external_reference verwechseln. Ein erfolgreicher Testabschluss liefert eine simulierte Nummer mit Präfix KBA-TEST-. |
results.assigned_license_plate | string | Optional | Dem Antrag zugeordnetes Kennzeichen, sobald es als Ergebniswert vorliegt. |
results.authority_status | array | Optional | Alle freigebbaren Code-/Message-Paare der aktuellsten Behördenquittung. Das Feld ist kein Quittungsverlauf und kann auch bei status: failed fehlen. |
results.authority_status[].code | string | Bedingt | Fünfstelliger Quittungscode der Live-Behördenantwort. Führende Nullen bleiben erhalten. Ein erfolgreicher Testabschluss liefert 0000. |
results.authority_status[].message | string | Bedingt | Die diesem Code zugeordnete offizielle Message. Nicht für Programmlogik verwenden. |
documents | array | Immer | Metadaten bereitgestellter Dokumente. |
orders_url | string | Immer | URL der antragsgebundenen Zusatzbestellungen. |
fees | object | Optional | Aktuelle Gebührenrevision in Euro-Cent. |
tariff | object | Optional | Tarifinformationen. |
timestamps | object | Immer | Erstellungs-, Änderungs- und Statuszeitpunkt. |
warnings | array | Optional | Nicht blockierende Hinweise. |
{
"id": "app_live_7f3a92c41b6d8e2054fa1c09",
"object": "vehicle_registration_application",
"environment": "live",
"livemode": true,
"procedure": "new_registration",
"procedure_code": "NZ",
"submission_mode": "third_party",
"contract_partner_id": "cpt_live_0123456789abcdef01234567",
"holder": {
"id": "hld_live_7f3a92c41b6d8e2054fa1c09",
"revision": 1,
"verification_status": "verified"
},
"external_reference": "fleet-2026-0042",
"status": "succeeded",
"status_details": {
"label": "Abgeschlossen",
"updated_at": "2026-08-23T11:18:42+02:00"
},
"signature": {
"required": true,
"status": "completed"
},
"results": {
"decision": "approved",
"kba_application_number": "88888012345678901234",
"assigned_license_plate": "B DZ 1234"
},
"documents": [],
"orders_url": "/api/v1/applications/app_live_7f3a92c41b6d8e2054fa1c09/orders",
"timestamps": {
"created_at": "2026-08-23T10:42:18+02:00",
"updated_at": "2026-08-23T11:18:42+02:00",
"status_updated_at": "2026-08-23T11:18:42+02:00"
}
}KBA-Ergebnisse im Response
Der aktuelle KBA-Ergebnisstand steht vollständig unter results. results.decision ist immer vorhanden; kba_application_number, assigned_license_plate und authority_status erscheinen, sobald der jeweilige Wert vorliegt.
Die KBA-Antragsnummer ist nicht die öffentliche API-ID. Verwenden Sie id für API-Aufrufe, external_reference für Ihre eigene Zuordnung und results.kba_application_number als Referenz des KBA-Vorgangs.
Optionale Ergebnisfelder werden ohne Wert vollständig ausgelassen und nicht als null geliefert. Clients müssen daher jedes KBA-Unterfeld unabhängig auf Vorhandensein prüfen.
| Feld | Zeitpunkt | Bedeutung |
|---|---|---|
results.decision | Immer | Aktuelle Entscheidung: pending, approved, rejected oder manual_review. |
results.kba_application_number | Sobald vom KBA vergeben | Externe KBA-Antragsnummer; als opaken String speichern und unverändert anzeigen. |
results.assigned_license_plate | Sobald verfügbar | Dem Vorgang zugeordnetes Kennzeichen. |
results.authority_status | Bei freigebbarer Behördenquittung | Array aller Code-/Message-Paare der aktuellsten Quittung; kein Verlauf. |
results.failure_code | Nur bei fehlgeschlagenem Testereignis | Stabiler Simulationscode; kein KBA-Quittungscode. |
Die fachlichen Statuswerte
Das Feld status enthält den Stand des Zulassungsvorgangs. Werten Sie programmatisch nur dieses Feld aus; Anzeigetexte wie status_details.label können sich ändern.
| status | Bedeutung | Terminal | Ihre Reaktion |
|---|---|---|---|
preparing_signature | Der Signaturlink wird serverseitig vorbereitet. | Nein | Weiter pollen; next_action liefert wait_for_signature_link. |
awaiting_signature | Die Signatur der antragstellenden Person steht aus. | Nein | Signatur-URL aus next_action an die signierende Person übergeben. |
processing | Der Antrag ist signiert und wird verarbeitet, einschließlich der behördlichen Bearbeitung. | Nein | Weiter pollen. |
manual_review | Die Zulassungsstelle bearbeitet den Vorgang manuell. | Nein | Warten; kein Fehler und keine Aktion Ihrerseits. Der Vorgang wechselt später zu succeeded oder failed. |
succeeded | Die Zulassung wurde erteilt. | Ja | Dokumente, Gebühren und Bestellungen abrufen. |
failed | Der Antrag wurde fachlich abgelehnt oder ist fehlgeschlagen. | Ja | status_details.failure_reason und results.authority_status auswerten. |
Fachliche Ablehnung auswerten
Bei status: failed steht die aktuelle Entscheidung in results.decision: rejected. status_details.failure_reason ist der kuratierte, anzeigbare Grund. Die originale Behördenquittung steht, sofern freigebbar, in results.authority_status.
results.authority_status ist ein Array. Jeder Eintrag enthält genau einen fünfstelligen code und seine zugehörige message. Eine Behördenantwort kann mehrere solcher Paare enthalten. Werten Sie deshalb alle Einträge aus. Das gesamte Feld bleibt optional.
Bei fehlgeschlagenen Testanträgen enthält results.failure_code zusätzlich den beim Testereignis gesetzten stabilen Code. Dieses Feld ist von den behördlichen Code-/Message-Paaren getrennt.
{
"status": "failed",
"status_details": {
"label": "Fehlgeschlagen",
"failure_reason": "Der Antrag konnte nicht erfolgreich abgeschlossen werden."
},
"results": {
"decision": "rejected",
"authority_status": [
{
"code": "00764",
"message": "Die fachliche Prüfung der Zulassung ist fehlgeschlagen"
},
{
"code": "00301",
"message": "Die Angabe zur Versicherungsbestätigungsnummer fehlt"
}
]
}
}Mehrere Quittungscodes verarbeiten
- Codes als Strings speichern, damit führende Nullen erhalten bleiben.
- Das Array vollständig durchlaufen und Code sowie Message immer gemeinsam speichern.
- Unbekannte Paare nicht verwerfen. Zusammen mit application.id, timestamps.status_updated_at und X-Request-Id protokollieren.
- Für Programmlogik status und results.decision verwenden. Die einzelnen Messages und status_details.failure_reason sind Anzeigetexte und können sich sprachlich ändern.
const rejected = application.status === 'failed' &&
application.results.decision === 'rejected'
const authorityEntries = application.results.authority_status ?? []
if (rejected) {
for (const { code, message } of authorityEntries) {
handleAuthorityCode(code, message)
}
}Polling
Verwenden Sie ein wachsendes Intervall von einigen Sekunden bis zu mehreren Minuten. Bei 429 gibt Retry-After die Wartezeit vor.