Documentation API Factlint

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é.

Node.jsREADME
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);
PythonREADME
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;
JavaREADME
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 GitHub

Structure 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éthodeCheminRôleNote
POST/v1/validateValidation d'une factureGratuit, sans compte, sans limite
GET/v1/rulesetsCatalogue des jeux de règlesVersions, dates d'effet, empreintes
GET/v1/rulesets/{id}Composition d'un jeu de règlesArtefacts et manifestes versionnés
POST/v1/fixCorrection structurellePro — clé API requise
POST/v1/processPipeline en un appelPro — clé API requise
POST/v1/enrichVérification des tiersPro — clé API requise
POST/v1/convertConversion entre formatsPro — clé API requise
POST/v1/evidencePack de preuve scelléEnterprise — clé API requise
POST/v1/evidence/verifyVérification d'un sceauGratuit, sans compte
GET/v1/evidence/{id}Relecture d'un packEnterprise — clé API requise
GET/v1/usageConsommation du compteSession du compte requise
GET/v1/openapiSpécification OpenAPIOpenAPI 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

passed

Facture conforme au jeu de règles épinglé. Aucune erreur sur le conteneur PDF/A-3, la syntaxe XML ou les règles Schematron.

needs_input

Donnée obligatoire manquante que seul l'émetteur possède (par exemple la référence acheteur BT-44).

blocked

Incohérence sur un champ financier. La valeur correcte est suggérée mais jamais modifiée automatiquement.

fixed

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.