Spécifications API KSeF
L'API KSeF est une API REST hébergée sur ksef.mf.gov.pl, exposant trois canaux d'usage — Sesja Interaktywna (interactive), Sesja Wsadowa (batch), et Common (consultation). Authentification par hiérarchie token, format JSON avec XML FA(2) embarqué en base64.
Environnements et endpoints
Le ministère opère trois environnements distincts pour KSeF :
- Production (Produkcja).
ksef.mf.gov.pl— l'environnement de référence légal. Toute facture qui y transite reçoit un numer KSeF juridiquement valide. - Préproduction (Przedprodukcyjna).
ksef-test.mf.gov.pl— environnement miroir de production pour tests d'intégration éditeur. Aucune valeur juridique. Les NIP utilisés doivent être réels. - Démo (Demonstracja).
ksef-demo.mf.gov.pl— sandbox avec NIP fictifs et données générées. Idéal pour formation et développement initial.
| Endpoint | Méthode | Description |
|---|---|---|
/api/online/Session/InitToken | POST | Ouverture session interactive avec AuthorizationToken |
/api/online/Session/InitSigned | POST | Ouverture session signée XAdES |
/api/online/Session/Terminate | POST | Fermeture session courante |
/api/online/Invoice/Send | POST | Émission d'une facture FA(2) en mode interactif |
/api/online/Invoice/Status/{ref} | GET | Statut d'une soumission par référence |
/api/online/Invoice/Get/{numKSeF} | GET | Récupération facture par numer KSeF |
/api/online/Query/Invoice/Sync | POST | Recherche synchrone factures par critères |
/api/online/Query/Invoice/Async/Init | POST | Initialisation recherche asynchrone (volumes) |
/api/batch/Session/Init | POST | Ouverture session batch (Sesja Wsadowa) |
/api/batch/Session/Close | POST | Fermeture et déclenchement traitement batch |
/api/common/Status/{ref} | GET | Statut d'une session batch en cours |
Authentification — hiérarchie OAuth 2.0
KSeF utilise une hiérarchie à trois niveaux, inspirée d'OAuth 2.0 mais spécifique au ministère :
- AuthorizationToken. Token primaire généré une fois par le contribuable, dans le portail KSeF (interface humaine) ou via signature XAdES par certificat e-IDAS. Valide 24 mois, scope par défaut fakturujący sur le NIP propriétaire.
- SessionToken. Obtenu par
InitTokenen échange de l'AuthorizationToken. Valide 4 heures glissantes. Sert à enchaîner les opérations facture par facture sans repayer le coût de l'auth. - AccessToken (alias contextuel). Pour les délégations (e.g. comptable externe agissant pour le compte du contribuable). Lie l'AuthorizationToken à un Uprawnienie spécifique (droit) sur un NIP tiers.
POST /api/online/Session/InitToken HTTP/1.1
Host: ksef.mf.gov.pl
Content-Type: application/octet-stream
Content-Encoding: base64
PFNlc3Npb25Ub2tlblJlcXVlc3QgeG1sbnM9Imh0dHA6Ly9rc2VmLm1mLmdvdi5wbC8iPgogIDxJ
ZGVudGlmaWVyVHlwZT5vbmlwPC9JZGVudGlmaWVyVHlwZT4KICA8SWRlbnRpZmllcj41MjYwMjUw
Mjc0PC9JZGVudGlmaWVyPgogIDxBdXRob3JpemF0aW9uVG9rZW4+ZXk...PC9BdXRob3JpemF0
aW9uVG9rZW4+CjwvU2Vzc2lvblRva2VuUmVxdWVzdD4=
HTTP/1.1 201 Created
Content-Type: application/json
{
"timestamp": "2026-05-19T08:42:11Z",
"referenceNumber": "20260519-SE-3F4B7A2D9C-DA",
"sessionToken": {
"token": "eyJhbGciOiJSUzI1NiIs...",
"context": {
"nip": "5260250274",
"name": "Spółka Sprzedaży Sp. z o.o.",
"schemaVersion": "1-0E"
}
}
} Flux interactive — Sesja Online
Le flux interactif est conçu pour l'émission au fil de l'eau, facture par facture. C'est le mode privilégié des ERP en intégration directe et des portails web.
POST /api/online/Session/InitToken— ouvrir la session, récupérer leSessionTokenPOST /api/online/Invoice/Send— soumettre la facture FA(2) (en base64 dansinvoiceBody)GET /api/online/Invoice/Status/{ref}— récupérer le statut et lenumer KSeFPOST /api/online/Session/Terminate— fermer la session (libère les ressources serveur)
POST /api/online/Invoice/Send HTTP/1.1
Host: ksef.mf.gov.pl
SessionToken: eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json
{
"invoiceHash": {
"hashSHA": {
"algorithm": "SHA-256",
"encoding": "Base64",
"value": "9c1185a5c5e9fc54612808977ee8f548b2258d31"
},
"fileSize": 4892
},
"invoicePayload": {
"type": "plain",
"invoiceBody": "PD94bWwgdmVyc2lvbj0iMS4wIi..."
}
}
HTTP/1.1 201 Created
Content-Type: application/json
{
"elementReferenceNumber": "20260519-SE-3F4B7A2D9C-DA",
"processingDescription": "Przyjęte",
"referenceNumber": "20260519-IN-7C8A3D4E5F-AA",
"timestamp": "2026-05-19T08:42:17Z"
}
Le statut transactionnel est dans processingDescription.
Trois valeurs principales :
Przyjęte— facture acceptée par le validateur, numer KSeF attribué dansreferenceNumberOdrzucone— facture rejetée par le validateur, code erreur dansstatusCodeW trakcie przetwarzania— traitement asynchrone en cours, requête à recommencer après 1-2 secondes
Flux batch — Sesja Wsadowa
Le mode Wsadowa permet d'envoyer un paquet de factures regroupées dans une archive ZIP signée, traitée de manière asynchrone par KSeF. Mode privilégié pour les éditeurs ERP gérant de gros volumes.
- Préparation locale. Constituer une archive ZIP contenant chaque facture FA(2) en fichier XML individuel (un fichier = une facture). Limite : 50 factures par archive, taille maximale 100 Mo.
- Calcul hash et chiffrement. Hash SHA-256 de chaque fichier XML inclus. Chiffrement AES-256-CBC de l'archive avec une clé symétrique aléatoire, elle-même chiffrée RSA avec le certificat public KSeF.
- POST /api/batch/Session/Init. Soumettre le manifeste
(liste factures + hashes + clé chiffrée). KSeF répond avec une URL de
dépôt et un
BatchSessionReferenceNumber. - PUT sur l'URL de dépôt. Uploader l'archive ZIP chiffrée.
- POST /api/batch/Session/Close. Déclencher le traitement.
- Polling GET /api/common/Status/{ref}. Suivre le statut. Délai cible : 5 à 30 minutes selon volume.
Limites et quotas
| Limite | Valeur | Note |
|---|---|---|
| Sesja Online — débit / NIP / minute | 60 requêtes | Rate-limit anti-flood |
| Sesja Wsadowa — factures / paquet | 50 | Limite stricte XSD |
| Sesja Wsadowa — taille archive ZIP chiffrée | 100 Mo | Au-delà : segmentation côté éditeur |
| Taille XML facture FA(2) | 10 Mo non compressé | Pièces jointes binaires interdites |
| Pieces jointes binaires | 0 | Le PDF de l'image n'est pas transmis dans KSeF |
| SessionToken — durée | 4 heures glissantes | Renouvelable en cours d'usage |
| AuthorizationToken — durée | 24 mois | Renouvellement manuel via portail |
| Politique de retry recommandée | 3 tentatives, backoff exponentiel 1s/2s/4s | Sur 5xx ou code 21900 (timeout transitoire) |
Codes d'erreur 21xxx
Les codes d'erreur KSeF suivent une convention 21xxx. Catalogue partiel des erreurs fréquentes :
| Code | Description | Action |
|---|---|---|
| 21100 | SessionToken expired | Refaire InitToken |
| 21102 | SessionToken invalide ou révoqué | Vérifier AuthorizationToken |
| 21200 | NIP émetteur ne correspond pas au token | Vérifier scope token et délégation |
| 21300 | Schemat XSD nieaktualny (schéma désuet) | Passer en FA(2) version courante |
| 21320 | Schematron violation — règle BR-CO-25 (totaux) | Recalculer P_13_1 + P_14_1 = P_15 |
| 21400 | Hash SHA-256 non concordant | Recalculer le hash après envoi |
| 21500 | NIP destinataire (Podmiot2/NIP) inexistant ou inactif | Vérifier sur portail VAT-R |
| 21900 | Traitement en cours, retry après 2 s | Backoff exponentiel |
| 21999 | Erreur interne KSeF | Réessayer ; si persistant, ticket support |
Pièges courants
- Mauvaise base URL. L'environnement test
(
ksef-test) et démo (ksef-demo) sont souvent confondus. Vérifier les NIP utilisés — vrais pour test, fictifs pour démo. Une erreur est rejetée avec code 21200. - Encodage base64 avec saut de ligne. Certaines libs base64 insèrent des sauts toutes les 76 chars (RFC 2045 MIME). KSeF n'accepte que le base64 sans saut de ligne (RFC 4648 strict).
- Content-Length manquant. Sur POST avec body binaire,
KSeF exige un
Content-Lengthexact. Les libs HTTP qui utilisentTransfer-Encoding: chunkedsont rejetées. - Pieces jointes binaires. KSeF n'accepte que du XML pur.
Toute pièce jointe (PDF, image) doit être référencée hors KSeF et
transmise par un autre canal. Les liens externes vers cloud storage sont
acceptés dans
FaWiersz/DodatkoweInfo. - Caractères diacritiques polonais. Les ą, ć, ę, ł, ń, ó, ś, ź, ż doivent être encodés en UTF-8 (jamais en Windows-1250 ou ISO 8859-2). KSeF rejette les caractères mal encodés avec code 21420.