ZUGFeRD 2.3 CII E-Invoice Validator & Parser
Validate and parse German ZUGFeRD 2.x / Factur-X CII invoices with profile-scoped EN 16931 business rules. This specification documents the exact field layout, checksum rules, and validation behavior so your integration matches ZUGFeRD 2.x / Factur-X 1.0.x (EN 16931) without reading the source standard.
⚡ Live ZUGFeRD 2.3 CII E-Invoice Validator & Parser Interactive Workbench
Test real-time validation and schema parsing for ZUGFeRD 2.3 CII E-Invoice Validator & Parser directly in your browser. Runs in sub-5ms with zero setup.
{
"status": "Click RUN VALIDATION to execute on the Cloudflare edge..."
}
Quick Summary: Validate and parse German ZUGFeRD 2.x / Factur-X CII invoices with profile-scoped EN 16931 business rules. Validates strictly against ZUGFeRD 2.x / Factur-X 1.0.x (EN 16931) with sub-5ms in-memory response times.
Specification & Structural Breakdown
Technical Summary: Validates strictly against ZUGFeRD 2.x / Factur-X 1.0.x (EN 16931). Payloads are parsed in memory and return clean, typed JSON in milliseconds with zero data logged.
ZUGFeRD 2.x is the German name for the Factur-X hybrid invoice model; the API accepts both naming conventions and detects the profile from the specification identifier (BT-24).
MINIMUM, BASIC WL, BASIC, EN 16931 (COMFORT), EXTENDED and XRechnung profiles are detected and checked against their profile-mandatory fields.
EN 16931, EXTENDED and XRechnung documents run the full EN 16931 business-rule set (BR-01 through BR-65) with exact rule IDs, paths, and severities.
| Profile | Guideline identifier (BT-24) | Rule scope |
|---|---|---|
| MINIMUM | urn:factur-x.eu:1p0:minimum | Profile-mandatory header fields |
| BASIC WL | urn:factur-x.eu:1p0:basicwl | Header fields and monetary totals |
| BASIC | urn:factur-x.eu:1p0:basic | Header, totals, and invoice lines |
| EN 16931 (COMFORT) | urn:factur-x.eu:1p0:en16931 | Full EN 16931 BR-* rule set |
| EXTENDED | urn:factur-x.eu:1p0:extended | Full EN 16931 BR-* rule set |
| XRechnung (CII) | urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_3.0 | Full EN 16931 BR-* rule set |
Parsed JSON Response Model
The edge microservice transforms input payloads into strongly-typed hierarchical JSON envelopes with sub-5ms latency:
{
"valid": false,
"syntax": "CII",
"profile": "BASIC_WL",
"summary": {
"status": "NON_COMPLIANT",
"fatalCount": 1,
"warningCount": 0
},
"violations": [
{
"id": "FX-PROFILE-BASIC_WL-09",
"path": "BT-112",
"severity": "FATAL",
"message": "Missing or empty BT-112 (Invoice grand total amount)."
}
]
}
Copy-Paste Integration Code (6 Languages)
Integrate ZUGFeRD 2.3 CII E-Invoice Validator & Parser directly into your production application with native, zero-dependency code snippets in cURL, Node.js, Python, Go, C#, and a ready-to-paste Claude prompt. Get a free API key → (no credit card required):
curl --request POST \
--url "https://api.stanzaapi.com/factur-x-validator/api/v1/validate" \
--header "Content-Type: application/json" \
--header "x-api-key: YOUR_API_KEY" \
--data '{
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\">...</rsm:CrossIndustryInvoice>"
}'const response = await fetch("https://api.stanzaapi.com/factur-x-validator/api/v1/validate", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.API_KEY || "YOUR_API_KEY"
},
body: JSON.stringify({
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\">...</rsm:CrossIndustryInvoice>"
})
});
const data = await response.json();
console.log(data);import requests
import json
url = "https://api.stanzaapi.com/factur-x-validator/api/v1/validate"
headers = {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY"
}
payload = {
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\">...</rsm:CrossIndustryInvoice>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
url := "https://api.stanzaapi.com/factur-x-validator/api/v1/validate"
payload := []byte(`{"xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\">...</rsm:CrossIndustryInvoice>"}`)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
req.Header.Add("Content-Type", "application/json")
req.Header.Add("x-api-key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("API_KEY") ?? "YOUR_API_KEY");
var json = @"{""xml"":""<?xml version=\""1.0\"" encoding=\""UTF-8\""?><rsm:CrossIndustryInvoice xmlns:rsm=\""urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\"">...</rsm:CrossIndustryInvoice>""}";
var payload = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.stanzaapi.com/factur-x-validator/api/v1/validate", payload);
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
}Integrate the Stanza factur-x-validator micro-API.
Endpoint: POST https://api.stanzaapi.com/factur-x-validator/api/v1/validate
Auth header: x-api-key: YOUR_API_KEY
Content-Type: application/json
Request body:
{
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rsm:CrossIndustryInvoice xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\">...</rsm:CrossIndustryInvoice>"
}
Rules:
- Send the request with a 2-second timeout.
- Parse the standard envelope { success, data, meta: { latency_ms, version } }.
- On failure, read { success: false, error, code } and branch on the code.
- Do not retry 4xx responses; surface the error code to the caller.
- Treat invalid-but-well-formed payloads as HTTP 200 with data.valid === false.Frequently Asked Questions & Technical Notes
MINIMUM, BASIC WL, BASIC, EN 16931 (COMFORT), EXTENDED and XRechnung are detected from the specification identifier (BT-24). EN 16931, EXTENDED and XRechnung documents run the full EN 16931 business-rule set; reduced profiles are checked against their profile-mandatory fields.
Yes. German businesses must be able to receive structured e-invoices since January 2025, with mandatory issuance phased through 2027-2028. The engine validates the Factur-X and ZUGFeRD profiles those documents use.
Related Factur-X & ZUGFeRD 2.3 E-Invoice Validation Engine Formats
Explore sibling specifications and standards in the same developer cluster:
Factur-X PDF/A-3 Attachment Extraction & Validation API
Extract the embedded UN/CEFACT CII XML from Factur-X and ZUGFeRD PDF/A-3 hybrid invoices and return the validated invoice model as JSON.
View Format →XRechnung CII Validator API (EN 16931)
Validate XRechnung CII documents against the full EN 16931 business-rule set and return exact rule IDs with JSON paths.
View Format →Factur-X Profile Detection (BT-24) & EN 16931 Rule Scoping
Detect the Factur-X profile from the specification identifier (BT-24) and run the profile-scoped EN 16931 business rules.
View Format →Complementary Enterprise APIs
Seamlessly orchestrate data pipelines across adjacent financial, regulatory, and supply-chain protocols:
Peppol BIS Billing 3.0 →
Validate UBL 2.1 and CII e-invoices against EN 16931 and Peppol BIS Billing 3.0 rules.
ISO 20022 Financial Messaging →
Bridge validated e-invoice totals into ISO 20022 credit transfer instructions and reconciliation.
European VIES VAT Validator →
Check supplier and customer VAT identifiers before accepting a hybrid e-invoice.