ZUGFeRD and XRechnung through one API

From 1 January 2027, German businesses with more than €800,000 in prior-year turnover must issue structured B2B invoices; from 1 January 2028, all of them must. invoiceapi.io builds those invoices from your data — validated, archived and independently verifiable.

For developers who issue invoices from their own application and would rather not build format conformance, retention and traceability themselves.

Hosted in Germany: Hetzner, Falkenstein. The object store refuses to start outside the EU.

One call. Validated documents back.

curl -X POST https://invoiceapi.io/v1/templates/$TEMPLATE_ID/invoices \
  -H "Authorization: Bearer $INVOICEAPI_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d @rechnung.json

{
  "seller": {
    "name": "Muster Software GmbH",
    "vatId": "DE123456789",
    "electronicAddress": "[email protected]",
    "address": {
      "line1": "Beispielstraße 12",
      "city": "Berlin",
      "postCode": "10115",
      "countryCode": "DE"
    },
    "contact": {
      "name": "Max Muster",
      "phone": "+49 30 1234567",
      "email": "[email protected]"
    }
  },
  "buyer": {
    "name": "Kunde AG",
    "vatId": "DE987654321",
    "electronicAddress": "[email protected]",
    "address": {
      "line1": "Kundenweg 1",
      "city": "München",
      "postCode": "80331",
      "countryCode": "DE"
    }
  },
  "invoice": {
    "number": "R-2026-1001",
    "issueDate": "2026-07-01",
    "dueDate": "2026-07-31",
    "currency": "EUR",
    "buyerReference": "KND-2026-77"
  },
  "items": [
    {
      "name": "Beratung",
      "quantity": "8",
      "unit": "HUR",
      "unitPrice": "120.00",
      "vatRate": "19"
    }
  ],
  "payment": {
    "iban": "DE75512108001245126199",
    "bic": "SOGEDEFF",
    "accountName": "Muster Software GmbH",
    "reference": "R-2026-1001"
  }
}

You create an invoice profile and a template once, in the dashboard. After that every invoice is a single call. Test mode is the same path with an sk_test_ key.

When validation fails you get the rule id back — in German and English for the 81 catalogued rules, with its BT code and payload path where the rule maps to one; for anything else, the raw, untranslated KoSIT text. Nothing is returned and nothing is archived.

One payload, two formats

ZUGFeRD

PDF/A-3U with embedded CII XML. People see a document, systems read the data.

XRechnung 3.0.2

Plain XML to EN 16931 — for public-sector buyers and anyone else who expects XML.

Archive

Every document is stored and never re-rendered on read. You get back the same bytes that were validated.

How you can check all of this

Formats
ZUGFeRD as PDF/A-3U (Mustang), XRechnung 3.0.2 as XML. Invoice currency is EUR.
Validation
KoSIT validator 1.6.2, scenario v2026-01-31, plus veraPDF for PDF/A-3U conformance. Validation is a hard gate: if it fails, no file is produced.
Location
Hetzner, Falkenstein (fsn1). The object store's region and endpoint are checked at startup; outside the EU the application refuses to boot.
Retention
§ 147(4) AO: counted from the end of the calendar year, either 8 or 10 years. A legal hold suspends deletion.
Hash chain
One running SHA-256 chain per organisation, over the input data and the output files. A later alteration shows up when the chain is recomputed. GoBD-oriented.
Error messages
The 81 catalogued KoSIT rules come back as plain German and English sentences, with the EN 16931 BT code and payload path where the rule maps to one. An uncatalogued rule instead returns the raw, untranslated KoSIT report text.
Export
A ZIP with the original files, a CSV and a chain proof an auditor can recompute without us.

Pricing

Sandbox

€0 per month

0 Live documents per month
1 Invoice profile

Starter

€49 per month (net)

100 Live documents per month
1 Invoice profile

Pro

€99 per month (net)

500 Live documents per month
5 Invoice profiles

Business

€249 per month (net)

2,500 Live documents per month
Unlimited invoice profiles

Test mode does not count against the document allowance. Test invoices carry a TESTRECHNUNG watermark.

All amounts are net, plus VAT.