XRechnung API: Entwickler-Leitfaden zum deutschen E-Rechnungs-Mandat

Published on February 04, 2026

Was XRechnung ist, was das deutsche B2B-E-Rechnungs-Mandat konkret verlangt, und wie Sie konforme Rechnungen nach EN 16931 per REST API senden und empfangen — ohne in XML zu ertrinken.

Wenn Sie ein Unternehmen in Deutschland betreiben oder deutsche Kunden abrechnen, fallen Sie bereits unter das 2025er E-Rechnungs-Mandat. Dieser Leitfaden erklärt, was XRechnung ist, was Sie unterstützen müssen und wie Sie es umsetzen, ohne in XML zu ertrinken. Unsere XRechnung API übernimmt jeden der unten beschriebenen Schritte; wenn Sie Anbieter vergleichen, ist das die Produktseite.

Was ist XRechnung?

XRechnung ist die deutsche Referenzumsetzung des EU-Rechnungsstandards EN 16931. Es ist ein strukturiertes XML-Format, das Maschinen durchgehend lesen können — kein OCR, kein PDF-Parsing, keine manuelle Erfassung. Für Rechnungen an Bundesbehörden ist es seit 2020 verpflichtend; seit 2025 erfasst der Geltungsbereich sämtliche inländischen B2B-Transaktionen.

XRechnung existiert in zwei XML-Syntaxen:

  • UBL (Universal Business Language) — ein OASIS-Standard, EU-weit verwendet
  • UN/CEFACT CII (Cross Industry Invoice) — älter, aber weiterhin gültig

Beide transportieren denselben semantischen Inhalt. Die meisten deutschen Behörden-Portale akzeptieren beide; bei Neuentwicklung UBL wählen.

Was das Mandat konkret verlangt

Der 2025–2028er Rollout in drei Phasen:

DatumWen betrifft esWas ändert sich
2025-01-01Alle umsatzsteuerpflichtigen UnternehmenMüssen E-Rechnungen von inländischen Lieferanten empfangen können
2027-01-01Unternehmen mit > 800.000 € JahresumsatzMüssen E-Rechnungen im inländischen B2B versenden (kleinere Unternehmen haben Schonfrist)
2028-01-01Alle Unternehmen, unabhängig von der GrößeMüssen E-Rechnungen für sämtliche inländischen B2B-Geschäfte versenden

"Empfangen" bedeutet: Ihr Kreditorenprozess kann eine strukturierte Rechnung (keine PDF) annehmen und verarbeiten, ohne dass ein Mensch Daten neu eintippt. Viele Unternehmen unterschätzen das. Wenn Ihr aktueller Workflow "Rechnung kommt als PDF-Anhang, Buchhaltung tippt sie in DATEV" ist, sind Sie nicht konform.

XRechnung vs. ZUGFeRD vs. Factur-X — wo liegt der Unterschied?

Leicht zu verwechseln. Kurzfassung:

  • XRechnung — reines XML, verwendet für Rechnungen an die deutsche öffentliche Hand und (nun auch) im B2B.
  • ZUGFeRD — hybrides Format: ein reguläres PDF/A-Dokument mit vollständiger XML-Rechnung eingebettet. Menschen sehen das PDF; Maschinen parsen das XML. Im deutschen B2B beliebt, weil es Legacy-Prozesse schont.
  • Factur-X — französisches Äquivalent zu ZUGFeRD. Technisch identisch, nur anderes Branding.

Eine gut entworfene API behandelt alle drei Formate austauschbar. Das Datenmodell ist dasselbe — nur die Verpackung unterscheidet sich.

Das minimale Datenmodell

Auf semantischer Ebene muss jede EN-16931-Rechnung enthalten:

  • Rechnungsnummer, Ausstellungsdatum, Fälligkeit
  • Verkäufer-Identifikation (Name, Anschrift, USt-IdNr.)
  • Käufer-Identifikation plus Leitweg-ID bei Behörden-Empfängern
  • Rechnungspositionen mit Beschreibung, Menge, Einzelpreis
  • USt-Aufschlüsselung pro Steuersatz
  • Summen (netto, Steuer, brutto)
  • Zahlungsbedingungen und Bankverbindung

Das Feld, das Neueinsteiger am häufigsten übersehen, ist die Leitweg-ID — eine Routing-Kennung, die für Behörden-Empfänger zwingend ist. Sie ist nicht optional und nicht offensichtlich (der Käufer liefert sie). B2B-Rechnungen benötigen sie nicht.

Eine Rechnung über die API validieren

So sieht ein typischer Validierungs-Aufruf aus:

curl -X POST https://api.postscale.io/v1/invoices/validate \
  -H "Authorization: Bearer ps_live_..." \
  -H "Content-Type: application/xml" \
  --data-binary @invoice.xml

Antwort bei gültiger Rechnung:

{
  "valid": true,
  "format": "xrechnung-ubl",
  "standard": "EN 16931",
  "profile": "urn:cen.eu:en16931:2017",
  "errors": [],
  "warnings": []
}

Bei ungültiger Rechnung ist die Antwort strukturiert, damit Sie Felder programmatisch korrigieren können:

{
  "valid": false,
  "errors": [
    {
      "rule": "BR-CO-15",
      "path": "/Invoice/LegalMonetaryTotal/TaxInclusiveAmount",
      "message": "Rechnungsbetrag muss Summe der Positionen plus Steuer entsprechen"
    }
  ]
}

Ein gut entworfener Validator liefert sowohl die Regel-ID (aus dem offiziellen Schematron) als auch eine lesbare Meldung. Erstere für Ihre Testsuite; letztere für die Fehleranzeige im UI.

Eine Rechnung versenden

Nach erfolgreicher Validierung reduziert sich der Versand auf eine von zwei Optionen:

  1. E-Mail-Zustellung — XML (oder PDF/A mit eingebettetem XML bei ZUGFeRD) an eine reguläre E-Mail anhängen und senden. Funktioniert für die meisten B2B-Fälle.
  2. Peppol — für grenzüberschreitende EU- oder Behörden-Zustellung. Peppol ist ein geschlossenes Netzwerk von Access Points; Sie veröffentlichen Ihre Empfänger-ID und Käufer senden über ihren eigenen Access Point.
curl -X POST https://api.postscale.io/v1/invoices/send \
  -H "Authorization: Bearer ps_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "format": "zugferd",
    "from": "rechnung@ihrfirma.de",
    "to": "buchhaltung@kunde.de",
    "invoice_xml": "<base64-kodiertes-xml>",
    "pdf_template": "standard"
  }'

Eingehende Rechnungen empfangen und parsen

Das ist die Seite, die die meisten Unternehmen vernachlässigen. Ab 2025-01-01 müssen Sie eingehende E-Rechnungen annehmen. Minimalsetup:

  1. Dedizierter Posteingang, z.B. rechnungen@ihrfirma.de
  2. MX-Eintrag, der diesen Posteingang durch eine Inbound-E-Mail-API leitet
  3. Webhook, der bei jeder Nachricht feuert und parsed-invoice-JSON anhängt
  4. Ihr Buchhaltungssystem liest das JSON und bucht

Mit Postscale:

{
  "id": "in_01HY...",
  "to": "rechnungen@ihrfirma.de",
  "from": "rechnung@lieferant.de",
  "subject": "Rechnung #4421",
  "attachments": [
    {
      "filename": "rechnung-4421.xml",
      "content_type": "application/xml",
      "parsed_invoice": {
        "invoice_number": "4421",
        "issue_date": "2026-04-15",
        "seller": { "name": "Lieferant GmbH", "vat_id": "DE123456789" },
        "buyer": { "name": "Sie GmbH", "vat_id": "DE987654321" },
        "total_net": 1250.00,
        "total_vat": 237.50,
        "total_gross": 1487.50,
        "currency": "EUR",
        "line_items": [...]
      }
    }
  ]
}

Das parsed_invoice-Feld bedeutet: Ihr Kreditoren-Workflow berührt niemals XML direkt — er arbeitet mit JSON und typisierten Feldern.

Was Sie testen sollten

Wenn Sie das heute bauen, sind das die Must-Pass-Testfälle:

  1. Gültige UBL-Rechnung von einem deutschen Lieferanten — Parse erfolgreich, Summen stimmen.
  2. Gültige CII-Rechnung — gleiche Daten, andere Syntax; Ihr Code sollte normalisieren.
  3. ZUGFeRD-PDF mit eingebettetem XML — XML extrahieren, validieren, PDF-Rendering ignorieren.
  4. Rechnung mit Leitweg-ID — Pflichtfeld für Behörden-Empfänger.
  5. Rechnung mit fehlendem Pflichtfeld — Ihr System weist sie sauber zurück, mit korrigierbarem Fehler.
  6. Rechnung mit Reverse-Charge-USt — Edge Case, den naive Parser brechen.
  7. Gutschrift (Rechnungskorrektur) — gleiches Format, negative Beträge.

Diese Fälle gegen Ihre Staging-Umgebung laufen lassen, bevor Sie einen einzigen produktiven Posteingang öffnen.

Wichtigste Erkenntnisse

  • E-Rechnung ist XML, nicht ein PDF mit XML-Anhang. Auf die strukturierten Daten bauen, nicht auf die Pixel.
  • Empfangen ist ab 2025 Pflicht; Versenden wird bis 2028 schrittweise ausgerollt. Mit Empfang starten.
  • XRechnung, ZUGFeRD und Factur-X austauschbar behandeln — gleiches Datenmodell.
  • Validator verwenden, der strukturierte Fehler liefert, nicht ein generisches "ungültige Rechnung".
  • Die Leitweg-ID ist das Feld, das alle übersehen.

Wenn Sie das umsetzen, übernimmt unsere Invoices API Validierung, Versand und Inbound-Parsing über einen einzigen, EU-gehosteten Endpoint. Oder lesen Sie die vollständige Invoice-Dokumentation als Referenz.