Zum Inhalt springen

Kfz-Steuer, Lieferung, Vertragspartner

Drei Angaben, die alle Zulassungsvorgänge teilen: wie die Kfz-Steuer eingezogen wird, wohin die Unterlagen gehen und unter wessen Registrierung der Antrag läuft.

Kfz-Steuer

Jeder Zulassungsvorgang (Umschreibung, beide Wiederzulassungen, Neu- und Tageszulassung) braucht einen Einzugsweg für die Kfz-Steuer. Fehlt er, antwortet die Schnittstelle mit 400. Zwei Wege gibt es:

Bankverbindung mit SEPA-Mandat

Ausschnitt
{
  "bankAccount": { "iban": "DE02200505501015871393", "accountHolder": "Erika Musterfrau" },
  "sepaMandateBase64": "JVBERi0xLjcKJSVFT0YK",
  "taxDetails": { "paymentInterval": "jaehrlich" }
}
  • bankAccount.iban — Pflicht, Form nach ISO 13616 (zwei Buchstaben, zwei Prüfziffern, bis zu 30 Stellen); Leerzeichen werden entfernt.
  • bankAccount.accountHolder — Pflicht. Das Mandat darf nur der künftige Halter erteilen; ob Halter und Kontoinhaber übereinstimmen, prüft das KBA (beim Mandat im Vollmachtsvorgang schon die Schnittstelle, siehe unten).
  • bankAccount.usage — optional Steuer (Vorgabe) oder Gebuehren.
  • bankAccount.directDebitMandateGranted — optional; nur ein ausdrückliches false nimmt die Einzugsermächtigung zurück.
  • sepaMandateBase64Pflicht zur Bankverbindung: das unterschriebene Mandat als PDF, ein Scan ist zulässig. Ohne es antwortet die Schnittstelle mit 400 — außer im folgenden Fall.

SEPA-Mandat im Vollmachtsvorgang

Wer den Halter über Nect unterschreiben lässt, braucht kein eigenes Mandat-PDF: Nennen Sie bankAccount schon beim Anlegen des Vollmachtsvorgangs. Die Schnittstelle befüllt dann das SEPA-Lastschriftmandat der Generalzolldirektion und lässt es im selben Vorgang mit unterschreiben. Der Antrag mit powerOfAttorney.processId und bankAccount (dieselbe IBAN, derselbe Kontoinhaber) kommt ohne sepaMandateBase64 aus; die Schnittstelle hängt das signierte Mandat als Dokumentart 44 an. Nur für natürliche Personen — Einzelheiten und Fehlerfälle unter SEPA-Mandat im Vorgang.

Großkunden-ID der Steuer

Ausschnitt
{ "taxDetails": { "paymentInterval": "vierteljaehrlich", "taxLargeCustomerId": "123A4567" } }

Die Großkunden-ID ersetzt Bankverbindung und SEPA-Mandat. Sie hat die Form der Zollverwaltung: drei Ziffern, ein Großbuchstabe, vier Ziffern. Ältere Formen mit sieben oder acht Ziffern weist das KBA seit XKfz 6.0 ab — die Schnittstelle sagt es vorher mit 400.

Zahlweise

taxDetails.paymentInterval ist Pflicht, sobald taxDetails mitgeschickt wird: jaehrlich, halbjaehrlich oder vierteljaehrlich.

Steuerbefreiung

Ausschnitt
{
  "taxDetails": {
    "paymentInterval": "jaehrlich",
    "taxLargeCustomerId": "123A4567",
    "taxExemptionRequested": true,
    "taxExemptionReason": "18"
  }
}
  • taxExemptionRequested — Befreiung von der Kfz-Steuer beantragen.
  • taxExemptionReason — der Grund, höchstens 10 Zeichen, sonst 400. Er wird unverändert durchgereicht und nicht gegen eine Liste geprüft; im amtlichen Beispiel steht 18.

Auch mit Steuerbefreiung verlangt die Schnittstelle einen Einzugsweg und die Zahlweise.

Lieferung von Unterlagen

deliveries beschreibt, wie Zulassungsbescheinigungen und Plaketten zugestellt oder abgeholt werden — höchstens zwei Einträge je Antrag.

FeldRegel
deliveryServicePflicht: ZusendungHalter, ZusendungBevollmaechtigter, ZusendungDritter, Abholung, AbholungHalter oder AbholungBevollmaechtigter
itemsPflicht, mindestens ein Eintrag
items[].documentTypePflicht: 2 ZB I, 3 ZB II, 27 HU-Plakette, 37 Siegelplakette, 39 HU-Plakettenträger, 40 Stempelplakettenträger, 42 Beiblatt zur ZB I (44 als älterer Code des Stempelplakettenträgers wird angenommen)
items[].quantityganze Zahl ab 1
deliverTooptional: HOLDER, REPRESENTATIVE oder RECIPIENT — wessen Anschrift gilt; siehe Wer die Unterlagen bekommt
orderedAtoptional, Datum JJJJ-MM-TT

Zwei weitere Schalter am Antrag:

  • requestRegistrationData: true fordert die Daten der Zulassungsbescheinigungen an. Sie kommen nach dem Bescheid als registrationData in Ereignis und Auskunft; ohne den Schalter kommt nur der Bescheid als PDF. Diese Anforderung zählt nicht zu den zwei Lieferungen. Bei einem Antrag für Dritte muss die Vollmacht die erweiterte Datenbereitstellung erlauben: beim Vollmachtsvorgang extendedDataProvision: true, bei einer eigenen PDF das angekreuzte Feld „erweiterte Datenbereitstellung“. Fehlt das Kreuz, antwortet der Antrag mit 400, bevor etwas an das KBA geht. Ausgenommen ist nur eine eigene PDF ohne Formularfelder: Sie kann die Schnittstelle nicht lesen (siehe eigene PDF).
  • orderEmissionSticker: true bestellt die Feinstaubplakette mit.

Die Halteränderung kennt deliveries nicht — ein mitgeschicktes Feld übergeht sie ohne Meldung. Dort steuert allein customization.deliveryToHolder die Zustellung der neuen ZB I, siehe Halteränderung.

Wer die Unterlagen bekommt

Diese Regel gilt für alle Zulassungsvorgänge. Nach ihr baut die Schnittstelle die Lieferadresse der Nachricht an das KBA, und gegen sie gleicht sie eine Vollmacht ab.

  1. Ohne deliveries schickt der Antrag keine Lieferinformation, und die Schnittstelle ergänzt keine. Das KBA stellt die Unterlagen dann dem Halter zu.
  2. deliverTo hat Vorrang: HOLDER ist der Halter, REPRESENTATIVE der Bevollmächtigte aus powerOfAttorney.representative, RECIPIENT der deliveryRecipient (Aufbau wie vehicleHolder) — auch wenn der deliveryService jemand anderen nennt.
  3. Ohne deliverTo benennt der deliveryService den Empfänger: ZusendungHalter und AbholungHalter den Halter, ZusendungBevollmaechtigter und AbholungBevollmaechtigter den Bevollmächtigten, ZusendungDritter den deliveryRecipient.
  4. Nur das schlichte Abholung benennt niemanden. Dann gilt der deliveryRecipient, sonst der Bevollmächtigte, sonst der Halter.

Ob zugestellt oder abgeholt wird, sagt immer der deliveryService. Fehlt die Person, auf die eine Lieferung zeigt — etwa deliverTo: REPRESENTATIVE oder ZusendungBevollmaechtigter ohne powerOfAttorney.representative, deliverTo: RECIPIENT oder ZusendungDritter ohne deliveryRecipient —, antwortet die Schnittstelle mit 400.

Vertragspartner und Kundennummer

Drei Rollen, die ein Mandant haben kann. Sie steht seit der Schemaversion 34 ausdrücklich am Mandanten und wird nur noch ersatzweise abgeleitet:

RolleWer ist GroßkundeIm AntragKOPA-VP
Eigener Mandant des Betreibers (betreiber)Sie — auch für diesen Mandantencustomization.contractPartner nur, wenn er wirklich für einen Dritten stelltkeine; der Großkunde bekommt vom KBA keine
Eigene KBA-Registrierung (eigene)der Kunde selbstgksConfigurationId seines Zugangskeine
Vertragspartner (vertragspartner)Siecustomization.contractPartner mit seiner KOPA-VP — in der Produktion Pflichtvom KBA vergeben, am Mandanten hinterlegt

Ohne gesetzte Rolle gilt die bisherige Ableitung: Wer eine freigegebene KoPa-Kennung oder einen eigenen GKS-Zugang hat, zählt als eigene Registrierung, sonst als Vertragspartner. Bestandsmandanten laufen dadurch unverändert weiter — die Ableitung kennt betreiber aber nicht und macht den Großkunden deshalb zum Vertragspartner seiner selbst. Wer die Rolle setzt, behebt das.

In der Produktion sendet unter unserer Registrierung nur, wer beim KBA gemeldet ist. Ein Mandant ohne eigenen GKS-Zugang schickt jeden Antrag unter Kennung, KoPa und Zertifikat des Betreibers. Die Schnittstelle nimmt ihn in der Produktion nur an, wenn am Mandanten die vom KBA vergebene KOPA-VP hinterlegt ist und der Antrag genau diese in customization.contractPartner nennt. Sonst antwortet sie mit 403, bevor ein Vorgang entsteht; an das KBA geht nichts. Das gilt für die Schnittstelle, das Antragsformular und den Stapel gleichermaßen.

Meldung beginnt mitWas fehlt
„Für diesen Mandanten ist keine KOPA-VP hinterlegt"Die Meldung als Vertragspartner beim KBA. Die KOPA-VP vergibt das KBA danach; hinterlegen kann sie nur der Betreiber.
„customization.contractPartner fehlt"Die Angabe im Antrag. Die Meldung nennt die KOPA-VP, die hineingehört.
„customization.contractPartner … passt nicht"Der Antrag nennt eine andere KOPA-VP als die des Mandanten, auch wenn sie auf seiner Vertragspartner-Liste steht.
„Für diesen Mandanten ist kein eigener GKS-Zugang hinterlegt"Bei eigener KBA-Registrierung (Rolle eigene) der eigene Zugang unter „GKS-Zugänge".

Nicht betroffen sind Mandanten mit eigenem GKS-Zugang und der Betreiber selbst: der erste Mandant, den die Einrichtung anlegt, und jeder Mandant mit der Rolle betreiber. Die Testumgebung bleibt offen. Die Produktionsfreigabe erteilt der Betreiber einem Vertragspartner erst, wenn dessen KOPA-VP am Mandanten steht.

Zuständigkeiten. Die Positivliste der Vertragspartner führt der Großkunde (KBA-Vermerk vom 12.12.2025, S. 2); die KOPA-VP vergibt das KBA nach der Prüfung der Meldung, nicht der Mandant. Deshalb:

  • Rolle und KOPA-VP eines Mandanten setzt nur der Betreiber — im Dashboard unter „Kunden". Es gibt dafür keinen Weg über die Schnittstelle.
  • Vertragspartner und Betriebsstätten anlegen, ändern (KOPA-VP nachtragen) und entfernen darf unter unserer Registrierung nur der Betreiber, auch in der Kundenansicht. Ein Mandant mit der Rolle vertragspartner oder betreiber sieht seine eigenen Einträge weiterhin; die Formulare stehen ihm nicht offen, und POST /vertragspartner, POST /vertragspartner/:id/kopa und POST /vertragspartner/:id/loeschen antworten ihm mit 403. Ein Vertragspartner, der selbst Vertragspartner anlegt, wäre ein Weiterverkauf des Großkundenzugangs — die Haftungserklärung (Nr. 15) verbietet ihn.
  • Rolle eigene: er pflegt selbst. Wer eine eigene KBA-Registrierung hat, ist selbst der Großkunde — seine Meldedatei trägt in der ersten Spalte SEINE KOPA, das KBA vergibt die KOPA-VP an ihn, und die Haftungserklärung Nr. 15 bindet nur den, der unter fremder Registrierung fährt. Für ihn bleiben die Formulare offen, und nichts wird gegenüber dem bisherigen Stand strenger.
  • Die Meldedatei unter der KOPA des Betreibers erzeugt ebenfalls nur er. Ein Mandant, der unter seiner eigenen KOPA meldet, lädt sie weiterhin selbst herunter.

Amtliche Gebühren (costBreakdown, feeAmountCents, paymentReference, Gebührenbescheide) sieht nur ein Mandant, der selbst beim KBA abrechnet: mit freigegebener KoPa-Kennung oder mit eigenem produktivem GKS-Zugang. Wer unter der Registrierung des Betreibers fährt oder nur einen Test-Zugang hat, bekommt diese Felder nicht. customization.contractPartner im Antrag ändert daran nichts.

  • customization.contractPartner geht als Referenz vom Typ 28 („Vertragspartnernummer") an das KBA — die KOPA-VP, die das KBA dem Vertragspartner nach seiner Meldung vergibt (Form U871450). Angenommen wird sie nur, wenn sie im Dashboard unter „Vertragspartner" für Ihren Mandanten eingetragen ist oder die KOPA-VP Ihres eigenen Mandanten ist; sonst antwortet die Schnittstelle mit 400, bevor der Antrag hinausgeht (unter unserer Registrierung in der Produktion mit 403, siehe oben). Randleerzeichen werden entfernt, Kleinbuchstaben großgeschrieben. Ob das KBA den Vertragspartner Ihrem Großkundenzugang zuordnet, prüft es weiterhin selbst — ein Widerruf dort fällt erst in der Quittung auf.
  • Fehlt contractPartner, wird nichts ergänzt — auch nicht, wenn für Ihren Mandanten genau ein Vertragspartner gemeldet ist oder er selbst einer ist. Der Antrag geht dann ohne Referenz 28 hinaus; das KBA nimmt ihn technisch an. Ein Vertragspartner unter unserer Registrierung bekommt in der Produktion stattdessen 403 (siehe oben). Ein stilles Ergänzen ordnete den Antrag einem Dritten zu, ohne dass der Aufrufer es wollte: Die Gebührenzuordnung im Sammelbescheid (CR-209), die Haftung und ein etwaiger Ausschluss hingen dann an einer Vermutung der Schnittstelle. Wer den Vertragspartner meint, nennt ihn.
  • customization.customerNumber geht als Referenz vom Typ 27 („Kundennummer des Großkunden") mit — etwa Ihre eigene Kundennummer für den Endkunden. Sie wird nicht gegen eine Liste geprüft.
  • contractPartner gibt es bei der Halteränderung, allen Zulassungsvorgängen und der Außerbetriebsetzung, customerNumber nicht bei der Außerbetriebsetzung.
  • gksConfigurationId wählt den GKS-Zugang, unter dessen Kennung und Signatur der Antrag hinausgeht. Ohne Angabe gilt der einzige Zugang des Mandanten bzw. die Grundkonfiguration der Instanz. Führt ein Mandant mehrere Zugänge, ist die Angabe Pflicht (400). Eine unbekannte oder fremde Id ergibt ebenfalls 400.

Die Liste befüllen — Schreibregeln des KBA

Vertragspartner und ihre Betriebsstätten meldet der Betreiber dem KBA als CSV-Datei. Dafür gelten die „Schreibkonventionen für Dateien zur Meldung von Vertragspartnern und deren Betriebsstätten" des KBA — nicht die Höchstlängen aus XKfz 6.0. Ein Eintrag, der sie verletzt, wird schon beim Speichern abgewiesen; beim Erzeugen der Meldedatei wird außerdem jede Zeile erneut geprüft, und ein Altbestand, der eine Regel verletzt, bricht die ganze Datei ab.

FeldRegel
Firmennamehöchstens 150 Zeichen
Straßehöchstens 40 Zeichen. „Straße" bzw. „straße" am Wortende wird zu „Str." bzw. „str."; die Länge wird erst danach geprüft
Hausnummernur Ziffern, höchstens vier
Adresszusatzhöchstens 21 Zeichen
Postleitzahlin Deutschland genau fünf Ziffern, sonst höchstens 10 Zeichen aus A–Z, 0–9, Bindestrich und Leerzeichen
Orthöchstens 40 Zeichen
Staatzweistelliger Ländercode, etwa DE
KOPA des VertragspartnersForm U871450: U, B oder S und sechs Ziffern

Für jedes Textfeld gilt derselbe Zeichenvorrat: ISO 8859-1 ohne Zeilenumbruch. Typografische Anführungszeichen, Gedankenstrich und fallen damit heraus. Semikolon und Anführungszeichen sind ausgeschlossen, weil die Meldedatei nicht maskiert wird; =, +, @ und - dürfen nicht am Anfang eines Feldes stehen, damit daraus in einer Tabellenkalkulation keine Formel wird. Einzige Ausnahme: Der Adresszusatz darf mit - beginnen — dort stehen die Von-bis-Angaben.

Was nicht in die Hausnummer passt, gehört in den Adresszusatz: Buchstaben und Von-bis-Angaben, etwa a oder -14, mehrere davon mit Komma ohne Leerzeichen (a,-14).

Eintragen, ändern und entfernen kann diese Liste nur der Betreiber (siehe oben). Eine Betriebsstätte lässt sich erst eintragen, wenn die KOPA-VP ihres Vertragspartners bekannt ist — die vergibt das KBA nach der VP-Meldung. Also erst den Vertragspartner melden, dann die Betriebsstätten nachreichen.

Vollständiges Beispiel

Eine Neuzulassung mit Steuerbefreiung, Zustellung an einen abweichenden Empfänger, Feinstaubplakette und Vertragspartner:

POST /vehicleRegistrations/registrations
{
  "externalOrderId": "neuzulassung-vp-4711",
  "email": "kunde@example.de",
  "customization": {
    "vehicleIdentificationNumber": "WVWZZZ7HZ8H666601",
    "licensePlateAssignment": { "plateType": "Z" },
    "vehicleRegistrationCertificatePartII": { "securityCode": "BgDwroY6tly4" },
    "insuranceConfirmationNumber": "R245654",
    "contractPartner": "U123456",
    "customerNumber": "KD-2026-0815"
  },
  "vehicleHolder": {
    "address": {
      "firstName": "Erika",
      "lastName": "Musterfrau",
      "streetName": "Große Straße",
      "houseNumber": "1",
      "zipCode": "24937",
      "cityName": "Flensburg"
    },
    "dateOfBirth": "1988-03-15"
  },
  "taxDetails": {
    "paymentInterval": "jaehrlich",
    "taxLargeCustomerId": "123A4567",
    "taxExemptionRequested": true,
    "taxExemptionReason": "18"
  },
  "deliveryRecipient": {
    "address": {
      "companyName": "Autohaus Beispiel GmbH",
      "streetName": "Am Markt",
      "houseNumber": "1",
      "zipCode": "74072",
      "cityName": "Heilbronn"
    },
    "occupationKey": "G01"
  },
  "deliveries": [
    {
      "deliveryService": "ZusendungDritter",
      "deliverTo": "RECIPIENT",
      "items": [
        { "documentType": "2", "quantity": 1 },
        { "documentType": "40", "quantity": 2 }
      ]
    }
  ],
  "orderEmissionSticker": true
}

Eine Lieferung an den Bevollmächtigten ohne Vollmacht:

POST /vehicleRegistrations/registrations 400
{
  "externalOrderId": "neuzulassung-vp-4712",
  "email": "kunde@example.de",
  "customization": {
    "vehicleIdentificationNumber": "WVWZZZ7HZ8H666602",
    "licensePlateAssignment": { "plateType": "Z" },
    "vehicleRegistrationCertificatePartII": { "securityCode": "BgDwroY6tly4" },
    "insuranceConfirmationNumber": "R245654"
  },
  "vehicleHolder": {
    "address": {
      "companyName": "Muster Logistik GmbH",
      "streetName": "Am Bahnhof",
      "houseNumber": "15",
      "zipCode": "24983",
      "cityName": "Handewitt"
    },
    "occupationKey": "H01"
  },
  "taxDetails": { "paymentInterval": "jaehrlich", "taxLargeCustomerId": "123A4567" },
  "deliveries": [
    { "deliveryService": "ZusendungBevollmaechtigter", "deliverTo": "REPRESENTATIVE", "items": [{ "documentType": "2", "quantity": 1 }] }
  ]
}
Antwort 400 POST /vehicleRegistrations/registrations
{
  "error": "Die Lieferung soll an den Bevollmächtigten gehen, es ist aber keiner benannt. (TraceId: 2c7e5a90-4b1d-4f38-9e6a-8d0b3f7c1a52)",
  "traceId": "2c7e5a90-4b1d-4f38-9e6a-8d0b3f7c1a52"
}

GKS-Zugänge anlegen und verwalten

Ein Mandant mit eigener KBA-Registrierung hinterlegt seine Zugänge selbst. Die id aus der Antwort ist der Wert, den er danach als gksConfigurationId in jedem Antrag mitgibt.

AufrufAntwort
POST /gksConfigurations201 mit der Kopfzeile Location auf den neuen Zugang und dem Zugang im Rumpf; 400 ohne Schlüsselmaterial; 403 bei environment: "produktion" ohne Freigabe des Mandanten
PUT /gksConfigurations/{id}200 mit dem geänderten Zugang; 404 bei unbekannter Id; 403 beim Wechsel auf produktion ohne Freigabe des Mandanten
DELETE /gksConfigurations/{id}204; 409, solange Vorgänge auf den Zugang verweisen
GET /gksConfigurations/overviews200 mit { "overviewGksConfigurations": [ … ] }
GET /gksConfigurations/overviews/{id}200 mit einem Zugang; 404 bei unbekannter Id

Pflicht beim Anlegen sind name, kopaKey, username, password — und Schlüsselmaterial als PEM-Paar aus publicKeyCertificate und privateKey. Ohne dieses Paar antwortet das Anlegen mit 400; die fehlende Hälfte wird nicht erzeugt.

Längen. name höchstens 100 Zeichen, username (die GKS-Kennung) 20, password 200, kopaKey und largeCustomerId je 20, environment 20, company 255, publicKeyCertificate und privateKey je 65 536. Darüber antwortet die Schnittstelle mit 400 und nennt das Feld.

environment (test oder produktion, Vorgabe test) entscheidet über die KBA-Endpunkte — ein Testzugang gerät nie auf die Produktionsstrecke. produktion nimmt die Schnittstelle nur an, wenn der Betreiber den Mandanten dafür freigegeben hat; sonst antwortet sie mit 403. Geprüft wird nur der Wechsel: Ein Zugang, der bereits auf produktion steht, bleibt änderbar, auch wenn die Freigabe später zurückgenommen wird.

company nimmt eine Zeichenkette oder ein Objekt mit name; übernommen wird nur der Name. Ist auf der Instanz kein Schlüssel zum Verschlüsseln der Zugangsdaten eingerichtet, antwortet das Anlegen mit 503 — und das Ändern ebenso, sobald es ein password mitführt. Ein PUT ohne password fasst die Verschlüsselung nicht an und geht durch.

Rumpf POST /gksConfigurations
{
  "name": "Zulassungsdienst Nord",
  "kopaKey": "U871450",
  "largeCustomerId": "1234567",
  "username": "gks-kennung-des-kunden",
  "password": "das-Passwort-der-GKS-Kennung",
  "publicKeyCertificate": "-----BEGIN CERTIFICATE-----\n…\n-----END CERTIFICATE-----\n",
  "privateKey": "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----\n",
  "environment": "test",
  "company": "Zulassungsdienst Nord GmbH"
}
Antwort 201 POST /gksConfigurations
{
  "id": "6f1c2a8e-3b7d-4c55-9a10-2f4e8b9d7c31",
  "name": "Zulassungsdienst Nord",
  "kopaKey": "U871450",
  "largeCustomerId": "1234567",
  "username": "gks-kennung-des-kunden",
  "environment": "test",
  "company": "Zulassungsdienst Nord GmbH",
  "createdAt": "2026-09-15T09:30:00Z",
  "certificatePresent": true,
  "privateKeyPresent": true
}

Gelesen wird über die Übersichten — im Umschlag overviewGksConfigurations, auch wenn nur ein Zugang darin steht:

Antwort 200 GET /gksConfigurations/overviews
{
  "overviewGksConfigurations": [
    {
      "id": "6f1c2a8e-3b7d-4c55-9a10-2f4e8b9d7c31",
      "name": "Zulassungsdienst Nord",
      "kopaKey": "U871450",
      "largeCustomerId": "1234567",
      "username": "gks-kennung-des-kunden",
      "environment": "test",
      "company": "Zulassungsdienst Nord GmbH",
      "createdAt": "2026-09-15T09:30:00Z",
      "certificatePresent": true,
      "privateKeyPresent": true
    }
  ]
}

Passwort und privater Schlüssel kommen nie zurück. Die Antworten führen nur die Übersicht. Beim PUT bleibt ein weggelassenes password unverändert — so lässt sich der Name korrigieren, ohne das Passwort erneut einzugeben.

Schlüsselmaterial und Zertifikatsform

publicKeyCertificate und privateKey gehören als PEM-Text zusammen in denselben Rumpf. Wird beim Anlegen nur eines von beiden geschickt, antwortet die Schnittstelle mit 400, statt die fehlende Hälfte zu erzeugen: Ein Schlüssel, der nicht zum Zertifikat passt, erzeugt Signaturen, die das KBA ablehnt — und drei abgewiesene Anmeldungen sperren die Kennung. Fehlen beim Anlegen beide Felder, antwortet die Schnittstelle ebenso mit 400: Ein Zugang ohne Schlüsselmaterial könnte nichts signieren.

Für das Zertifikat gilt:

EigenschaftRegel
FormX.509, PEM von -----BEGIN CERTIFICATE----- bis -----END CERTIFICATE-----
VersionX.509 v3. Ein v1-Zertifikat wird angenommen und angemerkt — die KBA-Registrierungsanwendung hat diese Form am 07.09.2026 abgewiesen
Laufzeithöchstens ein Jahr. Über 366 Tage: 400. Genau 366 Tage: angenommen und angemerkt. Angenommen wurden in der Praxis 364 Tage
Beim KBAdasselbe Zertifikat wird in der Registrierungsanwendung als Base64-.cer hochgeladen

Die Anmerkungen stehen nicht in der Antwort. 201 und 200 tragen die Übersicht ohne Warnfeld. Ob ein hinterlegtes Zertifikat Aufmerksamkeit braucht, zeigt GET /health als gksCertificates.needAttention (siehe Betriebszustand); im Klartext steht es angemeldet im Dashboard unter „GKS-Zugänge". needAttention erfasst die X.509-Version nicht — ein v1-Zertifikat fällt dort nicht auf.

Pfade auf Serverdateien nimmt die Schnittstelle nicht an. certificatePath und privateKeyPath werden mit 400 abgewiesen. Über sie liess sich sonst am Antwortcode ablesen, welche Dateien auf dem Server liegen (201 bei vorhandener, 400 bei fehlender Datei), und ein Gerät wie /dev/zero als Zertifikat eintragen — der Dienst las es beim nächsten GET /health ohne Grenze. Liegt Schlüsselmaterial schon auf dem Server, trägt der Betreiber es im Self-Service-Bereich unter „GKS-Zugänge" ein; über die Schnittstelle geht ausschließlich PEM-Text.