Finekot API
EN 16931 · XRechnung 3.0 · ZUGFeRD / Factur-X

Factur-X validator

€0.02 per check · No subscription, no contract.

Drop a Factur-X PDF here or post it to the API. The CII XML inside is checked against the EN 16931 rules; every violation comes with rule id and XPath.

Request
curl -H "Authorization: Bearer $FINEKOT_KEY" -F file=@invoice.pdf https://api.finekot.com/v1/e-invoice
Response (shortened)
{
  "valid": true,
  "verdict": "technically_valid",
  "container": "pdf",
  "attachment": "factur-x.xml",
  "profile": {"name": "Factur-X / ZUGFeRD EN 16931 (COMFORT)"},
  "errors": 0, "warnings": 0,
  "issues": [],
  "cost": 0.02, "balance": 0.98
}
Price per call€0.02per check

No subscription, no contract.

create from JSON €0.04 · PDF → XRechnung €0.10

A subscription bills the same monthly plan for 10 invoices or 1,000. Here you prepay any amount and pay per call; unused credit stays.

10 free checks a day · €1 free with a key · then €0.02 per check

Check a PDF built with the factur-x Python library

The factur-x library embeds the XML and checks it against the XSD. The EN 16931 business rules are a separate step: this call.

Python · factur-x
import os, requests
from facturx import generate_from_file

# invoice.pdf: your rendered invoice; xml: CII EN 16931 bytes from your generator
generate_from_file("invoice.pdf", xml, output_pdf_file="invoice-facturx.pdf")
# factur-x checks the XML against the Factur-X XSD; business rules are not checked

with open("invoice-facturx.pdf", "rb") as f:
    r = requests.post("https://api.finekot.com/v1/e-invoice",
                      headers={"Authorization": f"Bearer {os.environ['FINEKOT_KEY']}"},
                      files={"file": f}, timeout=60)
rep = r.json()
print(rep["attachment"], rep["profile"]["name"], rep["verdict"], rep["errors"])

Validate an e-invoice

Official EN 16931 and XRechnung rules. Errors with rule id, message and location.

10 free checks a day · €1 free with a key · then €0.02 per check

Processed on servers in Germany (Hetzner, Falkenstein). The uploaded file is checked in memory and not stored.

Result

The verdict, profile, totals and every rule violation appear here.

Factur-X and the EN 16931 rules

Factur-X 1.0 (France) and ZUGFeRD 2.x (Germany) are the same format: a PDF/A-3 with a CII XML attachment. Profiles MINIMUM and BASIC WL carry too little data to be EN 16931 invoices; BASIC, EN 16931 and EXTENDED are checked by the rules.

In France, receiving e-invoices becomes mandatory for all businesses from 1 September 2026; Factur-X is one of the base formats there. The validator covers the EN 16931 core, not the French platform rules.

PDF/A-3 conformance of the container is not checked.

Price in plain numbers

A prepaid balance, no subscription. Charged only for a successful answer; errors are free.

One validationper document€0.02
One e-invoice built from JSONXML or Factur-X PDF€0.04
PDF invoice → XRechnung / ZUGFeRDread €0.06 + build €0.04€0.10

A new key comes with €1 of free credit: 50 validations.

Pack€5 250 validations or 50 PDF conversions
Pack€20 1 000 validations or 200 PDF conversions

Credits never expire. No subscription.

Apple Pay, Google Pay or card on the monobank page. The key is created for you if you have none.

Your key and balance—

No key in this browser yet.

For developers

Same checks over REST and MCP. One header, JSON out.

validate
curl https://api.finekot.com/v1/e-invoice \
  -H "Authorization: Bearer fk_live_…" \
  -F file=@invoice.xml

# → {"valid":false,"errors":2,"issues":[{"rule":"BR-DE-15",…}]}
# X-Cost: 0.02
create
curl https://api.finekot.com/v1/e-invoice \
  -H "Authorization: Bearer fk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"op":"create","output":"pdf","invoice":{…}}'

# → Factur-X PDF url + validation report · X-Cost: 0.04
MCP
claude mcp add --transport http finekot https://api.finekot.com/mcp --header "Authorization: Bearer fk_live_…"

API guides