Zum Inhalt springen

Umgebungen und Versionen

Zwei Instanzen

WasProduktionTest-Instanz
APIhttps://api.kfz-api.dehttps://api.staging.kfz-api.de
Dashboardhttps://dashboard.kfz-api.dehttps://dashboard.staging.kfz-api.de
KBA-UmgebungProduktionTestumgebung
WirkungAnträge werden wirksamAnträge werden geprüft und quittiert, aber nicht wirksam
Vertrauensdienst (Nect)Produktionsumgebung; für juristische Personen (Business Sign) vorerst nicht freigegebenTestumgebung — die dort unterschriebenen Vollmachten sind nicht qualifiziert

Die beiden Instanzen sind getrennt: API-Benutzer, Webhooks, Vollmachtsvorgänge und Vorgänge der einen gibt es auf der anderen nicht. Legen Sie Zugänge und Webhooks auf beiden Instanzen getrennt an.

Die KBA-Testumgebung ist eine echte Umgebung des KBA. Sie prüft, ob sie das Fahrzeug kennt, und weist Anträge zu unbekannten Fahrzeugen ab. Womit sich dort üben lässt, steht unter Testumgebung und Testdaten.

Ob ein einzelner Zugang produktiv sendet, hängt am GKS-Zugang, nicht am Server: Ein Mandant kann mehrere Zugänge führen und wählt je Antrag über gksConfigurationId. Ein Zugang in der Testumgebung gerät nicht auf die Produktionsstrecke. Solange der Betreiber die Produktion für einen Mandanten nicht freigegeben hat, antwortet ein Antrag über einen produktiven Zugang mit 403 — ebenso POST /powerOfAttorneys auf der Produktionsinstanz, denn ein Vorgang bei Nect kostet dort Geld.

Versionen

WasVersionWo sie steht
API-Vertrag2.3.0im Pfad: /dropshipping-api/{clientId}/2.3.0/… und in /health als apiVersion
Webhook-Vertrag3.1.0Kopfzeile X-Webhook-Version jeder Zustellung
Produktversion beim KBAje Instanz eingestelltim Nachrichtenkopf jedes Antrags an das KBA; welche diese Instanz sendet, steht unten unter Diese Instanz

Produktversion und freigegebene Vorgangsarten

Welche Geschäftsvorfälle eine Instanz annimmt, hängt an der Produktversion, mit der sie beim KBA sendet:

ProduktversionFreigegeben
POWRdrive 1.xallein die Außerbetriebsetzung (AB) — Software-Abnahme des KBA vom 17.08.2026
POWRdrive 2.0.0alle sieben: AB, HA, UG, WG, WZ, NZ, TZ — vom KBA am 14.09.2026 eingetragen

API- und Webhook-Vertrag sind Konstanten dieser Software; die Produktversion ist es nicht. Sie wird je Instanz eingestellt, und Produktion und Test-Instanz können verschiedene Versionen führen. Diese Seite sagt deshalb nicht zu, mit welcher Version eine bestimmte Instanz sendet — das steht unter Diese Instanz am Ende der Seite, erzeugt aus der Einstellung der Instanz, die die Seite gerade ausliefert.

Einen Geschäftsvorfall außerhalb des Umfangs beantwortet eine Instanz mit 403 und der Begründung „… ist noch nicht freigegeben", bevor der Rumpf geprüft wird.

Kompatibilität zu kennzeichen.dev

Ein bestehender Client von kennzeichen.dev wechselt durch Umstellen des Hosts. Gleich geblieben sind:

  • der Pfadaufbau /dropshipping-api/{clientId}/2.3.0/… und HTTP Basic Authentication,
  • der Antrag der Außerbetriebsetzung POST /vehicleDeregistrations/deregistrations und seine Antwort { "order": { "id": … } },
  • das Fehlerformat { "error": … }, hier ergänzt um traceId,
  • der Webhook: Rumpf nach Webhooks 3.1.0, Kopfzeilen X-Signature, X-Webhook-Id, X-Webhook-Version, Wiederholung bei ausbleibender Bestätigung,
  • das Vokabular von status und derivedStatus im Ereignis, einschließlich messages[].type QUITTUNG.

Hinzugekommen sind — alles zusätzlich, ein bestehender Aufrufer merkt davon nichts:

  • die übrigen Geschäftsvorfälle: vehicleHolderChanges, vehicleTransfers, vehicleReRegistrations (zwei Endpunkte), vehicleRegistrations (zwei Endpunkte),
  • Vollmachtsvorgänge: POST /powerOfAttorneys, GET /powerOfAttorneys/{processId},
  • Auftragsliste und Vorgangsauskunft unter allen fünf Präfixen: GET …/orders, GET …/orders/{orderId},
  • für die Außerbetriebsetzung die optionalen Felder recycling, vehicleRegistrationCertificatePartII, vehicleRegistrationCertificateNumber und contractPartner,
  • GET /registrationOffices/{districtKey}/availability, GET /serviceStatus, GET /invoices,
  • Sammelgebührenbescheide und Nachrichten ohne Vorgang: GET /vehicleDeregistrations/feeNotices, GET /vehicleDeregistrations/unmatchedMessages samt Ereignissen,
  • im Webhook-Rumpf unter anderem businessTransaction, licensePlate, attemptOf, attempt, retryable, registrationData, registrationDocumentsReady, parties und files[].filename,
  • die Kopfzeile X-Event-Id an jeder Zustellung.

Die GKS-Zugänge /gksConfigurations (POST, PUT, DELETE und zwei GET auf …/overviews) werden vertragstreu bedient; über sie verwaltet ein Mandant seine eigenen KBA-Identitäten. Beschrieben sind sie unter Kfz-Steuer, Lieferung, Vertragspartner.

Nicht bedient werden die Kennzeichenreservierung (POST /licensePlateReservations/availabilityChecks, POST /licensePlateReservations/reservations antworten mit 501). Physische Bestellungen (POST /orders, POST /orders/emissionStickerOrders, POST /orders/reshippedOrders) werden an einen Schilderdienst weitergereicht, wenn einer hinterlegt ist; sonst antworten sie mit 501, und kommt die Weitergabe nicht zustande, mit 502.

400 kommt vor 501. Ein nicht bedienter Endpunkt prüft zuerst die Pflichtfelder des Rumpfs: Fehlt eines, antwortet er mit 400 und dem Hinweis, dass er mit vollständigem Rumpf ohnehin 501 gäbe. So lässt sich schon heute gegen ihn bauen. Ein 400 von dort ist also kein Zeichen dafür, dass der Vorgang angeboten wird.

Kopfzeilen jeder Antwort

Jede Antwort — API, /health, Dashboard und diese Dokumentation — trägt vier Kopfzeilen:

KopfzeileWert
X-Frame-OptionsDENY
Content-Security-Policyframe-ancestors 'none'
X-Content-Type-Optionsnosniff
Referrer-Policystrict-origin-when-cross-origin

Für eine Anbindung ändert sich damit nichts: Die Kopfzeilen betreffen den Browser, nicht den HTTP-Client. Wer das Dashboard in einen eigenen Rahmen (iframe) stellen wollte, kann das nicht mehr — das ist Absicht, denn ein gerahmtes Formular trägt die echte Herkunft mit und käme damit an der Herkunftsprüfung vorbei. Strict-Transport-Security setzt der Reverse Proxy vor der Anwendung, nicht die Anwendung selbst.

Betriebszustand

GET /health ist ohne Anmeldung erreichbar und antwortet immer mit 200. Es steht außerhalb des Kundenvertrags und hat deshalb keinen paths-Eintrag in spec/api.yaml: Der Pfad trägt weder das Präfix /dropshipping-api/ noch die Mandantennummer.

FeldBedeutung
statusok oder degraded. degraded steht, sobald einer dieser Punkte zutrifft: Die Anmeldung beim KBA ist gesperrt (gksLogin: gesperrt); Vorgänge stehen länger offen als vorgesehen (overdueOrders); Vollmachtsvorgänge liegen seit über zwei Tagen offen (stalledPowerOfAttorneys); Zertifikate von GKS-Zugängen brauchen Aufmerksamkeit (gksCertificates.needAttention über null); der Vertrauensdienst fehlt, ist nicht benutzbar oder läuft in einer anderen Umgebung als das KBA (trustService) — Letzteres nur, wenn die Instanz Vorgangsarten mit Vollmacht führt, also ab POWRdrive 2.0.0. returnChannel, signatureCertificate und trustServiceLegalPersons ändern status nicht
apiVersiondie Version des API-Vertrags, dieselbe wie im Pfad
gksLoginok oder gesperrt — siehe unten
trustServiceStand des Vertrauensdienstes (Nect): missing — nicht eingerichtet, Vollmachtsvorgänge gibt es auf dieser Instanz nicht; misconfigured — eingerichtet, aber nicht benutzbar (Einrichtung unvollständig oder widersprüchlich, etwa Nect Sign und Business Sign in verschiedenen Umgebungen, oder Stand nicht ermittelbar) — die Instanz läuft dann weiter, nur POST /powerOfAttorneys antwortet mit 503; test — Testumgebung des Dienstes; production — Produktionsumgebung. Passt die Umgebung des Dienstes nicht zu der des KBA oder ist er nicht benutzbar, steht status auf degraded
trustServiceLegalPersonsVollmachtsvorgänge für juristische Personen (Nect Business Sign): available; disabled — eingerichtet, in der Produktion aber noch nicht freigegeben; missing — nicht eingerichtet. Bei disabled und missing antwortet POST /powerOfAttorneys für eine Firma mit 409. Steht nur, wenn trustService test oder production ist; ändert status nicht
sepaMandateTemplateready oder missing — ob die Vorlage des SEPA-Mandats für Vollmachtsvorgänge mit bankAccount eingerichtet ist. Ändert status nicht
returnChannellastPollAt mit dem Zeitpunkt des letzten Abrufs oder never, dazu pollStatus: "fehler", wenn der letzte Abruf scheiterte
overdueOrdersAnzahl der Vorgänge, die länger offen stehen als vorgesehen
stalledPowerOfAttorneysAnzahl der Vollmachtsvorgänge, die seit über zwei Tagen offen sind, höchstens 200 — ab dieser Zahl bleibt das Feld bei 200 stehen
signatureCertificatevalidUntil des Signaturzertifikats der Instanz, dazu warning mit Klartext, wenn es abläuft oder zu lange läuft
gksCertificatestotal und needAttention über die Zertifikate der mandantenbezogenen GKS-Zugänge

status, apiVersion und gksLogin stehen immer. Die übrigen Felder fallen weg, wenn es nichts zu melden gibt: overdueOrders und stalledPowerOfAttorneys nur bei einer Zahl über null, trustService, trustServiceLegalPersons, sepaMandateTemplate, returnChannel, signatureCertificate und gksCertificates nur, wenn diese Instanz das Betreffende überhaupt führt. Fragen Sie die Felder deshalb mit einer Vorgabe ab, statt sie vorauszusetzen. Namen, Kennungen und Vorgangsnummern nennt /health nie — wer wissen will, wer betroffen ist, meldet sich an.

gksCertificates.needAttention zählt Zertifikate, die in den nächsten 60 Tagen ablaufen, bereits abgelaufen sind, länger als ein Jahr laufen — oder deren Datei fehlt bzw. sich nicht lesen lässt. Die X.509-Version prüft es nicht: Ein hinterlegtes v1-Zertifikat signiert weiter und fällt hier nicht auf.

/health belegt keinen Kontakt zum KBA: gksLogin: ok heißt nur, dass keine Anmeldesperre besteht. Störungen und Wartungen, die der Betrieb meldet, liefert angemeldet GET /serviceStatus — mit operational, den aktiven Meldungen (announcements) und den angekündigten (scheduled).

Diese Instanz

Produktversion im Nachrichtenkopf jedes Antrags an das KBA: POWRdrive 1.0.0. Freigegeben ist bisher die Außerbetriebsetzung. Die übrigen Geschäftsvorfälle kommen mit der Umstellung auf POWRdrive 2.0.0 dazu; das KBA hat diese Version am 14.09.2026 eingetragen.

Die Angabe gilt für die Instanz, die diese Seite ausliefert. Die jeweils andere Instanz kann eine andere Version führen — lesen Sie diesen Abschnitt dort erneut.