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.
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.
Pour les tests et la recette, l'administration polonaise propose deux environnements en plus de la production :
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.
.key + .crt ; authentification pendant le flux en ligne).key + .crt ; codes QR dans le PDF de sortie, tant en traitement en ligne que hors ligne)Après réception d'une notification de facture, le hook passe par sept étapes :
POST /v2/sessions/batch)GET /v2/sessions/{referenceNumber}/status)GET /v2/sessions/{referenceNumber}/invoices)GET /v2/sessions/{referenceNumber}/upo)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.
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
}
onlineCertificateonlineCertificatePasswordofflineCertificateofflineCertificatePasswordtopicsClearInvoiceBatched pour les factures sortantesoutputisActivetrue pour activer le hookImportant : 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.
200SendInvoice201InvoiceCleared410SendInvoice429InvoiceClearedRetry500InvoiceClearedErrorAvec 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.
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) :
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é.
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.
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
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
}
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.
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.
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.
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.
POST /v2/invoices/query/metadata). Pagination via HasMore / NextPageOffset (boucle interne) ; troncature via IsTruncated / HwmDate (boucle externe) au-delà de 10 000 éléments.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.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é.
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.
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.
Le paramètre lookbackWindow détermine la fenêtre temporelle sur laquelle le hook revient en arrière lors de l'interrogation/création :
"08:00:00""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