Germany
Learn about enabling e-invoicing in Germany, including prerequisites and invoice formats, exchange methods, and validation rules..
Prerequisites
-
Get a valid tax ID.
-
Configure your company under the Pan-European Public Procurement On-Line (PEPPOL) network.
Invoice formats
E-invoices must comply with European Norm (EN) 16931 syntaxes or a mutually agreed-upon format that meets the requirements. The following formats are compliant with EN 16931:
- PEPPOL formats
Formats compatible with Pan-European Public Procurement On-Line (PEPPOL):
- XRechnung CII
-
XML file in the Cross-Industry Invoice (CII) syntax
- XRechnung UBL
-
XML file in the Universal Business Language (UBL) syntax
Note:The invoice receipt platforms Zentrale Rechnungseingangsplattform (ZRE) and OZG-Rechnungsempfang (OZG-RE) use the Pan-European Public Procurement On-Line (PEPPOL) network to let suppliers send electronic invoices automatically to the direct federal administration, parts of the indirect federal administration, and participating federal states.
For more information on PEPPOL, see the PEPPOL documentation.
- Non-PEPPOL formats
-
The hybrid ZUGFeRD format, which is a human-readable PDF/A-3 with an embedded XML file in the CII syntax.
The supplier and the buyer must decide which accepted format they want to use. If an invoice recipient refuses to accept an e-invoice or is technically unable to do so, they have no right to request an alternative invoice from the issuer. So, if the issuer has issued an e-invoice and made clear efforts to ensure its correct transmission, they have met their value-added tax (VAT) obligations.
Invoice exchange
The supplier and the buyer must agree on their preferred method of invoice exchange. Email, electronic interface, or shared access to a central storage location are all accepted transmission methods.
Validation rules
To get the latest validation rules:
- XRechnung
- Go to the XStandards Einkauf website and download the latest version of the English summary pdf.
- ZUGFeRD
- Go to the FERD website and request the latest version of the ZUGFeRD English PDF.
Error handling
When handling errors, the client application must follow the Indirect Tax API's error handling principles, as specified in the error handling documentation.
In general, all error codes in the 400 range are client errors, which you need to analyze. After fixing the error, you can resend the request. Error codes 408 and 429 are exceptions: In these cases, you should wait at least 60 seconds before retrying. Error codes in the 500 range are server errors. In that case, resend the request according to the instructions given on the error handling documentation, which also includes a full list of error codes Indirect Tax API can return.
Send invoice through e-delivery
The following diagram provides a detailed overview of the e-delivery outbound flow for sending an e-invoice:
Step 1: Supplier creates the Standard Business Document
Every invoice sent to Sovos must be part of a Standard Business Document (SBD). This document includes a Standard Business Document Header (SBDH) and a Sovos Document node, which includes a Sovos Canonical Invoice (SCI). To create the SBD, follow the detailed instructions in the SBDH, Sovos Document, and SCI pages.
Besides the SCI format, you can also use the local formats ZUGFeRD and XRechnung.
The SBD must include the following key elements:
| Node | Required | Attributes | Value |
|---|---|---|---|
| StandardBusinessDocumentHeader.Sender.Identifier | Yes | Authority="DE" | Supplier's tax ID |
| StandardBusinessDocumentHeader.Receiver.Identifier | Yes | Authority="DE" | Buyer's tax ID |
| StandardBusinessDocumentHeader.DocumentIdentification.Standard | Yes | >urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 | |
| StandardBusinessDocumentHeader.DocumentIdentification.TypeVersion | Yes | 3.0 | |
| StandardBusinessDocumentHeader.DocumentIdentification.Type | Yes | "Invoice" or "Credit note" | |
| StandardBusinessDocumentHeader. BusinessScope .Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Type: Child node Identifier: | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node | |
| StandardBusinessDocumentHeader.BusinessScope.Scope.BusinessService.BusinessServiceName | Yes | eDelivery | |
| SovosDocument.SovosCanonicalInvoice.Invoice | Yes | SCI document |
Alternatively, the supplier can use the local format instead of SCI. Use the following values in the SBDH for documents that use the local format:
| Node | Required | Value |
|---|---|---|
| StandardBusinessDocumentHeader.DocumentIdentification.Standard | Yes |
|
| StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes) | Yes |
Child node Child node |
| SovosDocument.SovosLegalDocument.Base64Document | Yes | A local format such as ZUGFeRD or XRechnung |
Include all the mandatory nodes, as specified in the SBDH schema. If the information cannot be provided, and the respective mandatory node has not been mentioned on the current page, for example the receiver.identifier, the node can be left empty but must still be included in the SBDH.
- SBD sample
-
The following is a sample of the SBD.
<sbd:StandardBusinessDocument xmlns="http://uri.etsi.org/01903/v1.4.1#" xmlns:sbd="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:ad="http://www.sovos.com/namespaces/additionalData" xmlns:sci="http://www.sovos.com/namespaces/sovosCanonicalInvoice" xmlns:svs="http://www.sovos.com/namespaces/sovosDocument" xmlns:sov="http://www.sovos.com/namespaces/sovosExtensions" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:leg="http://www.sovos.com/namespaces/sovosExtensions/LegalExtension" xmlns:inv="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"> <sbd:StandardBusinessDocumentHeader> <sbd:HeaderVersion>1.0</sbd:HeaderVersion> <sbd:Sender> <sbd:Identifier Authority="DE">DE123456789</sbd:Identifier> </sbd:Sender> <sbd:Receiver> <sbd:Identifier Authority="DE">DE987654321</sbd:Identifier> <sbd:ContactInformation> <sbd:Contact/> <sbd:EmailAddress/> <sbd:FaxNumber/> <sbd:TelephoneNumber/> <sbd:ContactTypeIdentifier/> </sbd:ContactInformation> </sbd:Receiver> <sbd:DocumentIdentification> <sbd:Standard>urn:oasis:names:specification:ubl:schema:xsd:Invoice-2</sbd:Standard> <sbd:TypeVersion>2.1</sbd:TypeVersion> <sbd:InstanceIdentifier>100002</sbd:InstanceIdentifier> <sbd:Type>Invoice</sbd:Type> <sbd:MultipleType>false</sbd:MultipleType> <sbd:CreationDateAndTime>2026-03-01T10:00:00Z</sbd:CreationDateAndTime> </sbd:DocumentIdentification> <sbd:BusinessScope> <sbd:Scope> <sbd:Type>Country</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>DE</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>CompanyCode</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>DE123456789</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>SenderDocumentId</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>INV-2026-00001</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>SenderSystemId</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>SystemERP</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>ProcessType</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>Outbound</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>BusinessProcess</sbd:Type> <sbd:InstanceIdentifier/> <sbd:BusinessService> <sbd:BusinessServiceName>eDelivery</sbd:BusinessServiceName> </sbd:BusinessService> </sbd:Scope> <sbd:Scope> <sbd:Type>BusinessCategory</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>B2B</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>Version</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>3.0</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>Mapping.TransformDocument</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>SCI-TO-LEGAL_INVOICE</sbd:Identifier> </sbd:Scope> <sbd:Scope> <sbd:Type>Mapping.OutputSchema</sbd:Type> <sbd:InstanceIdentifier/> <sbd:Identifier>XRechnung</sbd:Identifier> </sbd:Scope> </sbd:BusinessScope> </sbd:StandardBusinessDocumentHeader> <svs:SovosDocument> <sci:SovosCanonicalInvoice> <inv:Invoice> *UBL Elements* </inv:Invoice> </sci:SovosCanonicalInvoice> </svs:SovosDocument> </sbd:StandardBusinessDocument>
Sample documents:
Step 2: Supplier sends the SBD to Sovos
The supplier sends a POST request to the /documents endpoint.
The request must include the following request body parameters:
| Name | Type | Required | Description |
|---|---|---|---|
| data | string | Yes | The Base64-encoded SBD from step 1 |
| dataEncoding | string | Yes | Use "base64" |
- Request sample
-
curl --location --request POST 'https://api-test.sovos.com/v1/documents' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer {accessToken}' \ --header 'x-correlationId: {uniqueValue}' \ --data-raw '{ "data": "PD9...d4=", "dataEncoding" : "base64" }' - Response sample
-
{ "timestamp": 1605282724079, "status": 202, "success": true, "message": "Document Received", "data": { "documentId": "DOCUMENT-ID" } }
Step 3: Sovos maps the SCI document
After receiving the file, Sovos maps the SCI document to the format expected by the buyer.
Sovos skips this step if the SBD contains the invoice in the local format.
If mapping fails, Sovos returns an error that the supplier sees when retrieving application responses.
Step 4: Sovos validates the document
Sovos performs semantic, syntactic, and legal validations. We also perform a schema validation to ensure the XML file conforms to the expected structure, comparing it with the official schema.
If the validation fails, Sovos returns an error that the supplier sees when retrieving application responses.
Step 5: Sovos generates and sends the document
Sovos generates the document and sends it to the buyer's PEPPOL Access Point (AP).
If the buyer does not have a registered PEPPOL AP, Sovos returns an error that the supplier can see when retrieving application responses.
Step 6: Buyer's AP processes the document and sends a response
After receiving the document, the buyer's PEPPOL AP processes and validates the document and makes it available for the buyer to retrieve. The AP also returns a response to Sovos, which creates notifications for the buyer to retrieve.
Step 7: Supplier retrieves the application responses
- Attachments configuration
There are three ways you can access your attachments:
-
As binary data, so the file is embedded in the Base64-encoded application response.
-
As open download links, in which the response contains a public URL to download the file.
-
As secure download links, in which you need to use the Indirect Tax API's bearer token to download the attachment.
By default, Sovos configures your attachments as open download links to avoid potential size limitations when retrieving responses. To improve security, you should configure them as secure links. Then, make a GET call to the secure link returned by the Indirect Tax API, and include the API token. Sample request:
curl --location 'https://einvoicing-api.sovos.com/download/api/v1/download/JqYyqliXiJFKhXshnBQZfW3qpfwATVGE5Q73T41JUynNLJD8zHy5VH__9qzL9No-Kia9olSw3_lNX3KmaA9Je89Xx--vk5pQjyKx0iT_4CwPSABD0Yg7uxXZ8SNiliEhFY-4TOX7m1TV5FwwfqntehbGaiGMI2JVYu18VBDiC_0/plain%27 \ --header 'Authorization: Bearer TOKEN'-
To complete a transaction, the supplier must retrieve application responses until the SCIResponseCode in the response has the value of either AP, CA, PD, or RE, which indicates that the transaction is finished.
The supplier can use the following Indirect Tax API endpoints to retrieve application responses:
-
GET /notifications/DE
-
GET /documents/DE/{documentId}/notifications
- GET /notifications/DE
-
The supplier can send a GET request to the /notifications/DE endpoint to retrieve application responses that match the set search criteria. To make this request, use the following query parameters:
Name Type Required Default Description taxId string No Include only notifications related to the specified
taxId. This value is related to theCompanyCodeset in the SBDH.Note:If a request does not include this parameter, it returns all the notifications related to the country and the
sourceSystemIdparameter.page integer No 1 To specify the page to return, use a value between 1 and 10. perPage integer No 10 To specify the number of results for the returned page, use a value between 1 and 100.
Important:If the attachment file is configured to return binary content instead of a link, use only values between 1 and 10.
sourceSystemId string Yes Include only notifications related to documents that originate from the given source system. This value is related to the SenderSystemIdin the SBDH.includeAcknowledged boolean No false Use "true" to include previously acknowledged notifications, within 24 hours of their acknowledgment, in the result. processType string No Use "0" to only include notifications related to outbound documents. - Request sample
-
curl --location --request GET 'https://api-test.sovos.com/v1/notifications/DE?page=1&perPage=2&taxId={taxId}&sourceSystemId={sourceSystemId}&processType=0' \ --header 'Content-Type: application/json' \ --header 'x-correlationId: {uniqueValue}' \ --header 'Authorization: Bearer {accessToken}' - Response sample
-
{ "timestamp": 1633685509314, "status": 200, "success": true, "message": "Notifications Listed", "data": { "pageState": { "page": 1, "perPage": 50, "totalEntries": 1 }, "notifications": [ { "createdDate": 1633681296, "metadata": { "productId": "aa_edelivery__1.0", "documentId": "DOCUMENT-ID", "erpDocumentId": "321412", "erpSystemId": "UAT101", "processType": "0", "taxId": "{taxId}", "sciCloudStatusCode": "200", "sciResponseCode": "AP", "sciStatusAction": "NOA", "sciGovtStatusCode": "100" }, "appPrefix": "eDelivery", "notificationId": "a8dc1aa2-...-97a3d5fdb91c", "content": "PEF...NlPg==" } ] } }
- GET /documents/DE/{documentId}/notifications
-
The supplier can send a GET request to the /documents/DE/{documentId}/notifications endpoint to retrieve application responses related to a single document.
To make this request, use the following path parameter:
Name Type Required Description documentId string Yes The document ID returned in step 2 - Request sample
-
curl --location --request GET 'https://api-test.sovos.com/v1/documents/DE/{documentId}/notifications?' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer {accessToken}' \ --header 'x-correlationId: {uniqueValue}' - Response sample
-
{ "timestamp": 1633685509314, "status": 200, "success": true, "message": "Notifications Listed", "data": { "pageState": { "page": 1, "perPage": 50, "totalEntries": 1 }, "notifications": [ { "createdDate": 1633681296, "metadata": { "productId": "aa_edelivery__1.0", "documentId": "DOCUMENT-ID", "erpDocumentId": "321412", "erpSystemId": "UAT101", "processType": "0", "taxId": "{taxId}", "sciCloudStatusCode": "200", "sciResponseCode": "AP", "sciStatusAction": "NOA", "sciGovtStatusCode": "100" }, "appPrefix": "eDelivery", "notificationId": "a8dc1aa2-...-97a3d5fdb91c", "content": "PEF...NlPg==" } ] } }
Step 8: Supplier marks the application responses as acknowledged
The supplier must process the retrieved application responses and mark them as acknowledged. To do that, send a PUT request to the /notifications/DE endpoint.
To make this request, use the following request body parameters:
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | Yes | Use "read" |
| notificationId | string | Yes | The notification ID |
Multiple notificationId values can be acknowledged in one Indirect Tax API call by including them in a single request.
- Request sample
-
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/DE' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer {accessToken}' \ --header 'x-correlationId: {uniqueValue}' \ --data-raw '[ { "status": "read", "notificationId": "51341d39-...-a73d73e0de76" } ]' - Response sample
-
{ "timestamp": 1601673284, "status": 200, "success": true, "message": "Notifications acknowledged successfully." }
Step 9: Sovos archives the document
You can archive the document, the application response, and any graphical representation (such as a PDF) using Sovos' Compliant Archive. However, Sovos does not archive them automatically, as part of the e-delivery process. To opt in and configure archiving, contact the Sovos Professional Services team.
Receive invoice through e-delivery
The following diagram provides a detailed overview of the e-delivery inbound flow for receiving an e-invoice:
Step 1: Sovos receives the document
Sovos receives the document from the supplier's Pan-European Public Procurement On-Line (PEPPOL) Access Point (AP).
Step 2: Sovos validates the document
Sovos performs semantic, syntactic, and legal validations.
Step 3: Sovos sends a status response
Sovos sends a status response to the supplier's AP.
Step 4: Sovos maps the document
Sovos maps the document from the received format to the buyer's format.
Sovos skips this step if the buyer and the supplier use the same format.
Step 5: Sovos generates a response
Sovos generates an application response that includes the document.
Step 6: Buyer retrieves the application responses
- Attachments configuration
There are three ways you can access your attachments:
-
As binary data, so the file is embedded in the Base64-encoded application response.
-
As open download links, in which the response contains a public URL to download the file.
-
As secure download links, in which you need to use the Indirect Tax API's bearer token to download the attachment.
By default, Sovos configures your attachments as open download links to avoid potential size limitations when retrieving responses. To improve security, you should configure them as secure links. Then, make a GET call to the secure link returned by the Indirect Tax API, and include the API token. Sample request:
curl --location 'https://einvoicing-api.sovos.com/download/api/v1/download/JqYyqliXiJFKhXshnBQZfW3qpfwATVGE5Q73T41JUynNLJD8zHy5VH__9qzL9No-Kia9olSw3_lNX3KmaA9Je89Xx--vk5pQjyKx0iT_4CwPSABD0Yg7uxXZ8SNiliEhFY-4TOX7m1TV5FwwfqntehbGaiGMI2JVYu18VBDiC_0/plain%27 \ --header 'Authorization: Bearer TOKEN'-
To complete a transaction, the buyer must retrieve all application responses until the transaction has finished. If the buyer has subscribed to all notifications, one transaction can generate different application responses.
The buyer can use the GET /notifications/DE endpoint to retrieve application responses. This endpoint lets you use the following query parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| appPrefix | string | No | Use "eDelivery" | |
| taxId | string | No | Include only notifications related to the specified taxId. | |
| page | integer | No | 1 | To specify the page to return, use a value between 1 and 10. |
| perPage | integer | No | 10 |
To specify the number of results for the returned page, use a value between 1 and 100. Important:
If the attachment file is configured to return binary content instead of a link, use only values between 1 and 10. |
| sourceSystemId | string | Yes | Include only notifications related to documents that originate from the given source system. | |
| includeAcknowledged | boolean | No | false | Use "true" to include previously acknowledged notifications in the result. |
| processType | string | No | Use "1" to only include notifications related to inbound documents. | |
| orgId | string | No | Restricts the notifications listed to documents associated with the given organization ID (only applicable for workspace tenants). | |
| senderDocumentId | string | No | Restricts the notifications listed to the given sender document ID if you used the SenderDocumentId scope in the POST /v1/documents endpoint. |
- Request sample
-
curl --location --request GET 'https://api-test.sovos.com/v1/notifications/DE?page=1&perPage=2&taxId={taxId}&sourceSystemId={sourceSystemId}&processType=1' \ --header 'Content-Type: application/json' \ --header 'x-correlationId: {uniqueValue}' \ --header 'Authorization: Bearer {accessToken}' - Response sample
-
{ "status": 200, "message": "Notifications Listed", "success": true, "timestamp": 1693343820329, "data": { "pageState": { "page": 1, "perPage": 10, "totalEntries": 4, "totalPages": 1 }, "notifications": [ { "notificationId": "202603100...ad43-d0edf3e48807", "correlationId": "rrt-...-1335030-1", "appPrefix": "sph", "metadata": { "productId": "aa_edelivery__1.0", "documentId": "569d7232-...-568dd061b613", "erpDocumentId": "212093...2025", "erpSystemId": "BRADYBEUAT", "processType": "0", "taxId": "0405007662", "sciCloudStatusCode": "100", "sciResponseCode": "AP", "sciStatusAction": "NOA" }, "content": "PD94...Pz4", "createdDate": 1693339001904 } ] } }
Sample documents:
Step 7: Buyer acknowledges the application responses
After retrieving the application responses, the buyer must process them and mark them as acknowledged. To do this, send a PUT request to the /notifications/DE endpoint.
To make this request, use the following parameters:
| Name | Type | Required | Parameter type | Default | Description |
|---|---|---|---|---|---|
| countryCode | string | Yes | Path | The two-character country code specified by the ISO 3166-1 alpha-2 standard | |
| status | string | Yes | Request body | Use "read" | |
| notificationId | string | Yes | Request body | false | The notification ID |
Multiple notificationId values can be acknowledged in one Indirect Tax API call by including them in a single request.
- Request sample
-
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/DE' \ --header 'Content-Type: application/json \ --header 'x-correlationId: {uniqueValue}' \ --header 'Authorization: Bearer {accessToken}' \ --data '[ { "status": "read", "notificationId": "55f26671-...-d42925946ebf" } ]' - Response sample
-
{ "status": 200, "message": "OK", "success": true, "timestamp": 1653424820578, "data": {} }
Step 8: Sovos archives the document
You can archive the document, the application response, and any graphical representation (such as a PDF) using Sovos' Compliant Archive. However, Sovos does not archive them automatically, as part of the e-delivery process. To opt in and configure archiving, contact the Professional Services (PS) team.
