Create ZUGFeRD invoices from JSON
Send invoice JSON, get a Factur-X / ZUGFeRD EN 16931 PDF: a rendered invoice for people and validated CII XML for software.
curl -H "Authorization: Bearer $FINEKOT_KEY" -H "Content-Type: application/json" -d @invoice.json https://api.finekot.com/v1/e-invoice
{
"format": "XRechnung 3.0 UBL",
"result": "https://api.finekot.com/f/…/RE-2026-0042-xrechnung-ubl.xml",
"totals": {"line_total": "1022.90", "tax_total": "191.36", "payable": "1214.26"},
"validation": {"valid": true, "errors": 0, "warnings": 0},
"units": 2, "cost": 0.04
}No subscription, no contract.
Per check €0.02 · 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
Create the PDF from a Node.js backend
If the validation of the result has errors, the response says so and lists them; nothing is hidden behind a success flag.
// invoice: {number, issue_date, currency, seller, buyer, payment, lines[]}
const res = await fetch("https://api.finekot.com/v1/e-invoice", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FINEKOT_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ op: "create", output: "pdf", invoice }),
});
const out = await res.json(); // X-Cost: 0.04
// out.format: "Factur-X EN 16931 PDF", out.totals.payable: "1214.26"
if (!out.validation.valid) throw new Error(JSON.stringify(out.validation.issues));
// signed link, valid 24 hours
const pdf = Buffer.from(await (await fetch(out.result)).arrayBuffer());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 you get
The PDF carries factur-x.xml, profile EN 16931 (ZUGFeRD COMFORT). Line amounts, VAT per rate and totals are computed on the server from your lines, so BR-CO-10 to BR-CO-17 hold by construction.
Before the file is returned, the XML is checked by the Factur-X XSD and, after extraction from the PDF, by the EN 16931 schematron. The PDF has PDF/A-3 metadata and an sRGB output intent; a veraPDF certificate is not issued.
The file is kept for 24 hours behind a signed link, then deleted.
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