Un appel, un fichier, un rapport
Spécification complète de l'API de conformité pour Factur-X, XRechnung, CII et UBL. Gratuit, sans clé, sans compte et sans limite de volume sur la validation.
Essayer tout de suite
Envoyez n'importe quelle facture Factur-X (PDF/A-3), CII ou UBL 2.1 jusqu'à 10 Mo en multipart HTTP :
curl -X POST https://api.factlint.com/v1/validate \ -F "[email protected]" \ -F "ruleset=eu-en16931-2026-08" \ -F "pinned=true"
Clients officiels
Quatre clients minces, sans dépendance, qui parlent à la même API : Node.js, Python, PHP et Java. Le dépôt public porte aussi une page par code d'erreur avec la phrase que le validateur imprime, les jeux de règles scellés et leurs empreintes, et des factures de test à essayer sans clé.
import { Factlint, findings } from 'factlint';
const report = await new Factlint().validate('facture.xml', { jurisdiction: 'FR' });
for (const f of findings(report)) console.log(f.code, f.resolution, f.docs_url);from factlint import Factlint, findings
report = Factlint().validate("facture.xml", jurisdiction="FR")
for f in findings(report):
print(f["code"], f["resolution"], f["docs_url"])use Factlint\Client;
$report = (new Client())->validate('facture.xml', jurisdiction: 'FR');
foreach ($report['errors'] as $f) echo $f['code'], ' ', $f['docs_url'], PHP_EOL;Factlint client = Factlint.builder().build();
JsonNode report = client.validate(Path.of("facture.xml"), ValidateOptions.jurisdiction("FR"));
for (JsonNode f : report.get("errors")) System.out.println(f.get("code") + " " + f.get("docs_url"));Les paquets arrivent sur npm, PyPI, Packagist et Maven Central. D'ici là, le README de chaque client explique l'installation depuis le dépôt.
Voir le dépôt sur GitHubStructure de la réponse JSON
Une facture non conforme renvoie HTTP 200 OK avec un statut métier dans le corps de la réponse (status: "needs_input" ou "blocked"). Les erreurs HTTP 4xx ne concernent que les requêtes malformées.
{
"status": "needs_input",
"document": {
"sha256": "a609849e914e759c87b003a8d...",
"bytes": 4996
},
"identify": {
"syntax": "cii",
"profile": "urn:cen.eu:en16931:2017",
"pdf_compliant": true
},
"engine": {
"name": "factlint-saxon",
"version": "12.5",
"pinned": true
},
"ruleset": {
"id": "eu-en16931-2026-08",
"sealed": true
},
"errors": [
{
"code": "BR-CO-15",
"bt": "BT-112",
"severity": "fatal",
"resolution": "blocked",
"message": "[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).",
"docs_url": "https://factlint.com/errors/br-co-15"
}
],
"counts": { "fired": 65, "failed": 1, "passes": 64 }
}Endpoints disponibles
| Méthode | Chemin | Rôle | Note |
|---|---|---|---|
| POST | /v1/validate | Validation d'une facture | Gratuit, sans compte, sans limite |
| GET | /v1/rulesets | Catalogue des jeux de règles | Versions, dates d'effet, empreintes |
| GET | /v1/rulesets/{id} | Composition d'un jeu de règles | Artefacts et manifestes versionnés |
| POST | /v1/fix | Correction structurelle | Pro — clé API requise |
| POST | /v1/process | Pipeline en un appel | Pro — clé API requise |
| POST | /v1/enrich | Vérification des tiers | Pro — clé API requise |
| POST | /v1/convert | Conversion entre formats | Pro — clé API requise |
| POST | /v1/evidence | Pack de preuve scellé | Enterprise — clé API requise |
| POST | /v1/evidence/verify | Vérification d'un sceau | Gratuit, sans compte |
| GET | /v1/evidence/{id} | Relecture d'un pack | Enterprise — clé API requise |
| GET | /v1/usage | Consommation du compte | Session du compte requise |
| GET | /v1/openapi | Spécification OpenAPI | OpenAPI 3.1 JSON — ouvrir |
Pour les endpoints Pro et Enterprise, transmettez la clé dans l’en-tête Authorization: Bearer flk_live_…. Une clé absente ou invalide renvoie 401, un abonnement requis renvoie 402 et un palier insuffisant renvoie 403. La validation sur /v1/validate reste gratuite et sans clé.
Signification des statuts métier
Facture conforme au jeu de règles épinglé. Aucune erreur sur le conteneur PDF/A-3, la syntaxe XML ou les règles Schematron.
Donnée obligatoire manquante que seul l'émetteur possède (par exemple la référence acheteur BT-44).
Incohérence sur un champ financier. La valeur correcte est suggérée mais jamais modifiée automatiquement.
Les anomalies structurelles ont été corrigées. Le diff XPath est fourni avec la réponse.
SDK officiels
Quatre clients publiés sur GitHub, avec la référence des codes d'erreur et des factures de test. L'API se consomme aussi en HTTP simple : les exemples ci-contre ne dépendent d'aucune bibliothèque.