KSeF hooks: facturen registreren en ontvangen bij het Poolse KSeF

De KSeF outbound hook configureren voor automatische registratie van facturen bij het Poolse e-facturatiesysteem.

De PSB kent twee KSeF-hooks: een outbound hook voor uitgaande facturen (verkopende partij / Podmiot1) en een inbound hook voor inkomende facturen (kopende partij / Podmiot2). Beide automatiseren de uitwisseling met het Krajowy System e-Faktur (KSeF), het Poolse nationale e-facturatiesysteem. De outbound hook staat hieronder als eerste beschreven; de inbound hook staat onderaan deze pagina.

KSeF outbound hook (uitgaand, Podmiot1)

De KSeF outbound hook automatiseert het registreren van uitgaande facturen bij KSeF. Facturen worden vanuit Peppol BIS Billing 3.0-formaat getransformeerd naar het Poolse FA(3)-formaat en als batch geregistreerd. Na succesvolle verwerking levert de hook het UPO (Urzędowe Poswiadczenie Odbioru, het officiële ontvangstbewijs) en een PDF-bewijs terug via het PSB-platform.

De hook ondersteunt zowel een online flow (directe registratie) als een offline flow (wanneer KSeF tijdelijk niet bereikbaar is, bijvoorbeeld tijdens de dagelijkse cutoff). In de offline flow wordt een offline PDF gegenereerd op basis van het offline certificaat.

Voorwaarden
  • Een geldig online certificaat voor KSeF
  • Een geldig offline certificaat voor KSeF
  • De bijbehorende wachtwoorden van beide certificaten
  • De hook moet geactiveerd zijn in de configuratie
Workflow

Na ontvangst van een factuurnotificatie doorloopt de hook zeven stappen:

StapActieBeschrijving1UploadUploadt het factuurpakket als batch naar KSeF (POST /v2/sessions/batch)2StatusPollt de batchstatus totdat verwerking voltooid is (GET /v2/sessions/{referenceNumber}/status)3RetrieveInvoicesHaalt de verwerkte factuurresultaten op per pagina4RetrieveUpoHaalt het UPO-document op voor de sessie5PrintGenereert per document een PDF op basis van UPO-data en verificatielink, en registreert deze als bijlage6DispatchVerstuurt alle gebufferde events in een batch naar de Ingestor7FinalizeRuimt de state op en sluit de sessie af

Wanneer KSeF niet bereikbaar is (dagelijkse cutoff of storing), start automatisch de offline flow: er wordt een offline PDF gegenereerd via het offline certificaat, waarna de factuur via het reguliere kanaal wordt verstuurd.

Configuratie

Registreer de hook via de Hooks API:

{
  "id": "ksef-sender",
  "action": "ksef",
  "name": "KSeF Hook Sender",
  "topics": [
    "ClearInvoiceBatched"
  ],
  "output": [
    {
      "when": "200",
      "topic": "SendInvoice"
    },
    {
      "when": "410",
      "topic": "SendInvoice"
    }
  ],
  "init": {
    "onlineCertificate": "{{pad-naar-online-certificaat}}",
    "onlineCertificatePassword": "{{wachtwoord}}",
    "offlineCertificate": "{{pad-naar-offline-certificaat}}",
    "offlineCertificatePassword": "{{wachtwoord}}"
  },
  "isActive": true
}
Parameters
ParameterBeschrijvingonlineCertificatePad naar het online certificaatbestand voor authenticatie bij KSeF tijdens de online flowonlineCertificatePasswordHet wachtwoord bij het online certificaatofflineCertificatePad naar het offline certificaatbestand, gebruikt voor het genereren van QR-codes in de PDF-outputofflineCertificatePasswordHet wachtwoord bij het offline certificaattopicsDe topics waarop de hook luistert. Gebruik ClearInvoiceBatched voor uitgaande facturenoutputDefinieert welke topic wordt verstuurd bij een bepaalde statuscodeisActiveMoet op true staan om de hook te activeren

Belangrijk: Alle vier de certificaatvelden zijn verplicht. Het online certificaat is nodig voor authenticatie tijdens de online flow. Het offline certificaat is nodig voor het genereren van QR-codes in de PDF, zowel bij online als bij offline verwerking.

Statuscodes
CodeBeschrijvingOutput topic200Factuur succesvol geregistreerd bij KSeF (online)SendInvoice201Factuur succesvol geregistreerd na offline verwerkingInvoiceCleared410KSeF is offline; offline flow wordt gestartSendInvoice429Tijdelijk niet beschikbaar; retry wordt automatisch geplandInvoiceClearedRetry500Interne serverfoutInvoiceClearedError

Bij statuscode 410 start de PSB automatisch de offline flow. De factuur wordt dan lokaal verwerkt met het offline certificaat en verstuurd zodra KSeF weer beschikbaar is. Bij 429 plant de PSB een automatische retry in.

Online vs. offline flow

De KSeF kent een dagelijkse cutoff-periode waarin het systeem niet beschikbaar is voor batchregistratie. De PSB detecteert dit automatisch (statuscode 410) en schakelt over naar de offline flow:

  • Online: factuur wordt direct geregistreerd bij KSeF, UPO wordt opgehaald en PDF met QR-codes wordt gegenereerd
  • Offline: factuur wordt lokaal verwerkt, offline PDF met QR-codes wordt gegenereerd via het offline certificaat, en de factuur wordt via het reguliere kanaal verstuurd

Na terugkeer van KSeF worden offline verwerkte facturen alsnog geregistreerd en ontvangt de factuur statuscode 201 (InvoiceCleared).

Veelgestelde vragen
Waarom zijn zowel een online als een offline certificaat verplicht in de init-configuratie?

Het online certificaat gebruikt de PSB om zich bij KSeF te authenticeren tijdens de online registratieflow. Het offline certificaat is nodig voor QR-codes in de PDF-output, zowel bij online als bij offline verwerking. Alle vier de velden (beide certificaatpaden en wachtwoorden) moeten daarom gevuld zijn.

Wat doet de PSB bij statuscode 410 of 429 van KSeF?

Bij 410 is KSeF offline (bijvoorbeeld cutoff); de PSB start de offline flow met een offline PDF en stuurt daarna via het reguliere kanaal. Bij 429 is er tijdelijk geen capaciteit; de PSB plant automatisch een retry in op InvoiceClearedRetry.

Welk topic moet ik op de hook zetten voor uitgaande facturen naar KSeF?

Gebruik ClearInvoiceBatched in topics zodat de hook op de juiste batchnotificaties luistert. Het output-object koppelt HTTP-statuscodes aan vervolgtopics zoals SendInvoice of InvoiceCleared, afhankelijk van het registratieresultaat.


KSeF inbound hook (inkomend, Podmiot2)

De KSeF inbound hook verwerkt inkomende facturen voor de kopende partij (Podmiot2). De hook pollt periodiek KSeF op nieuwe facturen, haalt de factuur-XML op per KSeF-nummer en levert deze af via het PSB-platform.

Authenticatie richting KSeF verloopt uitsluitend via een online certificaat (.key + .crt + wachtwoord). De inbound flow kent geen offline-variant, in tegenstelling tot de outbound hook. Bij tijdelijke KSeF-onbereikbaarheid wordt de polling opnieuw geprobeerd conform de geconfigureerde retry-policy.

Workflow per polling-cyclus
StapActieBeschrijving1FetchBevraagt KSeF op metadata van nieuwe facturen binnen het tijdvenster (POST /v2/invoices/query/metadata). Paginering via HasMore / NextPageOffset (inner loop); truncatie via IsTruncated / HwmDate (outer loop) bij meer dan 10.000 items.2ProcessHaalt per KSeF-nummer de factuur-XML op (GET /v2/invoices/ksef/{ksefNumber}) en uploadt deze naar de DocumentCarrier. Dubbele facturen (HTTP 409) worden overgeslagen. Na elke succesvolle upload wordt de pending-sleutel verwijderd, zodat de stap volledig hervat kan worden bij een retry.3CompleteSlaat het checkpoint op (HwmDate ?? ToDate) en plant de volgende polling-cyclus op het eerstvolgende vaste klokslot.

Wordt tijdens Fetch geen factuur gevonden, dan springt de hook direct door naar Complete: er wordt niets verwerkt of gepubliceerd.

Voorwaarden inbound hook
  • Een geldig online certificaat voor KSeF (.key + .crt) plus bijbehorend wachtwoord.
  • De hook moet geactiveerd zijn in de configuratie.

De inbound hook wordt via TechSupport ingericht: certificaatverwerking is een techsupport-only procedure, niet self-service.


Meer weten over e-facturatie in Polen? Lees de landenpagina over de Poolse KSeF-verplichting.

Bekijk de API-documentatie