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

ZUGFeRD API for generated invoices

€0.02 per check · No subscription, no contract.

Generators check the XSD. The EN 16931 business rules — totals, VAT breakdown, mandatory fields — need schematron. This API runs them in one call.

Request
curl -H "Authorization: Bearer $FINEKOT_KEY" -F file=@invoice.xml https://api.finekot.com/v1/e-invoice
Response (shortened)
{
  "valid": false,
  "verdict": "technically_invalid",
  "profile": {"name": "XRechnung 3.0"},
  "errors": 3, "warnings": 1,
  "issues": [
    {"rule": "BR-DE-15", "severity": "error",
     "message": "Das Element \"Buyer reference\" (BT-10) muss übermittelt werden.",
     "location": "/ubl:Invoice[1]"},
    …
  ],
  "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 drafthorse output before it leaves your system

drafthorse validates the XSD in serialize(); a file can pass it and still break BR-CO-14 or BR-S-08. The API returns those violations with XPath.

Python · drafthorse
import os, requests
from drafthorse.models.document import Document

doc = Document()
# … fill doc.context, doc.header and doc.trade as in the drafthorse README
xml = doc.serialize(schema="FACTUR-X_EN16931")   # drafthorse checks the XSD here

r = requests.post("https://api.finekot.com/v1/e-invoice",
                  headers={"Authorization": f"Bearer {os.environ['FINEKOT_KEY']}"},
                  files={"file": ("factur-x.xml", xml, "application/xml")},
                  timeout=60)
rep = r.json()
if not rep["valid"]:   # business rules BR-*, BR-CO-*, BR-S-*: not covered by the XSD
    raise SystemExit([(i["rule"], i["message"]) for i in rep["issues"]
                      if i["severity"] == "error"])

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.

XSD is not enough

The Factur-X XSD checks structure: element names, order, data types. EN 16931 adds about 200 business rules on top: sums must add up (BR-CO-10 to BR-CO-17), each VAT category needs its breakdown (BR-S-*, BR-AE-*), mandatory fields must be filled.

The API reads the profile from the guideline id and applies EN 16931 1.3.17, plus KoSIT XRechnung rules for the XRECHNUNG profile. MINIMUM and BASIC WL are reported as not EN 16931 invoices.

To build the PDF instead of only checking it, send invoice JSON with op=create and output=pdf: €0.04 per document.

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