One call, one file, one report
The complete specification of the compliance API for Factur-X, XRechnung, CII and UBL. Free, with no key, no account and no volume limit on validation.
Try it right now
Send any Factur-X (PDF/A-3), CII or UBL 2.1 invoice up to 10 MB as an HTTP multipart request:
curl -X POST https://api.factlint.com/v1/validate \ -F "file=@facture.pdf" \ -F "ruleset=eu-en16931-2026-08" \ -F "pinned=true"
Anatomy of the JSON response
A non-compliant invoice returns HTTP 200 OK with a business status in the body (status: "needs_input" or "blocked"). HTTP 4xx errors only ever concern malformed requests.
{
"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 }
}Available endpoints
| Method | Path | Role | Note |
|---|---|---|---|
| POST | /v1/validate | Validate an invoice | Free, no account, no limit |
| GET | /v1/rulesets | Catalogue of rule sets | Versions, effective dates, fingerprints |
| GET | /v1/rulesets/{id} | Composition of one rule set | Versioned artefacts and manifests |
| POST | /v1/fix | Structural correction | Pro — API key required |
| POST | /v1/process | The whole pipeline in one call | Pro — API key required |
| POST | /v1/enrich | Third-party checks | Pro — API key required |
| POST | /v1/convert | Conversion between formats | Pro — API key required |
| POST | /v1/evidence | Sealed evidence pack | Enterprise — API key required |
| POST | /v1/evidence/verify | Verify a seal | Free, no account |
| GET | /v1/evidence/{id} | Read back an evidence pack | Enterprise — API key required |
| GET | /v1/usage | Account consumption | Account session required |
| GET | /v1/openapi | OpenAPI specification | OpenAPI 3.0 JSON |
For the Pro and Enterprise endpoints, pass your key in the Authorization: Bearer flk_live_… header. A missing or invalid key returns 401, a required subscription returns 402, and an insufficient tier returns 403. Validation on /v1/validate stays free and needs no key.
What the business statuses mean
The invoice conforms to the pinned rule set. No error on the PDF/A-3 container, the XML syntax or the Schematron rules.
A mandatory value is missing that only the issuer holds (the buyer reference BT-44, for instance).
An inconsistency on a financial field. The correct value is suggested but never changed automatically.
The structural defects have been corrected. The XPath diff comes with the response.
Official SDKs
Typed client libraries are published separately, so integration takes two lines of code.