XRechnung für Entwickler: Das UBL-Format im Detail
XRechnung ist der deutsche Standard für elektronische Rechnungen an die öffentliche Verwaltung – und seit der E-Rechnungspflicht im B2B-Bereich auch darüber hinaus relevant. Dieser Artikel erklärt das Format aus Entwicklersicht: Wir zerlegen eine vollständige Beispielrechnung in der UBL-Syntax und erläutern die wichtigsten Felder.
Was ist eine XRechnung?
Eine XRechnung ist keine PDF-Datei, sondern eine strukturierte, maschinenlesbare XML-Datei. Der Standard wird von der Koordinierungsstelle für IT-Standards (KoSIT) im Auftrag des IT-Planungsrats betrieben. Aktuell gültig ist Version 3.0.2 (seit Juli 2024, zuletzt aktualisiert mit dem Bugfix-Release „Winter 2025/26“).
Technisch ist XRechnung eine CIUS (Core Invoice Usage Specification) der europäischen Norm EN 16931: eine nationale Konkretisierung, die die europäischen Vorgaben um deutsche Geschäftsregeln ergänzt. Wie die EN 16931 erlaubt XRechnung zwei XML-Syntaxen:
- UBL 2.1 (Universal Business Language, OASIS-Standard, ISO/IEC 19845)
- UN/CEFACT Cross Industry Invoice (CII)
Dieser Artikel verwendet UBL. Die CII-Syntax kommt vor allem bei ZUGFeRD zum Einsatz.
Rechtlicher Rahmen
- B2G: Die EU-Richtlinie 2014/55/EU verpflichtet öffentliche Auftraggeber, EN-16931-konforme E-Rechnungen zu empfangen und zu verarbeiten. Lieferanten des Bundes müssen ihre Rechnungen seit dem 27.11.2020 elektronisch einreichen (§ 3 E-Rechnungsverordnung); Pflichtangabe ist dabei die Leitweg-ID (§ 5 ERechV).
- B2B: Seit dem 01.01.2025 ist die E-Rechnung nach § 14 UStG der Standard für Umsätze zwischen inländischen Unternehmern. Empfangen können muss sie seitdem jedes Unternehmen; für die Ausstellung gelten Übergangsfristen nach § 27 Abs. 38 UStG (mit Zustimmung des Empfängers: sonstige Rechnungen bis Ende 2026, bei Vorjahresumsatz bis 800.000 € bis Ende 2027).
- Das BMF-Schreiben vom 15.10.2024 (geändert durch das Schreiben vom 15.10.2025) bestätigt XRechnung ausdrücklich als zulässiges Format.
Anatomie einer XRechnung
1. Header und Metadaten
<?xml version="1.0" encoding="utf-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>RE-2026-001</cbc:ID>
<cbc:IssueDate>2026-06-15</cbc:IssueDate>
<cbc:DueDate>2026-07-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:Note>Notiz für die XRechnung</cbc:Note>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>PROJEKT-2026-XR</cbc:BuyerReference>
</Invoice>
CustomizationID: Die Spezifikationskennung. Sie erklärt die Rechnung als konform zur EN 16931 und zum Standard XRechnung 3.0.ProfileID: Die Prozesskennung des Geschäftsprozesses; Standardwert ist der Peppol-Rechnungsprozessurn:fdc:peppol.eu:2017:poacc:billing:01:1.0.ID(BT-1): Die eindeutige Rechnungsnummer.IssueDate(BT-2) /DueDate(BT-9): Ausstellungs- und Fälligkeitsdatum im FormatYYYY-MM-DD.InvoiceTypeCode(BT-3): Der Rechnungstyp nach UNTDID 1001; „380“ ist die Handelsrechnung.DocumentCurrencyCode(BT-5): Währung nach ISO 4217.BuyerReference(BT-10): Die Käuferreferenz. In Rechnungen an deutsche Behörden steht hier die Leitweg-ID, die den Empfänger innerhalb der Verwaltung adressiert.
2. Der Rechnungssteller (Supplier)
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="EM">info@example.com</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Muster GmbH</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Musterstraße 55a</cbc:StreetName>
<cbc:CityName>Hamburg</cbc:CityName>
<cbc:PostalZone>12345</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>DE123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>Max Mustermann</cbc:Name>
<cbc:Telephone>+49123456789</cbc:Telephone>
<cbc:ElectronicMail>max.mustermann@example.com</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
EndpointID(BT-34): Die elektronische Adresse. Das AttributschemeIDqualifiziert den Adresstyp nach der EAS-Codeliste – „EM“ steht für eine E-Mail-Adresse.PartyTaxScheme/CompanyID(BT-31): Die Umsatzsteuer-Identifikationsnummer.PartyLegalEntity/RegistrationName(BT-27): Der offizielle Firmenname.Contact: Ansprechpartner mit Telefon und E-Mail.
3. Der Rechnungsempfänger (Customer)
Der Block cac:AccountingCustomerParty ist analog aufgebaut und enthält die Daten des Käufers – elektronische Adresse (BT-49), Anschrift und USt-IdNr.
4. Zahlungsangaben
<cac:PaymentMeans>
<cbc:PaymentMeansCode>58</cbc:PaymentMeansCode>
<cac:PayeeFinancialAccount>
<cbc:ID>DE12345678901234567890</cbc:ID>
<cbc:Name>Muster GmbH</cbc:Name>
<cac:FinancialInstitutionBranch>
<cbc:ID>MUSTDE12XXX</cbc:ID>
</cac:FinancialInstitutionBranch>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:PaymentTerms>
<cbc:Note>Zahlbar innerhalb von 30 Tagen netto</cbc:Note>
</cac:PaymentTerms>
PaymentMeansCode(BT-81): Die Zahlungsart nach UNTDID 4461. Code „58“ ist die SEPA-Überweisung, „30“ die generische Überweisung.PayeeFinancialAccount: IBAN (BT-84), Kontoinhaber (BT-85) und BIC (BT-86).PaymentTerms/Note(BT-20): Freitext für Zahlungsbedingungen wie Zahlungsziel oder Skonto.
5. Steuer- und Gesamtsummen
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">149.15</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">785.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">149.15</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">785.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">785.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">934.15</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">934.15</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
TaxSubtotal: Eine Aufschlüsselung je Steuersatz mit Bemessungsgrundlage (BT-116) und Steuerbetrag (BT-117).TaxCategory/ID(BT-118): Die Steuerkategorie nach UNTDID 5305. „S“ steht für regulär besteuerte Umsätze – auch der ermäßigte deutsche Satz von 7 % wird als „S“ mit entsprechendem Prozentwert kodiert.LegalMonetaryTotal: Netto-Positionssumme (BT-106), Nettobetrag (BT-109), Bruttobetrag (BT-112) und Zahlbetrag (BT-115). Diese Summen müssen rechnerisch exakt stimmen – Validatoren prüfen das streng.
6. Die Rechnungspositionen (Invoice Lines)
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">285.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Description>Analyse und Erarbeitung eines Konzepts für die Digitalisierung</cbc:Description>
<cbc:Name>Beratung und Konzeption</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">95.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
InvoicedQuantity(BT-129): Die Menge. Das AttributunitCode(BT-130) trägt die Maßeinheit nach UN/ECE Recommendation N°20 bzw. N°21 – „HUR“ ist die Stunde, „H87“ das Stück.LineExtensionAmount(BT-131): Nettobetrag der Position (Menge × Einzelpreis).ClassifiedTaxCategory(BT-151/BT-152): Steuerkategorie und -satz der Position.Price/PriceAmount(BT-146): Der Netto-Einzelpreis.
Das vollständige Beispiel
<?xml version="1.0" encoding="utf-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>RE-2026-001</cbc:ID>
<cbc:IssueDate>2026-06-15</cbc:IssueDate>
<cbc:DueDate>2026-07-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:Note>Notiz für die XRechnung</cbc:Note>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>PROJEKT-2026-XR</cbc:BuyerReference>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="EM">info@example.com</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Muster GmbH</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Musterstraße 55a</cbc:StreetName>
<cbc:CityName>Hamburg</cbc:CityName>
<cbc:PostalZone>12345</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>DE123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Muster GmbH</cbc:RegistrationName>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>Max Mustermann</cbc:Name>
<cbc:Telephone>+49123456789</cbc:Telephone>
<cbc:ElectronicMail>max.mustermann@example.com</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="EM">buchhaltung@beispiel-ug.de</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Beispiel UG (haftungsbeschränkt)</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Musterweg 3c</cbc:StreetName>
<cbc:CityName>Berlin</cbc:CityName>
<cbc:PostalZone>54321</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>DE987654321</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Beispiel UG (haftungsbeschränkt)</cbc:RegistrationName>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>Erika Musterfrau</cbc:Name>
<cbc:Telephone>+49987654321</cbc:Telephone>
<cbc:ElectronicMail>erika.musterfrau@beispiel-ug.de</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>58</cbc:PaymentMeansCode>
<cac:PayeeFinancialAccount>
<cbc:ID>DE12345678901234567890</cbc:ID>
<cbc:Name>Muster GmbH</cbc:Name>
<cac:FinancialInstitutionBranch>
<cbc:ID>MUSTDE12XXX</cbc:ID>
</cac:FinancialInstitutionBranch>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:PaymentTerms>
<cbc:Note>Zahlbar innerhalb von 30 Tagen netto</cbc:Note>
</cac:PaymentTerms>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">149.15</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">785.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">149.15</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">785.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">785.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">934.15</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">934.15</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">285.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Description>Analyse und Erarbeitung eines Konzepts für die Digitalisierung</cbc:Description>
<cbc:Name>Beratung und Konzeption</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">95.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="H87">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">500.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Description>Entwicklung eines Corporate Designs inkl. Logo</cbc:Description>
<cbc:Name>Logo-Design</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">500.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>
Validierung
Vor dem produktiven Einsatz sollte jede erzeugte XRechnung validiert werden. Die KoSIT stellt dafür Open-Source-Werkzeuge bereit: den generischen Validator und die offizielle Prüfkonfiguration für XRechnung, die XML-Schema und Schematron-Geschäftsregeln für beide Syntaxen enthält.
Der einfachere Weg: XRechnung per API erstellen
Die manuelle Erstellung des XML ist aufwändig und fehleranfällig – jedes Feld hat eine definierte Semantik, und die Geschäftsregeln der EN 16931 (etwa zur Summenbildung) werden streng geprüft. RechnungsAPI abstrahiert den gesamten Prozess hinter einer JSON-REST-API und erzeugt daraus validierte XRechnungen inklusive optionaler PDF-Darstellung. Wie das geht, zeigt unser Tutorial zur XRechnung-Erstellung per API.