Founding offer: 50,000 invoices (€500) free for your first month. Only 5 of 5 slots left.

Claim yours →

Don't build e-invoicing compliance. Integrate it.

E-invoicing infrastructure for software companies

Add German e-invoicing to your product with one API. Generate and validate XRechnung and ZUGFeRD invoices without building or maintaining the compliance logic yourself.

  • XRechnung + ZUGFeRD
  • EN 16931 based
  • Zero invoice data retention

No credit card required · API key in seconds.

500 free trial invoices30-day expiry. Generate your first compliant invoice in under a minute.

XRechnung version
3.0.2
ZUGFeRD profiles
6
XML syntaxes (UBL + CII)
2
Data retention
0

E-invoicing shouldn't become your product team's maintenance burden

Supporting German e-invoicing means more than generating XML. Your team has to understand XRechnung, ZUGFeRD, EN 16931, syntax mappings, validation rules, profiles, and specification updates.

InvoiceSpec keeps that infrastructure behind one stable API, so your team can focus on the product you're actually building.

Create

Create compliant invoices

Generate XRechnung XML and ZUGFeRD PDF/A-3 documents from structured invoice data.

Validate

Catch compliance problems before invoices leave your system

Validate documents against the relevant structural and business rules and return actionable errors your application can work with.

Maintain

Stop maintaining invoice standards

InvoiceSpec tracks supported specification and validator updates so your integration does not need to be rebuilt every time the underlying standards evolve.

JSON Input

Canonical invoice data

InvoiceSpec compliance layer

Map · Generate · Validate

Compliant Output

XMLPDF/A-3

Your developers integrate once, against one stable API. InvoiceSpec handles the format-specific implementation underneath.

One API call from your data to a compliant invoice

Send structured invoice data using one stable API model. InvoiceSpec handles the XRechnung or ZUGFeRD representation and validation underneath.

POST/v1/invoice/xrechnungReal output
Request — application/json
{
"invoice": {
"invoiceNumber": "INV-DEMO-001",
"issueDate": "2025-07-01",
"invoiceTypeCode": "380",
"currencyCode": "EUR",
"buyerReference": "991-12345-67",
"seller": {
"name": "Acme GmbH",
"legalRegistrationIdentifier": "HRB98765",
"vatIdentifier": "DE123456789",
"electronicAddress": "DE123456789",
"electronicAddressSchemeId": "9930",
"postalAddress": {
"addressLine1": "Musterstr. 1",
"city": "Berlin",
"postcode": "10115",
"countryCode": "DE"
},
"contact": {
"contactPoint": "Max Mustermann",
"telephone": "+49 30 12345678",
"email": "billing@acme.de"
}
},
"buyer": {
"name": "Example Corp",
"electronicAddress": "FR12345678901",
"electronicAddressSchemeId": "9930",
"postalAddress": {
"addressLine1": "12 Rue de Rivoli",
"city": "Paris",
"postcode": "75001",
"countryCode": "FR"
}
},
"deliveryInformation": {
"actualDeliveryDate": "2025-07-01"
},
"paymentInstructions": {
"meansCode": "30",
"creditTransfer": {
"accountIdentifier": "DE89370400440532013000"
}
},
"documentTotals": {},
"vatBreakdowns": [
{
"vatCategoryCode": "S",
"vatCategoryRate": 19
}
],
"invoiceLines": [
{
"lineIdentifier": "1",
"quantity": 10,
"unitCode": "C62",
"priceDetails": {
"netPrice": 150
},
"lineVatInformation": {
"vatCategoryCode": "S",
"vatRate": 19
},
"itemInformation": {
"name": "Consulting Services"
}
}
]
},
"config": {
"spec": "xrechnung",
"syntax": "cii"
}
}
Response — application/xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rsm:CrossIndustryInvoice xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100" xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100">
<rsm:ExchangedDocumentContext>
<ram:BusinessProcessSpecifiedDocumentContextParameter>
<ram:ID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</ram:ID>
</ram:BusinessProcessSpecifiedDocumentContextParameter>
<ram:GuidelineSpecifiedDocumentContextParameter>
<ram:ID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</ram:ID>
</ram:GuidelineSpecifiedDocumentContextParameter>
</rsm:ExchangedDocumentContext>
<rsm:ExchangedDocument>
<ram:ID>INV-DEMO-001</ram:ID>
<ram:TypeCode>380</ram:TypeCode>
<ram:IssueDateTime>
<udt:DateTimeString format="102">20250701</udt:DateTimeString>
</ram:IssueDateTime>
</rsm:ExchangedDocument>
<rsm:SupplyChainTradeTransaction>
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>1</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:Name>Consulting Services</ram:Name>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>150.0</ram:ChargeAmount>
<ram:BasisQuantity>1</ram:BasisQuantity>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="C62">10</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>1500.00</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
<ram:ApplicableHeaderTradeAgreement>
<ram:BuyerReference>991-12345-67</ram:BuyerReference>
<ram:SellerTradeParty>
<ram:Name>Acme GmbH</ram:Name>
<ram:SpecifiedLegalOrganization>
<ram:ID>HRB98765</ram:ID>
</ram:SpecifiedLegalOrganization>
<ram:DefinedTradeContact>
<ram:PersonName>Max Mustermann</ram:PersonName>
<ram:TelephoneUniversalCommunication>
<ram:CompleteNumber>+49 30 12345678</ram:CompleteNumber>
</ram:TelephoneUniversalCommunication>
<ram:EmailURIUniversalCommunication>
<ram:URIID>billing@acme.de</ram:URIID>
</ram:EmailURIUniversalCommunication>
</ram:DefinedTradeContact>
<ram:PostalTradeAddress>
<ram:PostcodeCode>10115</ram:PostcodeCode>
<ram:LineOne>Musterstr. 1</ram:LineOne>
<ram:CityName>Berlin</ram:CityName>
<ram:CountryID>DE</ram:CountryID>
</ram:PostalTradeAddress>
<ram:URIUniversalCommunication>
<ram:URIID schemeID="9930">DE123456789</ram:URIID>
</ram:URIUniversalCommunication>
<ram:SpecifiedTaxRegistration>
<ram:ID schemeID="VA">DE123456789</ram:ID>
</ram:SpecifiedTaxRegistration>
</ram:SellerTradeParty>
<ram:BuyerTradeParty>
<ram:Name>Example Corp</ram:Name>
<ram:PostalTradeAddress>
<ram:PostcodeCode>75001</ram:PostcodeCode>
<ram:LineOne>12 Rue de Rivoli</ram:LineOne>
<ram:CityName>Paris</ram:CityName>
<ram:CountryID>FR</ram:CountryID>
</ram:PostalTradeAddress>
<ram:URIUniversalCommunication>
<ram:URIID schemeID="9930">FR12345678901</ram:URIID>
</ram:URIUniversalCommunication>
</ram:BuyerTradeParty>
</ram:ApplicableHeaderTradeAgreement>
<ram:ApplicableHeaderTradeDelivery>
<ram:ActualDeliverySupplyChainEvent>
<ram:OccurrenceDateTime>
<udt:DateTimeString format="102">20250701</udt:DateTimeString>
</ram:OccurrenceDateTime>
</ram:ActualDeliverySupplyChainEvent>
</ram:ApplicableHeaderTradeDelivery>
<ram:ApplicableHeaderTradeSettlement>
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
<ram:SpecifiedTradeSettlementPaymentMeans>
<ram:TypeCode>30</ram:TypeCode>
<ram:PayeePartyCreditorFinancialAccount>
<ram:IBANID>DE89370400440532013000</ram:IBANID>
</ram:PayeePartyCreditorFinancialAccount>
</ram:SpecifiedTradeSettlementPaymentMeans>
<ram:ApplicableTradeTax>
<ram:CalculatedAmount>285.00</ram:CalculatedAmount>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:BasisAmount>1500.00</ram:BasisAmount>
<ram:CategoryCode>S</ram:CategoryCode>
<ram:RateApplicablePercent>19</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradePaymentTerms>
<ram:Description>Payment due</ram:Description>
</ram:SpecifiedTradePaymentTerms>
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
<ram:LineTotalAmount>1500.00</ram:LineTotalAmount>
<ram:TaxBasisTotalAmount>1500.00</ram:TaxBasisTotalAmount>
<ram:TaxTotalAmount currencyID="EUR">285.00</ram:TaxTotalAmount>
<ram:GrandTotalAmount>1785.00</ram:GrandTotalAmount>
<ram:DuePayableAmount>1785.00</ram:DuePayableAmount>
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
</ram:ApplicableHeaderTradeSettlement>
</rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>

Real engine output from the request on the left — a complete, KoSIT-validated XRechnung 3.0.2 CII document.

Try it with curl
curl
curl -X POST https://api.invoicespec.com/v1/invoice/xrechnung \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/xml" \
-d '{"invoice":{"invoiceNumber":"INV-DEMO-001","issueDate":"2025-07-01","invoiceTypeCode":"380","currencyCode":"EUR","buyerReference":"991-12345-67","seller":{"name":"Acme GmbH","legalRegistrationIdentifier":"HRB98765","vatIdentifier":"DE123456789","electronicAddress":"DE123456789","electronicAddressSchemeId":"9930","postalAddress":{"addressLine1":"Musterstr. 1","city":"Berlin","postcode":"10115","countryCode":"DE"},"contact":{"contactPoint":"Max Mustermann","telephone":"+49 30 12345678","email":"billing@acme.de"}},"buyer":{"name":"Example Corp","electronicAddress":"FR12345678901","electronicAddressSchemeId":"9930","postalAddress":{"addressLine1":"12 Rue de Rivoli","city":"Paris","postcode":"75001","countryCode":"FR"}},"deliveryInformation":{"actualDeliveryDate":"2025-07-01"},"paymentInstructions":{"meansCode":"30","creditTransfer":{"accountIdentifier":"DE89370400440532013000"}},"documentTotals":{},"vatBreakdowns":[{"vatCategoryCode":"S","vatCategoryRate":19}],"invoiceLines":[{"lineIdentifier":"1","quantity":10,"unitCode":"C62","priceDetails":{"netPrice":150},"lineVatInformation":{"vatCategoryCode":"S","vatRate":19},"itemInformation":{"name":"Consulting Services"}}]},"config":{"spec":"xrechnung","syntax":"cii"}}'

Compliance infrastructure you don't have to maintain

  • EN 16931 based

    InvoiceSpec maps your invoice data to the European semantic model used by supported German e-invoice formats.

  • XRechnung validation

    Generated and uploaded XRechnung documents are checked using the supported KoSIT validation rules.

  • Version-aware

    Use the current supported specification or pin a supported version when deterministic behavior matters.

  • Actionable errors

    Receive structured validation results instead of exposing raw validator output directly to your users.

  • Zero invoice data retention

    Invoice documents are processed without being persisted after the request.

Everything your product needs for German e-invoicing

Generation and validation for both German e-invoice formats, plus the compliance maintenance underneath them.

XRechnung

Generate and validate German XML e-invoices using the supported CII and UBL syntaxes (XRechnung 3.0.2).

Explore XRechnung API

ZUGFeRD

Generate and validate hybrid PDF/A-3 invoices with EN 16931 CII XML embedded inside them, across six profiles.

Explore ZUGFeRD API

Validation

Validate existing XRechnung and ZUGFeRD invoices and receive structured, actionable compliance errors.

Try the free validators

Compliance maintenance

InvoiceSpec keeps your integration stable while it maintains supported format and validator updates underneath.

Read the docs

ZUGFeRD: one invoice for people and software

Generate a human-readable PDF/A-3 with structured invoice XML embedded in the same document. A ZUGFeRD invoice carries a human-readable invoice page and the machine-readable EN 16931 CII XML embedded inside it — generated from one canonical JSON so they never diverge. See the real document on the ZUGFeRD API page.

Real generated ZUGFeRD PDF/A-3 invoice — page 1
PDF/A-3with EN 16931 CII XML embedded inside

How it works

From structured invoice data to a standards-compliant document — the engine handles the format mapping and rule checking.

  1. 1

    Send structured data

    POST a canonical JSON invoice to the API. No XML hand-authoring, no PDF layout work.

  2. 2

    Engine maps to the standard

    InvoiceSpec maps your data to the XRechnung / ZUGFeRD / EN 16931 model and applies the format's syntax and business rules.

  3. 3

    Receive a compliant document

    Get back a standards-compliant XML or PDF/A-3 document, or a structured validation result listing any issues.

Add German e-invoicing without building it from scratch

Start with the API for free. Generate and validate real XRechnung and ZUGFeRD invoices before committing to a paid plan.

  • XRechnung + ZUGFeRD
  • EN 16931 based
  • Zero invoice data retention

No credit card required · API key in seconds — first compliant invoice in under a minute.

500 free trial invoices (30-day trial) — see pricing for after that.