Software vendors and developers
Send invoice data as JSON, receive a valid XRechnung (UBL or CII) or ZUGFeRD document, conforming to EN 16931. Every response names the rule set it was checked against, in the X-Normapi-Ruleset header.
Generated from JSON and checked with the official KoSIT validator before you get the file. For your software, or for a single invoice in the browser.

Free and without signing up, with the same KoSIT validator as the API. Every error with what it means and how to fix it.
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 on a server in the EU and discarded immediately. We never store invoice content.
One click checks the file right here — downloading is optional.
A client for TypeScript, examples for PHP and Java, and any language that speaks HTTP. The server works out the totals.
import { generateInvoice } from '@normapi/client'
const { xml, rulesetVersion } = await generateInvoice({
invoiceNumber: 'RE-2026-0815',
issueDate: '2026-08-13',
currency: 'EUR',
buyerReference: '04011000-12345-03',
seller: { name: 'Muster Software GmbH', vatId: 'DE123456789' /* … */ },
buyer: { name: 'Beispiel Handel AG' /* … */ },
lines: [
{ name: 'Software licence', quantity: 3, unitPrice: '199.00', vatRate: 19 },
],
}, { apiKey: process.env.NORMAPI_API_KEY })curl -X POST https://api.normapi.de/v1/invoices \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $NORMAPI_API_KEY" \
--data-binary @invoice.json \
-o invoice.xml
# As a ZUGFeRD PDF: ?syntax=zugferd and -o invoice.pdf<?php
$ch = curl_init('https://api.normapi.de/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => file_get_contents('invoice.json'),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . getenv('NORMAPI_API_KEY'),
],
]);
$xml = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) === 200) {
file_put_contents('invoice.xml', $xml);
}
curl_close($ch);XRechnung 3.0.2 in UBL or CII, ZUGFeRD 2 / Factur-X as PDF/A-3: as XRechnung for public authorities, by EN 16931 for businesses. The ZUGFeRD PDF on your own letterhead if you like, uploaded once in your account.
For example, case 01 of the sample library, a standard invoice at 19 %: the request, and the three files it becomes, as the KoSIT validator accepted them.
Instead of a Schematron expression, your team gets the meaning, the cause and the fix. For 303 rules, in English and German.
{
"code": "BR-DE-15",
"severity": "ERROR",
"explanation": {
"meaning": "Every XRechnung needs a buyer reference in BT-10 — for invoices to a German public authority that is the Leitweg-ID. …",
"fix": "Put the Leitweg-ID or buyer reference supplied by your customer into BT-10 — cbc:BuyerReference in UBL, ram:BuyerReference in CII. …",
"url": "https://normapi.com/en/errors#BR-DE-15"
}
}As a connector in Claude and a plugin in ChatGPT, NormAPI checks an attached e-invoice, reads a received one and explains any rule, with no account. With your account, both create new ones too.

Everything runs against the same KoSIT 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. Every response names the rule set it was checked against, in the X-Normapi-Ruleset header.
Fill in a form, download XRechnung or a ZUGFeRD PDF — no software of your own, no sign-up.
Open a received e-invoice in readable form and check it — with a plain list of what is wrong, not just Schematron codes.
The price at high volume, SLA, outages, rule-set updates and data processing — on one page, before you integrate.
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 other company; small businesses under § 19 UStG stay exempt.
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. All three datasets are CC BY 4.0:
810 public sample invoices from 19 publishers, checked with the KoSIT validator against ruleset v2026-08-31 on 19 October 2026: 549 pass.
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.
Two independent implementations of the same rule set, the same 29 documents: agreement on 22, disagreement on 7.
As of 5 November 2026 · all prices net per month
50 invoices a month free, no credit card. Then from €19 a month.