Les guides du développeur
Pour contrôler chaque facture depuis votre propre code, au moment où votre système la produit : des exemples complets à copier, dans votre langage, et le contrat de l'appel qu'ils ont en commun.
Par où commencer
Il n'existe pas de bibliothèque à installer pour chaque langage : un appel HTTP suffit. Le bon point de départ dépend de ce que votre système utilise déjà.
- Vous voulez voir la réponse avant d'écrire du code. Un terminal suffit : commencez par Valider une facture avec curl, qui donne l'appel en une ligne, puis un script prêt pour une intégration continue.
- Votre facturation tourne sur Node.js ou en Python. Les guides Valider une facture en Node.js et Valider une facture en Python donnent un programme complet, avec ce qui est propre à chaque langage : la façon d'envoyer le fichier, de borner l'attente et de lire les refus.
- Vous voulez tester chaque modification dans votre CI. Tester vos factures dans GitLab CI et GitHub Actions donne les jobs prêts à copier, quel que soit le langage de votre projet, avec un fichier de référence qui laisse passer les échecs déjà connus et rend le pipeline rouge quand une facture empire.
- Votre application est en PHP. Le client officiel logalysm/valide-facture, installé par Composer, rend un rapport typé et une exception par refus. C'est le seul client publié, et il est écrit en PHP.
- Votre application est en Symfony et vous préférez le client HTTP du framework. Valider vos factures depuis Symfony donne le service et la commande complets, sans autre paquet que les composants de Symfony.
-
Votre langage n'est pas dans la liste. Le contrat ci-dessous est le même pour
tous : un envoi de fichier, une réponse JSON, et un membre
typequi dit quoi faire d'un refus.
Les guides publiés
-
Valider une facture avec curl
Appeler l'API de validation depuis un terminal ou une CI avec curl et jq : envoi du fichier en multipart, lecture du verdict, distinction des deux refus 429 et codes de sortie pour un script shell.
-
Valider une facture en Node.js
Appeler l'API de validation depuis Node.js avec fetch et FormData natifs : envoi du fichier, délai de 35 secondes avec AbortSignal, lecture du verdict et traitement des refus, sans aucun paquet npm.
-
Valider une facture en Python
Appeler l'API de validation depuis Python avec la bibliothèque requests : fichier ouvert en binaire, envoi multipart avec files=, timeout, lecture du verdict et des refus avant raise_for_status.
-
Valider vos factures depuis Symfony
Le code complet pour appeler l'API de validation depuis Symfony avec symfony/http-client : client configuré, clé rangée en secret, envoi du fichier, lecture du rapport et des erreurs.
-
Tester vos factures dans GitLab CI et GitHub Actions
Configurer GitLab CI et GitHub Actions pour valider vos factures électroniques à chaque modification, quel que soit le langage de votre projet : jobs prêts à copier, fichier de référence, rapport JUnit et codes de sortie.
Le contrat de l'appel
Chaque exemple fait le même appel : POST https://valide-facture.fr/api/validate,
authentifié par l'en-tête Authorization: Bearer suivi de votre clé API.
-
Le corps est un envoi
multipart/form-data, avec un seul fichier dans le champfile: un PDF Factur-X, ou un XML CII ou UBL. Le type du document est reconnu sur ses octets, jamais sur son nom ni sur le type de média annoncé. -
Le fichier pèse au plus 10 Mio. Au-delà, la réponse est un refus
payload-too-large; bien au-delà, le serveur frontal coupe l'envoi par une page HTML. - Le service ne répond qu'une fois la facture jugée. Réglez votre client sur 35 secondes d'attente au total.
-
Rangez la clé dans une variable d'environnement ou un gestionnaire de secrets, jamais dans un
fichier versionné. Les exemples la lisent dans
VALIDE_FACTURE_API_KEY.
Le rapport
Une réponse 200 porte toujours un rapport, et une facture non conforme n'est
pas une erreur : elle a été jugée. Le membre verdict vaut
CONFORME, NON_CONFORME ou NON_EVALUABLE ; le contrat garde une
quatrième valeur, PROFIL_NON_SUPPORTE, qui n'est plus produite.
Chaque anomalie de findings porte sa gravité (severity), le code de la
règle (code), l'explication en français (messageFr), l'endroit du fichier
(location) et une piste de correction (correctionHint). Les membres
versions et coverage disent quels référentiels ont été appliqués et quels
contrôles ont réellement tourné. De nouvelles valeurs peuvent apparaître au fil des
versions : prévoyez toujours une branche par défaut.
Les refus, et le geste qui convient
Quand le service n'a pas pu juger la facture, il répond en application/problem+json.
Branchez votre traitement sur le membre type, jamais sur le seul code HTTP ni sur la
phrase detail, dont la rédaction peut changer. Chaque type est une adresse
qui mène à sa documentation.
type | Code | Que faire |
|---|---|---|
https://valide-facture.fr/problems/unauthenticated | 401 | Vérifier la clé : absente, révoquée ou expirée. |
https://valide-facture.fr/problems/insufficient-scope | 403 | Créer une clé qui autorise la validation. |
https://valide-facture.fr/problems/rate-limit-exceeded | 429 | Attendre les secondes de l'en-tête Retry-After, puis renvoyer. |
https://valide-facture.fr/problems/quota-exceeded | 429 | Ne pas renvoyer : changer d'abonnement ou attendre la période suivante. Pas de Retry-After. |
https://valide-facture.fr/problems/malformed-request | 400 | Corriger l'envoi : un seul fichier, dans le champ file. |
https://valide-facture.fr/problems/unreadable-document | 400 | Corriger le fichier : il est vide, tronqué ou mal formé. |
https://valide-facture.fr/problems/payload-too-large | 413 | Réduire le fichier sous la borne de taille. |
https://valide-facture.fr/problems/unsupported-media-type | 415 | Envoyer un PDF ou un XML. |
https://valide-facture.fr/problems/unsupported-syntax | 415 | Envoyer un XML CII ou UBL. |
https://valide-facture.fr/problems/validation-unavailable | 503 | Renvoyer plus tard, et garder correlationId pour le support. |
Renvoyer la même requête après un refus d'envoi ou de fichier donne le même refus. Les deux
429 appellent des gestes opposés, et c'est pourquoi chaque exemple lit le
type : l'un se résout en attendant quelques secondes, l'autre non.
Un troisième 429 ne vient pas de l'API : la limite de débit du serveur frontal répond
par une page HTML, sans type. Testez donc l'en-tête Content-Type avant de
décoder un corps d'erreur.
La documentation de l'API
La documentation de l'API décrit chaque réponse, chaque
type de refus et le schéma complet du rapport, champ par champ, et permet d'essayer
l'appel depuis le navigateur. Chaque code de règle qu'un rapport peut porter a sa page parmi
les codes d'erreur du validateur.
Déposer une facture à valider
Pour voir un rapport complet avant d'écrire une ligne de code, déposez un Factur-X (PDF), ou un CII ou un UBL (XML), dans le validateur.
Déposer une facture à validerPortée de ces pages
Ces exemples envoient une facture et lisent la réponse ; ils ne relancent rien d'eux-mêmes. Le verdict porte sur la conformité technique du document au format et aux règles appliquées par le validateur. Il constitue une aide au diagnostic, et ne présume pas de l'acceptation de la facture par la plateforme de votre destinataire.