Valider une facture Factur-X en Python, PHP et Node.js
Réception obligatoire des factures électroniques au 1er septembre 2026 : trois scripts prêts à l'emploi pour valider vos Factur-X selon EN 16931.
Au 1er septembre 2026, la facturation électronique devient la règle en France : toutes les entreprises assujetties à la TVA doivent pouvoir recevoir des factures électroniques, et les grandes entreprises comme les ETI doivent en émettre. Les PME et micro-entreprises suivront pour l’émission le 1er septembre 2027. Les factures circulent via des plateformes agréées, et Factur-X est l’un des formats du socle.
Une facture Factur-X invalide, c’est un rejet en aval, une relance, un paiement qui prend du retard. La bonne nouvelle : vérifier un fichier avant de l’envoyer (ou après l’avoir reçu) tient en une requête HTTP. Voici le même appel en Python, PHP et JavaScript (Node.js).
Valider en Python
# pip install requests
import requests
with open("facture.pdf", "rb") as f:
response = requests.post(
"https://api.einvoicekit.com/v1/validate",
headers={
"Authorization": "Bearer eik_live_...",
"Content-Type": "application/pdf",
},
data=f.read(),
)
result = response.json()
print(result["valid"], result["errors"])
Le fichier part tel quel dans le corps de la requête. Un PDF Factur-X est d’abord déballé côté serveur : c’est le XML embarqué qui est validé, comme le fera la plateforme de votre client. La clé d’API est gratuite : connexion GitHub, pas de carte bancaire, 100 validations par mois.
La réponse
{
"valid": false,
"syntax": "cii",
"profile": "urn:cen.eu:en16931:2017",
"errors": [
{
"rule": "BR-CO-15",
"message": "[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).",
"path": "/Q{urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100}CrossIndustryInvoice[1]"
}
],
"warnings": []
}
Chaque erreur donne la règle officielle (BR-CO-15), le message officiel de la norme, qui nomme les champs métier en cause (ici BT-112, le total TTC), et le chemin exact dans le XML. Pas de code d’erreur maison à déchiffrer : ce sont les références de la norme EN 16931, celles que votre expert-comptable et la plateforme de votre client utilisent aussi.
Valider en PHP
<?php
$ch = curl_init("https://api.einvoicekit.com/v1/validate");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer eik_live_...",
"Content-Type: application/pdf",
],
CURLOPT_POSTFIELDS => file_get_contents("facture.pdf"),
]);
$result = json_decode(curl_exec($ch), true);
echo $result["valid"] ? "valide" : "invalide", PHP_EOL;
Valider en Node.js
// Node.js 18+ (fetch intégré), à exécuter en module ES
import { readFile } from 'node:fs/promises';
const response = await fetch('https://api.einvoicekit.com/v1/validate', {
method: 'POST',
headers: {
Authorization: 'Bearer eik_live_...',
'Content-Type': 'application/pdf',
},
body: await readFile('facture.pdf'),
});
const result = await response.json();
console.log(result.valid, result.errors);
Et les UBL et CII sans PDF ?
Même appel. L’API lit Factur-X, ZUGFeRD, XRechnung, UBL 2.1 et UN/CEFACT CII : envoyez le fichier tel quel (XML ou PDF, 5 Mo maximum, Content-Type: application/xml pour un XML) et un appel égale une validation. Si vous vous demandez qui est qui parmi ces formats, on les a démêlés ici.
Tester sans écrire de code
Pour un fichier isolé, le validateur gratuit fait la même vérification complète, sans créer de compte. Le fichier est traité en mémoire pour produire le verdict, puis abandonné, jamais conservé.
Sources
- economie.gouv.fr : tout savoir sur la facturation électronique (calendrier officiel de la réforme)
- urssaf.fr : la facturation électronique obligatoire au 1er septembre 2026