Validate, parse, generate and convert XRechnung, ZUGFeRD and Factur-X — maintained against format updates so your team doesn't have to.
EN 16931 (BR, BR-CO, VAT categories), XRechnung (BR-DE, Leitweg-ID), Peppol BIS 3.0 and French rules (SIREN/SIRET, VAT) — every finding with a rule id and explainer page.
UBL, CII or hybrid PDF in — normalized EN 16931 JSON out. One schema for all formats, amounts as decimal strings.
Build EN 16931 XML (CII/UBL/Peppol BIS 3.0/XRechnung 3.0) from a JSON model — or convert an existing invoice between formats. Factur-X/PDF-A3 is embedded server-side.
The identical container image runs in your infrastructure — invoice data never leaves your network. One binary, no database.
Every report exposes an engine and a ruleset version (calendar-based, e.g. 2026.07); so do /v1/health and the WASM bh_version(). The ruleset bumps when rules are added or tightened — log it and any result stays reproducible.
curl -s -X POST "https://api.billhorse.com/v1/validate?lang=en" \
-H "Authorization: Bearer $BILLHORSE_API_KEY" \
--data-binary @invoice.pdf
{
"valid": false,
"profile": { "label": "Factur-X EN 16931", "en16931": true },
"findings": [
{ "id": "BR-CO-16", "severity": "error",
"expected": "178.50", "actual": "170.00", ... }
]
}Tested against the official KOSIT test suite (86/86) and the FNFE Factur-X corpus (7/7). Processing happens in memory only — invoices are never stored.
Build EN 16931 XML (CII, UBL, Peppol BIS 3.0 or XRechnung 3.0) from a JSON model, or convert an existing invoice between formats. Factur-X/PDF-A3 (embedded CII inside a PDF/A-3) is produced server-side.
# Generate XML from a JSON invoice model (format=cii | ubl | peppol | xrechnung)
curl -s -X POST "https://api.billhorse.com/v1/generate?format=cii" \
-H "Authorization: Bearer $BILLHORSE_API_KEY" \
-H "Content-Type: application/json" \
--data @invoice-model.json > invoice.xml
# Generate an XRechnung 3.0 UBL document (German KOSIT CIUS)
curl -s -X POST "https://api.billhorse.com/v1/generate?format=xrechnung" \
-H "Authorization: Bearer $BILLHORSE_API_KEY" \
-H "Content-Type: application/json" \
--data @invoice-model.json > invoice-xrechnung.xml
# Convert an existing invoice (UBL / CII / hybrid PDF) to another syntax
curl -s -X POST "https://api.billhorse.com/v1/convert?format=ubl" \
-H "Authorization: Bearer $BILLHORSE_API_KEY" \
--data-binary @invoice.xml > invoice-ubl.xmlRuns entirely in your browser via WebAssembly — your invoice data never leaves the page.
Sign up free — no credit card, no sales call. 100 units/month free, then pay only for what you need.
Start free