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.
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"));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 ansehenAufbau 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
| Methode | Pfad | Rolle | Hinweis |
|---|---|---|---|
| POST | /v1/validate | Prüfung einer Rechnung | Kostenlos, ohne Konto, ohne Begrenzung |
| GET | /v1/rulesets | Katalog der Regelwerke | Versionen, Wirksamkeitsdaten, Fingerabdrücke |
| GET | /v1/rulesets/{id} | Zusammensetzung eines Regelwerks | Versionierte Artefakte und Manifeste |
| POST | /v1/fix | Strukturelle Korrektur | Pro — API-Schlüssel erforderlich |
| POST | /v1/process | Pipeline in einem Aufruf | Pro — API-Schlüssel erforderlich |
| POST | /v1/enrich | Prüfung Dritter | Pro — API-Schlüssel erforderlich |
| POST | /v1/convert | Umwandlung zwischen Formaten | Pro — API-Schlüssel erforderlich |
| POST | /v1/evidence | Versiegeltes Nachweispaket | Enterprise — API-Schlüssel erforderlich |
| POST | /v1/evidence/verify | Prüfung eines Siegels | Kostenlos, ohne Konto |
| GET | /v1/evidence/{id} | Erneutes Lesen eines Pakets | Enterprise — API-Schlüssel erforderlich |
| GET | /v1/usage | Verbrauch des Kontos | Kontositzung erforderlich |
| GET | /v1/openapi | OpenAPI-Spezifikation | OpenAPI 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
Die Rechnung entspricht dem angehefteten Regelwerk. Kein Fehler am PDF/A-3-Container, an der XML-Syntax oder an den Schematron-Regeln.
Es fehlt ein Pflichtwert, den nur der Aussteller kennt (etwa die Käuferreferenz BT-44).
Eine Unstimmigkeit in einem Betragsfeld. Der richtige Wert wird vorgeschlagen, aber nie automatisch geändert.
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.