Hooks KSeF : enregistrer et recevoir des factures auprès du KSeF polonais

Configurer le hook outbound KSeF pour l'enregistrement automatique des factures auprès du système de facturation électronique polonais.

La PSB dispose de deux hooks KSeF : un hook outbound pour les factures sortantes (partie vendeuse / Podmiot1) et un hook inbound pour les factures entrantes (partie acheteuse / Podmiot2). Les deux automatisent l'échange avec le Krajowy System e-Faktur (KSeF), le système national de facturation électronique polonais. Le hook outbound est décrit en premier ci-dessous ; le hook inbound se trouve en bas de cette page.

Hook outbound KSeF (sortant, Podmiot1)

Le hook outbound KSeF automatise l'enregistrement des factures sortantes auprès de KSeF. Les factures sont transformées du format Peppol BIS Billing 3.0 / UBL (également appelé BisV3 en interne) au format polonais FA(3) et enregistrées en batch. Le client peut aussi fournir lui-même le FA(3) ; dans ce cas, l'étape de transformation est ignorée. Après traitement réussi, le hook renvoie le UPO (Urzędowe Poswiadczenie Odbioru, l'accusé de réception officiel) et une preuve PDF via la plateforme PSB.

Environnements KSeF (administration)

Pour les tests et la recette, l'administration polonaise propose deux environnements en plus de la production :

EnvironnementURLDémohttps://ksef-demo.mf.gov.pl/Testhttps://ksef-test.mf.gov.pl/

Le hook prend en charge un flux en ligne (enregistrement direct) ainsi qu'un flux hors ligne (lorsque KSeF est temporairement indisponible, par exemple pendant la coupure quotidienne). Dans le flux hors ligne, un PDF hors ligne est généré sur la base du certificat hors ligne.

Prérequis
  • Un certificat en ligne valide pour KSeF (.key + .crt ; authentification pendant le flux en ligne)
  • Un certificat hors ligne valide pour KSeF (.key + .crt ; codes QR dans le PDF de sortie, tant en traitement en ligne que hors ligne)
  • Les mots de passe correspondants pour les deux certificats
  • Le hook doit être activé dans la configuration
Flux de travail

Après réception d'une notification de facture, le hook passe par sept étapes :

ÉtapeActionDescription1UploadTéléverse le paquet de factures en batch vers KSeF (POST /v2/sessions/batch)2StatusInterroge le statut du batch jusqu'à ce que le traitement soit terminé (GET /v2/sessions/{referenceNumber}/status)3RetrieveInvoicesRécupère les résultats des factures traitées par page (GET /v2/sessions/{referenceNumber}/invoices)4RetrieveUpoRécupère le document UPO pour la session (GET /v2/sessions/{referenceNumber}/upo)5PrintGénère un PDF par document basé sur les données UPO et le lien de vérification, et l'enregistre comme pièce jointe6DispatchEnvoie tous les événements mis en mémoire tampon en batch à l'Ingestor7FinalizeNettoie l'état et ferme la session

Lorsque KSeF n'est pas disponible (coupure quotidienne ou panne), le flux hors ligne démarre automatiquement : un PDF hors ligne est généré via le certificat hors ligne, puis la facture est envoyée par le canal régulier.

Configuration

Enregistrez le hook via l'API Hooks :

{
  "id": "ksef-sender",
  "action": "ksef",
  "name": "KSeF Hook Sender",
  "topics": [
    "ClearInvoiceBatched"
  ],
  "output": [
    {
      "when": "200",
      "topic": "SendInvoice"
    },
    {
      "when": "410",
      "topic": "SendInvoice"
    }
  ],
  "init": {
    "onlineCertificate": "{{chemin-vers-certificat-en-ligne}}",
    "onlineCertificatePassword": "{{mot-de-passe}}",
    "offlineCertificate": "{{chemin-vers-certificat-hors-ligne}}",
    "offlineCertificatePassword": "{{mot-de-passe}}"
  },
  "isActive": true
}
Paramètres
ParamètreDescriptiononlineCertificateChemin vers le fichier de certificat en ligne pour l'authentification auprès de KSeF pendant le flux en ligneonlineCertificatePasswordLe mot de passe du certificat en ligneofflineCertificateChemin vers le fichier de certificat hors ligne, utilisé pour générer les codes QR dans le PDF de sortieofflineCertificatePasswordLe mot de passe du certificat hors lignetopicsLes topics sur lesquels le hook écoute. Utilisez ClearInvoiceBatched pour les factures sortantesoutputDéfinit quel topic est envoyé pour un code de statut donnéisActiveDoit être défini sur true pour activer le hook

Important : Les quatre champs de certificat sont obligatoires. Le certificat en ligne est nécessaire pour l'authentification pendant le flux en ligne. Le certificat hors ligne est nécessaire pour la génération des codes QR dans le PDF, tant pour le traitement en ligne que hors ligne.

Codes de statut
CodeDescriptionTopic de sortie200Facture enregistrée avec succès auprès de KSeF (en ligne)SendInvoice201Facture enregistrée avec succès après traitement hors ligneInvoiceCleared410KSeF est hors ligne ; le flux hors ligne est lancéSendInvoice429Temporairement indisponible ; une nouvelle tentative est planifiée automatiquementInvoiceClearedRetry500Erreur interne du serveurInvoiceClearedError

Avec le code de statut 410, la PSB lance automatiquement le flux hors ligne. La facture est alors traitée localement avec le certificat hors ligne et envoyée dès que KSeF est de nouveau disponible. Avec 429, la PSB planifie une nouvelle tentative automatique.

Flux en ligne vs. hors ligne

KSeF a une période de coupure quotidienne pendant laquelle le système n'est pas disponible pour l'enregistrement en batch. Après environ 23h00 heure locale polonaise, le flux hors ligne se déclenche dès que KSeF est injoignable (code de statut 410) :

  • En ligne : la facture est directement enregistrée auprès de KSeF, le UPO est récupéré et un PDF avec codes QR est généré
  • Hors ligne : la facture est traitée localement, un PDF hors ligne avec un code QR hors ligne est généré via le certificat hors ligne. La facture est envoyée au destinataire sans avoir encore été enregistrée auprès de KSeF.

Après le retour de KSeF, les factures traitées hors ligne sont enregistrées a posteriori et la facture reçoit le code de statut 201 (InvoiceCleared). La facture n'est pas renvoyée au destinataire ; le code QR hors ligne envoyé précédemment pointe, après cet enregistrement tardif, vers l'enregistrement KSeF confirmé.

Numéro de référence KSeF (clearance)

Après la clearance en ligne, KSeF renvoie un numéro de référence. Ce numéro figure dans le UPO et dans les détails du webhook sortant, par exemple :

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

Conservez le numéro de référence dans l'ERP émetteur comme preuve d'enregistrement auprès de KSeF.

Hook de batch avant KSeF (limitation de débit)

Pour des volumes importants : placez un hook de batch avant le hook KSeF afin que les factures partent périodiquement (par exemple toutes les 15 secondes à 1 minute, ou au maximum 100 à la fois) en batch vers KSeF. L'intégration atteint ainsi moins vite les limites de débit de KSeF. Schéma de topic privilégié : ClearInvoice → batch → ClearInvoiceBatched → hook KSeF. Un hook distinct est en outre nécessaire pour publier les factures sortantes sur le topic ClearInvoice (selon le flux).

Exemple de hook de batch (préféré ; paramètres à ajuster par client) :

{
  "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
}

Forme d'action courte (même cible FA(3) ; period par exemple 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 : pas de topic ClearInvoice (par exemple Business Central)

Certains clients ne peuvent pas envoyer de factures avec le topic ClearInvoice (par exemple Business Central). Adaptez alors le hook de batch pour qu'il écoute SendInvoice tout en publiant ClearInvoiceBatched :

{
  "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
}
Questions fréquentes
Pourquoi un certificat en ligne et un certificat hors ligne sont-ils tous deux requis dans la configuration init ?

La PSB utilise le certificat en ligne pour s'authentifier auprès de KSeF lors du flux d'enregistrement en ligne. Le certificat hors ligne est nécessaire pour les codes QR dans la sortie PDF, aussi bien lors du traitement en ligne que hors ligne. Les quatre champs (les deux chemins de certificat et les mots de passe) doivent donc être remplis.

Que fait la PSB avec le code de statut 410 ou 429 de KSeF ?

Avec 410, KSeF est hors ligne (par exemple pendant la période de coupure) ; la PSB lance le flux hors ligne avec un PDF hors ligne et envoie ensuite via le canal régulier. Avec 429, il n'y a temporairement pas de capacité ; la PSB planifie automatiquement un nouvel essai sur InvoiceClearedRetry.

Quel topic faut-il configurer sur le hook pour les factures sortantes vers KSeF ?

Utilisez ClearInvoiceBatched dans topics pour que le hook écoute les bonnes notifications batch. L'objet output associe les codes de statut HTTP à des topics de suivi comme SendInvoice ou InvoiceCleared, selon le résultat de l'enregistrement.


Hook inbound KSeF (entrant, Podmiot2)

Le hook inbound KSeF traite les factures entrantes pour la partie acheteuse (Podmiot2). Le hook interroge périodiquement KSeF pour les nouvelles factures, récupère le XML de la facture par numéro KSeF et le livre via la plateforme PSB.

L'authentification auprès de KSeF passe exclusivement par un certificat en ligne (.key + .crt + mot de passe). Le flux inbound ne dispose d'aucune variante hors ligne, contrairement au hook outbound. En cas d'indisponibilité temporaire de KSeF, l'interrogation est retentée selon la politique de retry configurée.

Flux de travail par cycle d'interrogation
ÉtapeActionDescription1FetchInterroge KSeF pour les métadonnées des nouvelles factures dans la fenêtre temporelle (POST /v2/invoices/query/metadata). Pagination via HasMore / NextPageOffset (boucle interne) ; troncature via IsTruncated / HwmDate (boucle externe) au-delà de 10 000 éléments.2ProcessRécupère le XML de la facture par numéro KSeF (GET /v2/invoices/ksef/{ksefNumber}) et le téléverse vers le DocumentCarrier. Les factures en double (HTTP 409) sont ignorées. Après chaque téléversement réussi, la clé pending est supprimée, ce qui permet de reprendre entièrement l'étape lors d'une nouvelle tentative.3CompleteEnregistre le checkpoint (HwmDate ?? ToDate) et planifie le prochain cycle d'interrogation au prochain créneau horaire fixe.

Si aucune facture n'est trouvée pendant Fetch, le hook passe directement à Complete : rien n'est traité ni publié.

Prérequis du hook inbound
  • Un certificat en ligne valide pour KSeF (.key + .crt) ainsi que le mot de passe correspondant.
  • Le hook doit être activé dans la configuration.
  • Les champs init onlineCertificate et onlineCertificatePassword sont obligatoires (pas de champs de certificat hors ligne).

Le hook inbound est mis en place via TechSupport : le traitement des certificats est une procédure réservée au support technique, non en self-service.

Configuration du hook inbound

Le paramètre d'action détermine la fenêtre temporelle sur laquelle le hook revient en arrière : ksef:inbound?lookbackWindow=<fenêtre>. Le bloc init ne contient que le certificat en ligne.

Standard (publie sur le topic ReceiveInvoice) :

{
  "id": "ksef-inbound",
  "action": "ksef:inbound?lookbackWindow=08:00:00",
  "name": "KSeF Hook Inbound",
  "publishTopics": ["ReceiveInvoice"],
  "init": {
    "onlineCertificate": "{{chemin-vers-certificat-en-ligne}}",
    "onlineCertificatePassword": "{{mot-de-passe}}"
  },
  "isActive": true
}

Le hook inbound doit toujours être suivi d'un hook de suivi qui traite ensuite la facture reçue.

Variante plateforme Collabrr : sur la plateforme Collabrr, le hook écoute dans le tenant avec publishTopics: ["InvoiceReceived"]. L'organisation doit être enregistrée pour la réception Peppol sur la plateforme. Exemple d'action : ksef:inbound?lookbackWindow=08.00:00:00.

Paramètre lookbackWindow

Le paramètre lookbackWindow détermine la fenêtre temporelle sur laquelle le hook revient en arrière lors de l'interrogation/création :

  • En heures, par exemple "08:00:00"
  • En jours, par exemple "60.00:00:00"

KSeF limite le retour en arrière à 3 mois maximum. Un dépassement entraîne une erreur :

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

Il existe en outre une limite de débit de requêtes vers KSeF. Tenez-en compte lors de l'activation de plusieurs entités avec un lookbackWindow (important).


Vous souhaitez en savoir plus sur la facturation électronique en Pologne ? Consultez la page pays sur l'obligation KSeF polonaise.

Voir la documentation API