KSeF-Hooks: Rechnungen beim polnischen KSeF registrieren und empfangen

Den KSeF-Outbound-Hook konfigurieren für die automatische Registrierung von Rechnungen beim polnischen E-Rechnungssystem.

Die PSB kennt zwei KSeF-Hooks: einen Outbound-Hook für ausgehende Rechnungen (verkaufende Partei / Podmiot1) und einen Inbound-Hook für eingehende Rechnungen (kaufende Partei / Podmiot2). Beide automatisieren den Austausch mit dem Krajowy System e-Faktur (KSeF), dem polnischen nationalen E-Rechnungssystem. Der Outbound-Hook wird nachfolgend zuerst beschrieben; der Inbound-Hook steht am Ende dieser Seite.

KSeF-Outbound-Hook (ausgehend, Podmiot1)

Der KSeF-Outbound-Hook automatisiert die Registrierung ausgehender Rechnungen beim KSeF. Rechnungen werden von Peppol BIS Billing 3.0 / UBL (intern auch BisV3) in das polnische FA(3)-Format transformiert und als Batch registriert. Der Kunde kann auch selbst FA(3) liefern, dann entfällt der Transformationsschritt. Nach erfolgreicher Verarbeitung liefert der Hook das UPO (Urzędowe Poswiadczenie Odbioru, die offizielle Empfangsbestätigung) und einen PDF-Beleg über die PSB-Plattform zurück.

KSeF-Umgebungen (Behörde)

Für Test und Abnahme bietet die polnische Regierung neben der Produktionsumgebung zwei weitere Umgebungen an:

UmgebungURLDemohttps://ksef-demo.mf.gov.pl/Testhttps://ksef-test.mf.gov.pl/

Der Hook unterstützt sowohl einen Online-Flow (direkte Registrierung) als auch einen Offline-Flow (wenn KSeF vorübergehend nicht erreichbar ist, beispielsweise während des täglichen Cutoffs). Im Offline-Flow wird eine Offline-PDF auf Basis des Offline-Zertifikats generiert.

Voraussetzungen
  • Ein gültiges Online-Zertifikat für KSeF (.key + .crt; Authentifizierung während des Online-Flows)
  • Ein gültiges Offline-Zertifikat für KSeF (.key + .crt; QR-Codes in der PDF-Ausgabe, sowohl bei Online- als auch bei Offline-Verarbeitung)
  • Die zugehörigen Passwörter beider Zertifikate
  • Der Hook muss in der Konfiguration aktiviert sein
Workflow

Nach Empfang einer Rechnungsbenachrichtigung durchläuft der Hook sieben Schritte:

SchrittAktionBeschreibung1UploadLädt das Rechnungspaket als Batch zu KSeF hoch (POST /v2/sessions/batch)2StatusPollt den Batch-Status, bis die Verarbeitung abgeschlossen ist (GET /v2/sessions/{referenceNumber}/status)3RetrieveInvoicesRuft die verarbeiteten Rechnungsergebnisse pro Seite ab (GET /v2/sessions/{referenceNumber}/invoices)4RetrieveUpoRuft das UPO-Dokument für die Sitzung ab (GET /v2/sessions/{referenceNumber}/upo)5PrintGeneriert pro Dokument eine PDF auf Basis der UPO-Daten und des Verifizierungslinks und registriert diese als Anhang6DispatchSendet alle gepufferten Events in einem Batch an den Ingestor7FinalizeRäumt den State auf und schließt die Sitzung ab

Wenn KSeF nicht erreichbar ist (täglicher Cutoff oder Störung), startet automatisch der Offline-Flow: Es wird eine Offline-PDF über das Offline-Zertifikat generiert, woraufhin die Rechnung über den regulären Kanal versendet wird.

Konfiguration

Registrieren Sie den Hook über die Hooks API:

{
  "id": "ksef-sender",
  "action": "ksef",
  "name": "KSeF Hook Sender",
  "topics": [
    "ClearInvoiceBatched"
  ],
  "output": [
    {
      "when": "200",
      "topic": "SendInvoice"
    },
    {
      "when": "410",
      "topic": "SendInvoice"
    }
  ],
  "init": {
    "onlineCertificate": "{{pfad-zum-online-zertifikat}}",
    "onlineCertificatePassword": "{{passwort}}",
    "offlineCertificate": "{{pfad-zum-offline-zertifikat}}",
    "offlineCertificatePassword": "{{passwort}}"
  },
  "isActive": true
}
Parameter
ParameterBeschreibungonlineCertificatePfad zur Online-Zertifikatsdatei für die Authentifizierung bei KSeF während des Online-FlowsonlineCertificatePasswordDas Passwort zum Online-ZertifikatofflineCertificatePfad zur Offline-Zertifikatsdatei, verwendet für die Generierung von QR-Codes in der PDF-AusgabeofflineCertificatePasswordDas Passwort zum Offline-ZertifikattopicsDie Topics, auf die der Hook lauscht. Verwenden Sie ClearInvoiceBatched für ausgehende RechnungenoutputDefiniert, welches Topic bei einem bestimmten Statuscode gesendet wirdisActiveMuss auf true gesetzt werden, um den Hook zu aktivieren

Wichtig: Alle vier Zertifikatsfelder sind erforderlich. Das Online-Zertifikat wird für die Authentifizierung während des Online-Flows benötigt. Das Offline-Zertifikat wird für die Generierung von QR-Codes in der PDF benötigt, sowohl bei der Online- als auch bei der Offline-Verarbeitung.

Statuscodes
CodeBeschreibungOutput-Topic200Rechnung erfolgreich bei KSeF registriert (online)SendInvoice201Rechnung erfolgreich nach Offline-Verarbeitung registriertInvoiceCleared410KSeF ist offline; Offline-Flow wird gestartetSendInvoice429Vorübergehend nicht verfügbar; Retry wird automatisch geplantInvoiceClearedRetry500Interner ServerfehlerInvoiceClearedError

Bei Statuscode 410 startet die PSB automatisch den Offline-Flow. Die Rechnung wird dann lokal mit dem Offline-Zertifikat verarbeitet und gesendet, sobald KSeF wieder verfügbar ist. Bei 429 plant die PSB einen automatischen Retry ein.

Online- vs. Offline-Flow

KSeF hat eine tägliche Cutoff-Periode, während der das System für die Batch-Registrierung nicht verfügbar ist. Nach etwa 23:00 Uhr polnischer Ortszeit greift der Offline-Flow, sobald KSeF nicht erreichbar ist (Statuscode 410):

  • Online: Die Rechnung wird direkt bei KSeF registriert, das UPO wird abgerufen und eine PDF mit QR-Codes wird generiert
  • Offline: Die Rechnung wird lokal verarbeitet, eine Offline-PDF mit einem Offline-QR-Code wird über das Offline-Zertifikat generiert. Die Rechnung wird an den Empfänger gesendet, ohne dass sie bereits bei KSeF angemeldet wurde.

Nach Rückkehr von KSeF werden offline verarbeitete Rechnungen nachträglich registriert, und die Rechnung erhält den Statuscode 201 (InvoiceCleared). Die Rechnung wird dann nicht erneut an den Empfänger gesendet; der zuvor gesendete Offline-QR-Code verweist nach dieser späteren Anmeldung auf die bestätigte KSeF-Registrierung.

KSeF-Referenznummer (Clearance)

Nach der Online-Clearance liefert KSeF eine Referenznummer. Diese Nummer steht im UPO und in den Details des ausgehenden Webhooks, zum Beispiel:

"details": {
  "clearanceReference": "234563218-20260220-50683A000001-11",
  "clearanceSystem": "KSeF"
}

Bewahren Sie die Referenznummer im versendenden ERP als Nachweis der Anmeldung bei KSeF auf.

Batch-Hook vor KSeF (Rate Limiting)

Bei großen Volumina: Setzen Sie einen Batch-Hook vor den KSeF-Hook, sodass Rechnungen periodisch (beispielsweise alle 15 Sekunden bis zu 1 Minute, oder maximal 100 Stück) als Batch an KSeF gehen. So erreicht die Integration weniger schnell die KSeF-Ratelimits. Bevorzugtes Topic-Muster: ClearInvoice → Batch → ClearInvoiceBatched → KSeF-Hook. Zusätzlich ist ein separater Hook nötig, der ausgehende Rechnungen auf Topic ClearInvoice publiziert (abhängig vom Flow).

Beispiel Batch-Hook (bevorzugt; Parameter je Kunde abstimmen):

{
  "id": "batchClearInvoice",
  "name": "Batch Invoices for KSeF",
  "action": "batch://zip?period=00:01:00&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0",
  "topics": ["ClearInvoice"],
  "isActive": true
}

Kurze Action-Form (gleiches FA(3)-Ziel; Period zum Beispiel 00:00:15):

batch://zip?period=00:00:15&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0
Alternative: kein ClearInvoice-Topic (zum Beispiel Business Central)

Manche Kunden können keine Rechnungen mit Topic ClearInvoice versenden (zum Beispiel Business Central). Passen Sie den Batch-Hook dann so an, dass er auf SendInvoice lauscht und weiterhin ClearInvoiceBatched publiziert:

{
  "id": "batchClearInvoice",
  "name": "Batch Invoices for KSeF",
  "action": "batch://zip?period=00:01:00&maxBatchSize=100&excludePrimaryAttachment=false&includeAdditionalAttachments=true&hashAlgorithm=sha256&includeRefToMetaAttributes=true&targetDocumentTypeId=econnect-docid%3A%3Ahttp%3A%2F%2Fcrd.gov.pl%2Fwzor%2F2025%2F06%2F25%2F13775%3A%3AFaktura%23%23ksef%3A%3A3.0",
  "topics": ["SendInvoice"],
  "output": [
    { "when": "200", "topic": "ClearInvoiceBatched" },
    { "when": "500", "topic": "ClearInvoiceBatchedError" },
    { "when": "429", "topic": "ClearInvoiceBatchedRetry" }
  ],
  "isActive": true
}
Häufig gestellte Fragen
Warum sind sowohl ein Online- als auch ein Offline-Zertifikat in der Init-Konfiguration erforderlich?

Die PSB verwendet das Online-Zertifikat zur Authentifizierung bei KSeF während des Online-Registrierungsflows. Das Offline-Zertifikat wird für QR-Codes in der PDF-Ausgabe benötigt, sowohl bei der Online- als auch bei der Offline-Verarbeitung. Alle vier Felder (beide Zertifikatspfade und Passwörter) müssen daher ausgefüllt sein.

Was macht die PSB bei Statuscode 410 oder 429 von KSeF?

Bei 410 ist KSeF offline (zum Beispiel während der Cutoff-Periode); die PSB startet den Offline-Flow mit einer Offline-PDF und versendet danach über den regulären Kanal. Bei 429 ist vorübergehend keine Kapazität verfügbar; die PSB plant automatisch einen Retry auf InvoiceClearedRetry ein.

Welches Topic muss ich auf dem Hook für ausgehende Rechnungen an KSeF setzen?

Verwenden Sie ClearInvoiceBatched in topics, damit der Hook auf die richtigen Batch-Benachrichtigungen lauscht. Das output-Objekt ordnet HTTP-Statuscodes Folge-Topics wie SendInvoice oder InvoiceCleared zu, abhängig vom Registrierungsergebnis.


KSeF-Inbound-Hook (eingehend, Podmiot2)

Der KSeF-Inbound-Hook verarbeitet eingehende Rechnungen für die kaufende Partei (Podmiot2). Der Hook pollt periodisch KSeF auf neue Rechnungen, ruft die Rechnungs-XML pro KSeF-Nummer ab und liefert diese über die PSB-Plattform aus.

Die Authentifizierung gegenüber KSeF erfolgt ausschließlich über ein Online-Zertifikat (.key + .crt + Passwort). Der Inbound-Flow kennt keine Offline-Variante, im Gegensatz zum Outbound-Hook. Bei vorübergehender KSeF-Nichterreichbarkeit wird das Polling gemäß der konfigurierten Retry-Policy erneut versucht.

Workflow pro Polling-Zyklus
SchrittAktionBeschreibung1FetchFragt KSeF nach Metadaten neuer Rechnungen innerhalb des Zeitfensters ab (POST /v2/invoices/query/metadata). Paginierung über HasMore / NextPageOffset (innere Schleife); Trunkierung über IsTruncated / HwmDate (äußere Schleife) bei mehr als 10.000 Einträgen.2ProcessRuft pro KSeF-Nummer die Rechnungs-XML ab (GET /v2/invoices/ksef/{ksefNumber}) und lädt sie zum DocumentCarrier hoch. Doppelte Rechnungen (HTTP 409) werden übersprungen. Nach jedem erfolgreichen Upload wird der Pending-Schlüssel entfernt, sodass der Schritt bei einem Retry vollständig wiederholt werden kann.3CompleteSpeichert den Checkpoint (HwmDate ?? ToDate) und plant den nächsten Polling-Zyklus zum nächsten festen Zeitpunkt ein.

Wird während Fetch keine Rechnung gefunden, springt der Hook direkt zu Complete: Es wird nichts verarbeitet oder publiziert.

Voraussetzungen Inbound-Hook
  • Ein gültiges Online-Zertifikat für KSeF (.key + .crt) plus zugehöriges Passwort.
  • Der Hook muss in der Konfiguration aktiviert sein.
  • Die Init-Felder onlineCertificate und onlineCertificatePassword sind erforderlich (keine Offline-Zertifikatsfelder).

Der Inbound-Hook wird über TechSupport eingerichtet: Die Zertifikatsverarbeitung ist ein Techsupport-only-Verfahren, kein Self-Service.

Konfiguration Inbound-Hook

Der Action-Parameter bestimmt das Zeitfenster, in das der Hook zurückblickt: ksef:inbound?lookbackWindow=<Fenster>. In init steht nur das Online-Zertifikat.

Standard (publiziert auf Topic ReceiveInvoice):

{
  "id": "ksef-inbound",
  "action": "ksef:inbound?lookbackWindow=08:00:00",
  "name": "KSeF Hook Inbound",
  "publishTopics": ["ReceiveInvoice"],
  "init": {
    "onlineCertificate": "{{pfad-zum-online-zertifikat}}",
    "onlineCertificatePassword": "{{passwort}}"
  },
  "isActive": true
}

Nach dem Inbound-Hook gehört immer ein Folgehook, der die empfangene Rechnung weiterverarbeitet.

Collabrr-Plattformvariante: Auf der Collabrr-Plattform lauscht der Hook im Tenant mit publishTopics: ["InvoiceReceived"]. Die Organisation muss auf der Plattform für den Peppol-Empfang registriert sein. Beispiel-Action: ksef:inbound?lookbackWindow=08.00:00:00.

Parameter lookbackWindow

Der Parameter lookbackWindow bestimmt das Zeitfenster, in das der Hook beim Polling/Erstellen zurückblickt:

  • In Stunden, zum Beispiel "08:00:00"
  • In Tagen, zum Beispiel "60.00:00:00"

KSeF begrenzt das Zurückblicken auf maximal 3 Monate. Bei Überschreitung erfolgt eine Fehlermeldung:

21405: Błąd walidacji danych wejściowych. - 'dateRange' must not exceed 3 months.

Zudem gilt ein Request-Rate-Limit gegenüber KSeF. Berücksichtigen Sie dies beim Aktivieren mehrerer Entitäten mit einem (großen) lookbackWindow.


Möchten Sie mehr über E-Rechnungsstellung in Polen erfahren? Lesen Sie die Länderseite zur polnischen KSeF-Pflicht.

API-Dokumentation ansehen