Mit KI erstellt

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
<?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-Rechnungsprozess urn: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 Format YYYY-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)

xml
<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 Attribut schemeID qualifiziert 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

xml
<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

xml
<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)

xml
<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 Attribut unitCode (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
<?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.

Quellen