Generate
Send invoice data as JSON, receive a valid XRechnung (UBL or CII) or ZUGFeRD document, conforming to EN 16931.
Receiving mandatory since 1 January 2025
Check an invoice right here against the official KoSIT rule set — free, no sign-up, every error in plain language. For software teams: a REST API that turns JSON into valid XRechnung (UBL and CII) and ZUGFeRD, and keeps up with the rule changes.
Start free, no card required: validation never counts, 25 generated invoices per month.
Request
$ curl -X POST api.normapi.de/v1/validate \
-H 'Content-Type: application/xml' \
--data-binary @invoice.xmlResponse
"acceptable": false
Generate
$ curl -X POST api.normapi.de/v1/invoices \
-H 'Content-Type: application/json' \
--data-binary @invoice-data.json \
-o invoice.xml200 invoice.xml validated before it leaves the API
XML or PDF, up to 5 MB — or just drop a file here. No sign-up, no allowance to spend.
Your file is processed in memory and discarded immediately. We never store invoice content.
One click checks the file right here — downloading is optional.
Passes validation cleanly. A good starting point for your own mapping.
File ↓The same invoice in the second permitted syntax, UN/CEFACT CII.
File ↓A hybrid of readable PDF and embedded CII invoice — produced by NormAPI generation, verified like every sample.
File ↓Without BT-10 — for public-sector invoices this holds the Leitweg-ID.
File ↓The BG-6 contact group is absent entirely — the most common mapping gap.
File ↓The amount due contradicts the totals — the classic rounding bug.
File ↓PROZENT=2 instead of PROZENT=2.00 — the notation started but not followed.
File ↓Fails at the XML schema. The business rules are never evaluated — an empty error list here does not mean "nothing wrong".
File ↓Declares MINIMUM, which is not an EN 16931 invoice. No scenario matches, so no rule runs — the outcome is neither valid nor invalid but "not checked".
File ↓Since 1 January, every company must be able to receive e-invoices.
Companies with more than €800,000 prior-year turnover must issue e-invoices.
The obligation extends to every company.
Two endpoints against one rule set. Nothing is transmitted — no Peppol access point, no mail delivery, no archiving.
Send invoice data as JSON, receive a valid XRechnung (UBL or CII) or ZUGFeRD document, conforming to EN 16931.
Upload a file and get a readable list of what is wrong — not just Schematron codes.
Every response names the version it was checked against, in the X-Normapi-Ruleset header. We keep up with new releases.
Because it is checked before it leaves the API. Every generated document goes through the same KoSIT validator an uploaded file does — not a reimplementation, but KoSIT’s own tool against the official configuration. A 200 means it passed.
That this is not a given is something we measured rather than asserted. Both datasets are CC BY 4.0:
Of eleven freely accessible checking sites, three did not process an XRechnung in UBL at all on the day of the run; three more were working from a rule set predating 2 September 2026.
Eleven online validators, the same invoice, one day →Two independent implementations of the same rule set, the same 29 documents: agreement on 22, disagreement on 7.
Validator comparison: 29 documents, two checkers →