XRechnung validator API
The official KoSIT and EN 16931 rules behind one HTTP call. No Java, no validator jar, no configuration scenarios to maintain.
curl -H "Authorization: Bearer $FINEKOT_KEY" -F file=@invoice.xml https://api.finekot.com/v1/e-invoice
{
"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
}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 folder of generated XRechnung files
rules=xrechnung forces the KoSIT rule set even when the specification identifier is wrong, so BR-DE-21 shows up instead of a silent EN 16931-only check.
import os, pathlib, requests
API = "https://api.finekot.com/v1/e-invoice"
KEY = os.environ["FINEKOT_KEY"]
for path in sorted(pathlib.Path("out").glob("*.xml")):
r = requests.post(API, headers={"Authorization": f"Bearer {KEY}"},
files={"file": path.open("rb")},
data={"rules": "xrechnung"}, # force KoSIT rules
timeout=60)
r.raise_for_status()
rep = r.json()
print(path.name, rep["verdict"], rep["errors"], "errors")
for i in rep["issues"]:
if i["severity"] == "error":
print(" ", i["rule"], i["location"])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.
The verdict, profile, totals and every rule violation appear here.
What is checked
Each file is parsed as UBL 2.1 or UN/CEFACT CII. With rules=auto the profile comes from BT-24; XRechnung profiles get EN 16931 1.3.17 plus KoSIT XRechnung schematron 2.6.0.
Every violation is returned with rule id (BR-DE-15, BR-CO-16 …), severity (error, warning, info), the original rule message and the XPath of the element. errors = 0 means a receiver that runs the same KoSIT rules would accept the file.
XSD, PDF/A-3 and Peppol BIS-specific rules are not checked. The uploaded file is processed in memory on servers in Germany and not stored.
Price in plain numbers
A prepaid balance, no subscription. Charged only for a successful answer; errors are free.
A new key comes with €1 of free credit: 50 validations.
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.
No key in this browser yet.
For developers
Same checks over REST and MCP. One header, JSON out.
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.02curl 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.04claude mcp add --transport http finekot https://api.finekot.com/mcp --header "Authorization: Bearer fk_live_…"
Full reference: /llms.txt · /openapi.json · /.well-known/mcp.json