Dokumentation

API-Referenz

GET/api/v1/applications/{id}

Antrag und Status abrufen

Verwenden Sie diesen Endpunkt für das Polling eines Antrags. Erforderlich ist applications:read.

Beschreibung

Liefert Antragsstatus, Ergebnis und nächste Aktion.

Parameter

idpathPflicht

Öffentliche Antrags-ID.

Beispiel: app_test_1a2b3c4d5e6f708192a3b4c5

Responses

200

Antragsobjekt mit aktuellem Status, Ergebnis und nächster Aktion.

401/403

API-Schlüssel oder Scope applications:read ist ungültig.

404

Antrag fehlt oder gehört zu einem anderen Konto beziehungsweise einer anderen Umgebung.

429

Rate Limit erreicht. Retry-After beachten.

Response-Body

Content-Type: application/json. Die erfolgreiche Antwort enthält die nachfolgend beschriebenen Felder.

Response-Felder

FeldTypAngabeBeschreibung
idstringImmerÖffentliche Antrags-ID.
objectstringImmerKonstanter Wert vehicle_registration_application.
environmentenumImmertest oder live.
livemodebooleanImmertrue bei Produktivanträgen.
procedureenumImmerAusgeschriebener Vorgang.
procedure_codeenumImmerAB, WG, WZ, NZ, TZ, UG oder HA.
submission_modeenumImmercompany oder third_party.
contract_partner_idstringOptionalBeim Anlegen gebundener Vertragspartner. KOPA-Schlüssel und Stammdaten werden nicht ausgegeben.
holderobjectOptionalGespeicherte Halter-ID, Revision und Verifizierungsstatus. Fehlt bei AB ohne Halterreferenz.
external_referencestringOptionalBeim Anlegen übergebene Referenz.
signature_profilestringOptionalBeim Anlegen gebundenes Signaturprofil. Fehlt ohne Profilangabe.
statusenumImmerAktueller Antragsstatus. Dieses Feld für Programmlogik verwenden.
status_detailsobjectImmerAnzeigetext, Änderungszeitpunkt und gegebenenfalls Fehlerangaben.
next_actionobjectOptionalNächste Clientaktion, beispielsweise Signatur oder Fehlerbehebung.
signatureobjectImmerSignaturpflicht, Status und gegebenenfalls Signatur-URL.
resultsobjectImmerAktuelle Entscheidung und alle bereits verfügbaren KBA-, Kennzeichen- und Behördenwerte. Optionale Unterfelder werden ausgelassen, solange kein Wert vorliegt.
results.decisionenumImmerpending, approved, rejected oder manual_review. Zusammen mit status für Programmlogik verwenden.
results.failure_codestringOptionalStabiler maschinenlesbarer Code eines fehlgeschlagenen Testereignisses. Kein KBA-Quittungscode.
results.kba_application_numberstringOptionalVom 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_platestringOptionalDem Antrag zugeordnetes Kennzeichen, sobald es als Ergebniswert vorliegt.
results.authority_statusarrayOptionalAlle freigebbaren Code-/Message-Paare der aktuellsten Behördenquittung. Das Feld ist kein Quittungsverlauf und kann auch bei status: failed fehlen.
results.authority_status[].codestringBedingtFünfstelliger Quittungscode der Live-Behördenantwort. Führende Nullen bleiben erhalten. Ein erfolgreicher Testabschluss liefert 0000.
results.authority_status[].messagestringBedingtDie diesem Code zugeordnete offizielle Message. Nicht für Programmlogik verwenden.
documentsarrayImmerMetadaten bereitgestellter Dokumente.
orders_urlstringImmerURL der antragsgebundenen Zusatzbestellungen.
feesobjectOptionalAktuelle Gebührenrevision in Euro-Cent.
tariffobjectOptionalTarifinformationen.
timestampsobjectImmerErstellungs-, Änderungs- und Statuszeitpunkt.
warningsarrayOptionalNicht blockierende Hinweise.
200 Response-Beispieljson
{
  "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.

FeldZeitpunktBedeutung
results.decisionImmerAktuelle Entscheidung: pending, approved, rejected oder manual_review.
results.kba_application_numberSobald vom KBA vergebenExterne KBA-Antragsnummer; als opaken String speichern und unverändert anzeigen.
results.assigned_license_plateSobald verfügbarDem Vorgang zugeordnetes Kennzeichen.
results.authority_statusBei freigebbarer BehördenquittungArray aller Code-/Message-Paare der aktuellsten Quittung; kein Verlauf.
results.failure_codeNur bei fehlgeschlagenem TestereignisStabiler 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.

statusBedeutungTerminalIhre Reaktion
preparing_signatureDer Signaturlink wird serverseitig vorbereitet.NeinWeiter pollen; next_action liefert wait_for_signature_link.
awaiting_signatureDie Signatur der antragstellenden Person steht aus.NeinSignatur-URL aus next_action an die signierende Person übergeben.
processingDer Antrag ist signiert und wird verarbeitet, einschließlich der behördlichen Bearbeitung.NeinWeiter pollen.
manual_reviewDie Zulassungsstelle bearbeitet den Vorgang manuell.NeinWarten; kein Fehler und keine Aktion Ihrerseits. Der Vorgang wechselt später zu succeeded oder failed.
succeededDie Zulassung wurde erteilt.JaDokumente, Gebühren und Bestellungen abrufen.
failedDer Antrag wurde fachlich abgelehnt oder ist fehlgeschlagen.Jastatus_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.

Abgelehnter Antrag (Ausschnitt)json
{
  "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.
Robuste Auswertungjavascript
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.

HTTP-Status ist kein Antragsergebnis

Zum Öffnen eines Treffers Enter drücken.