Dokumentation der Factlint-API

Ein Aufruf, eine Datei, ein Bericht

Die vollständige Spezifikation der Prüf-API für Factur-X, XRechnung, CII und UBL. Kostenlos, ohne Schlüssel, ohne Konto und ohne Mengenbegrenzung bei der Prüfung.

Sofort ausprobieren

Senden Sie eine beliebige Rechnung als Factur-X (PDF/A-3), CII oder UBL 2.1 bis 10 MB als HTTP-Multipart-Anfrage:

curl -X POST https://api.factlint.com/v1/validate \
  -F "[email protected]" \
  -F "ruleset=eu-en16931-2026-08" \
  -F "pinned=true"

Offizielle Clients

Vier schlanke Clients ohne Abhängigkeit, die dieselbe API ansprechen: Node.js, Python, PHP und Java. Das öffentliche Repository enthält außerdem eine Seite pro Fehlercode mit dem Satz, den der Prüfer ausgibt, die versiegelten Regelwerke mit ihren Prüfsummen und Testrechnungen zum Ausprobieren ohne Schlüssel.

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"));

Die Pakete sind auf dem Weg zu npm, PyPI, Packagist und Maven Central. Bis dahin erklärt die README jedes Clients die Installation aus dem Repository.

Repository auf GitHub ansehen

Aufbau der JSON-Antwort

Eine nicht konforme Rechnung liefert HTTP 200 OK mit einem fachlichen Status im Rumpf (status: "needs_input" oder "blocked"). HTTP-4xx-Fehler betreffen ausschließlich fehlerhafte Anfragen.

{
  "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 }
}

Verfügbare Endpunkte

MethodePfadRolleHinweis
POST/v1/validatePrüfung einer RechnungKostenlos, ohne Konto, ohne Begrenzung
GET/v1/rulesetsKatalog der RegelwerkeVersionen, Wirksamkeitsdaten, Fingerabdrücke
GET/v1/rulesets/{id}Zusammensetzung eines RegelwerksVersionierte Artefakte und Manifeste
POST/v1/fixStrukturelle KorrekturPro — API-Schlüssel erforderlich
POST/v1/processPipeline in einem AufrufPro — API-Schlüssel erforderlich
POST/v1/enrichPrüfung DritterPro — API-Schlüssel erforderlich
POST/v1/convertUmwandlung zwischen FormatenPro — API-Schlüssel erforderlich
POST/v1/evidenceVersiegeltes NachweispaketEnterprise — API-Schlüssel erforderlich
POST/v1/evidence/verifyPrüfung eines SiegelsKostenlos, ohne Konto
GET/v1/evidence/{id}Erneutes Lesen eines PaketsEnterprise — API-Schlüssel erforderlich
GET/v1/usageVerbrauch des KontosKontositzung erforderlich
GET/v1/openapiOpenAPI-SpezifikationOpenAPI 3.1 JSON — öffnen

Für die Pro- und Enterprise-Endpunkte übergeben Sie Ihren Schlüssel im Header Authorization: Bearer flk_live_…. Ein fehlender oder ungültiger Schlüssel liefert 401, ein erforderliches Abonnement liefert 402, eine nicht ausreichende Stufe liefert 403. Die Prüfung über /v1/validate bleibt kostenlos und ohne Schlüssel.

Was die fachlichen Status bedeuten

passed

Die Rechnung entspricht dem angehefteten Regelwerk. Kein Fehler am PDF/A-3-Container, an der XML-Syntax oder an den Schematron-Regeln.

needs_input

Es fehlt ein Pflichtwert, den nur der Aussteller kennt (etwa die Käuferreferenz BT-44).

blocked

Eine Unstimmigkeit in einem Betragsfeld. Der richtige Wert wird vorgeschlagen, aber nie automatisch geändert.

fixed

Die strukturellen Mängel wurden behoben. Das XPath-Diff liegt der Antwort bei.

Offizielle SDKs

Vier auf GitHub veröffentlichte Clients, mit der Fehlercode-Referenz und Testrechnungen. Die API spricht auch einfaches HTTP: Die Beispiele links hängen von keiner Bibliothek ab.