Factlint API documentation

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

MethodPathRoleNote
POST/v1/validateValidate an invoiceFree, no account, no limit
GET/v1/rulesetsCatalogue of rule setsVersions, effective dates, fingerprints
GET/v1/rulesets/{id}Composition of one rule setVersioned artefacts and manifests
POST/v1/fixStructural correctionPro — API key required
POST/v1/processThe whole pipeline in one callPro — API key required
POST/v1/enrichThird-party checksPro — API key required
POST/v1/convertConversion between formatsPro — API key required
POST/v1/evidenceSealed evidence packEnterprise — API key required
POST/v1/evidence/verifyVerify a sealFree, no account
GET/v1/evidence/{id}Read back an evidence packEnterprise — API key required
GET/v1/usageAccount consumptionAccount session required
GET/v1/openapiOpenAPI specificationOpenAPI 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

passed

The invoice conforms to the pinned rule set. No error on the PDF/A-3 container, the XML syntax or the Schematron rules.

needs_input

A mandatory value is missing that only the issuer holds (the buyer reference BT-44, for instance).

blocked

An inconsistency on a financial field. The correct value is suggested but never changed automatically.

autofixed

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.

Java / Spring
v1.2.0
Node.js / TypeScript
v1.1.4
PHP 8+
v1.0.8