1. Übersicht

Der Server stellt drei Tools und eine Resource bereit, die von KI-Agenten über das Model Context Protocol aufgerufen werden können.

SzenarioTool / Resource
Rechnung vor dem Versand prüfenvalidate_invoice
XML-Daten aus ZUGFeRD-PDF lesenextract_xml
Prüfen ob PDF und XML übereinstimmencheck_consistency
Verfügbare Formate und Regelsets abfragenvalidation://rules
Alle Antworten sind strukturiertes JSON. Kein Freitext — jeder Fehler enthält Regel-ID, betroffenes Feld, Fehlermeldung, umsetzbaren Korrekturvorschlag und XPath.

2. Architektur & Datenfluss

KI-Agent │ │ MCP-Nachricht (JSON-RPC über stdio) ▼ ┌─────────────────────────────────────────┐ │ zugferd-mcp-client (npm, lokal) │ │ │ │ validate_invoice · extract_xml │ │ check_consistency │ │ │ │ │ HTTPS REST-Request │ │ ▼ │ │ ZUGFeRD Validator API (gehostet) │ │ api.zugferd-validator.de │ │ Auth: X-Api-Key │ │ │ │ │ Base64 → Mustang + KoSIT (parallel) │ │ ▼ │ │ Report-Parser + Fix-Suggestions-DB │ └─────────────────┬───────────────────────┘ │ Strukturiertes JSON ▼ KI-Agent erhält Ergebnis

Ablauf für validate_invoice

1
MCP-Client empfängt Aufruf — Base64-Datei + Parameter vom KI-Agenten
2
HTTPS-Request an API — POST /v1/validate mit X-Api-Key Header
3
Auth & Rate-Limit — API prüft Key und Monatslimit des Tiers
4
Dual-Validierung (parallel) — Mustang CLI (ZUGFeRD/Factur-X) und KoSIT Validierungstool (XRechnung + EN 16931 CII) laufen gleichzeitig (max. 30s)
5
Ergebnisse konsolidieren — Fehler beider Engines werden zusammengeführt und dedupliziert; Fix-Suggestions angereichert
6
JSON-Ergebnis — API antwortet, MCP-Client leitet an KI-Agenten weiter

3. Validierungsengines

Jede Anfrage wird von zwei Engines gleichzeitig geprüft. Die Ergebnisse werden konsolidiert und dedupliziert zurückgegeben.

EngineVersionAbgedeckte Formate
Mustang Project v2.26.0 ZUGFeRD 1.0–2.4, Factur-X 1.0, XRechnung (allgemein)
KoSIT Validierungstool v1.6.3 XRechnung 3.0.2 (CII + UBL), EN 16931 CII/UBL (plain), Factur-X 1.07.3 / 1.08 (alle Profile)
Konsolidierte Antwort: Fehler aus beiden Engines erscheinen in derselben errors-Liste. Duplikate (gleiche Regel-ID + Meldung) werden automatisch entfernt. KoSIT-Fehler fließen nur ein, wenn ein passendes Validierungsszenario erkannt wurde — bei unbekannten GuidelineIDs übernimmt Mustang allein.

4. Installation & Konfiguration

1
API-Key holen
# Kostenlos registrieren:
https://zugferd-validator.de/portal
2
MCP-Client installieren
npm install -g zugferd-mcp-client
3
In MCP-Client konfigurieren
// mcp_config.json (je nach Client abweichender Pfad)
{
  "mcpServers": {
    "zugferd": {
      "command": "zugferd-mcp-client",
      "env": {
        "ZUGFERD_API_KEY": "zv_dein_key_hier"
      }
    }
  }
}

Direkte REST API

Die API kann auch direkt ohne MCP-Client angesprochen werden:

# Beispiel: Validierung per curl
curl -X POST https://api.zugferd-validator.de/v1/validate \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: zv_dein_key_hier" \
  -d '{"file_content":"<base64>","file_type":"xml"}'

Umgebungsvariablen (MCP-Client)

VariableBeschreibungStandard
ZUGFERD_API_KEYAPI-Key vom Portal– (Pflicht)
ZUGFERD_API_URLAPI-Basis-URLhttps://api.zugferd-validator.de

5. Tools

validate_invoice TOOL

Validiert eine E-Rechnung (ZUGFeRD/Factur-X PDF oder XRechnung XML) gegen EN 16931 und die deutschen Erweiterungen. Gibt strukturierte Fehler, Warnungen und Korrekturvorschläge zurück.

Input-Schema

file_content * string Base64-kodierter Inhalt der PDF- oder XML-Datei. Data-URL-Präfixe (data:application/pdf;base64,…) werden automatisch entfernt.
file_type * enum "pdf" für ZUGFeRD/Factur-X-PDFs · "xml" für reine XRechnung/CII-XML-Dateien
profile enum? Optionale Profilangabe. Bei Abweichung zum erkannten Profil wird eine warning mit rule_id: "PROFILE_MISMATCH" erzeugt.
Werte: minimum · basic_wl · basic · en16931 · extended · xrechnung

Output-Schema

{
  "valid":    true,
  "format":   "ZUGFeRD 2.x",
  "profile":  "EN16931",
  "summary":  "Keine Probleme gefunden",
  "errors":   [],
  "warnings": [],
  "notices":  [],
  "metadata": {
    "invoice_number": "RE-2026-001",
    "issue_date":     "2026-04-01",
    "seller":         "Musterfirma GmbH",
    "buyer":          "Beispiel AG",
    "total_amount":   "1190.00",
    "currency":       "EUR"
  }
}
{
  "valid":   false,
  "format":  "ZUGFeRD 2.x",
  "profile": "EN16931",
  "summary": "2 Fehler, 1 Warnung gefunden",
  "errors": [
    {
      "severity":       "error",
      "rule_id":        "BR-DE-15",
      "field":          "BT-10",
      "message":        "Die Käuferreferenz / Leitweg-ID (BT-10) muss übermittelt werden.",
      "fix_suggestion": "Füge die Käuferreferenz / Leitweg-ID (BT-10) in 'ram:ApplicableHeaderTradeAgreement/ram:BuyerReference' ein.",
      "xpath":          "//ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"
    }
  ],
  "warnings": [
    {
      "severity":       "warning",
      "rule_id":        "BR-CL-10",
      "field":          "BT-81",
      "message":        "Zahlungsmittelcode muss aus UNTDID 4461 stammen.",
      "fix_suggestion": "Verwende z.B. '58' für SEPA-Überweisung oder '59' für SEPA-Lastschrift.",
      "xpath":          "//ram:SpecifiedTradeSettlementPaymentMeans/ram:TypeCode"
    }
  ]
}

Ausgabefelder

FeldTypPflichtBeschreibung
validbooleanJatrue wenn kein einziger Fehler gefunden wurde
formatstringNeinErkanntes Format, z.B. "ZUGFeRD 2.x", "CII EN16931", "XRechnung 3.0" — null wenn kein XML extrahierbar
profilestringNeinErkanntes Profil in Großbuchstaben, z.B. "EN16931", "XRECHNUNG" — null wenn kein XML extrahierbar
summarystringJaLesbare Zusammenfassung, z.B. "2 Fehler, 1 Warnung gefunden"
errorsarrayJaValidierungsfehler — machen die Rechnung ungültig
warningsarrayJaWarnungen — Rechnung kann trotzdem gültig sein
noticesarrayNeinInformative Hinweise ohne Einfluss auf die Gültigkeit
metadataobjectNeinExtrahierte Rechnungsdaten — bei PDFs vorhanden wenn eingebettetes XML erfolgreich gelesen wurde, bei file_type: "xml" immer
extract_xml TOOL

Extrahiert das eingebettete XML-Dokument aus einer ZUGFeRD/Factur-X-PDF. Gibt den vollständigen XML-Inhalt als String zurück, zusammen mit erkanntem Format und Profil.

Input

pdf_content * string Base64-kodierter Inhalt der ZUGFeRD/Factur-X-PDF-Datei.

Output

{
  "xml_content": "<?xml version='1.0' encoding='UTF-8'?>\n<rsm:CrossIndustryInvoice ...>...</rsm:CrossIndustryInvoice>",
  "format":      "ZUGFeRD 2.x",
  "profile":     "EN16931"
}
Das extrahierte xml_content kann direkt (nach Base64-Kodierung) an validate_invoice mit file_type: "xml" weitergegeben werden.
check_consistency TOOL

Prüft, ob die für Menschen sichtbaren Daten im PDF (Rechnungsnummer, Datum, Gesamtbetrag) mit den im XML-Anhang gespeicherten Maschinendaten übereinstimmen. Deckt Manipulationen oder Erfassungsfehler auf.

Input

pdf_content * string Base64-kodierter Inhalt der ZUGFeRD/Factur-X-PDF-Datei.

Output

{
  "consistent":    true,
  "discrepancies": []
}
{
  "consistent":    false,
  "discrepancies": [
    {
      "field":     "total_amount",
      "pdf_value": "1190.00",
      "xml_value": "1180.00",
      "message":   "Gesamtbetrag im PDF ('1190.00') unterscheidet sich von dem im XML ('1180.00')."
    }
  ]
}

Geprüfte Felder & Toleranzen

FeldErkennungsmuster im PDFToleranz
invoice_numberRechnungsnummer:, Rechnung Nr., Invoice No.Groß-/Kleinschreibung, Leerzeichen, Bindestriche ignoriert
issue_dateRechnungsdatum:, Datum:, Invoice Date:Keiner — Datumformate werden auf ISO 8601 normiert
total_amountGesamtbetrag:, Rechnungsbetrag:, Total:±0,01 EUR (Rundungsdifferenzen)
Die Texterkennung basiert auf dem maschinenlesbaren PDF-Text. Gescannte PDFs ohne OCR-Schicht werden nicht unterstützt.
create_invoice TOOL

Erzeugt aus strukturierten Daten eine valide E-Rechnung — wahlweise als ZUGFeRD-PDF (PDF/A-3 mit eingebettetem EN-16931-CII-XML) oder als reine XRechnung-XML (CII mit XRechnung-3.0-CIUS und Leitweg-ID für B2G). Mehrere Positionen, alle USt-Kategorien (S/Z/E/AE), Rabatte/Zuschläge, Zahlungsangaben. REST: POST /v1/create. Stateless — es wird nichts gespeichert. Beträge in Cent, Datum als YYYY-MM-DD.

Input (Auszug)

format *stringzugferd (PDF) oder xrechnung (XML)
document_typestringBelegart, Standard invoice: credit_note (Gutschrift/Storno), corrected, self_billed, prepayment (Anzahlung), partial (Teilrechnung). Roh über type_code.
preceding_invoiceobjectBezug zur Ursprungsrechnung { number, date } — bei Storno/Korrektur (BT-25/26)
number, date *stringBelegnummer und -datum (YYYY-MM-DD)
seller, buyer *objectParteien (name, street, zip, city, country, vat_id, email …)
lines *arrayPositionen: name, quantity, unit_net_price_cents, vat_category, vat_rate
allowances_chargesarrayRabatte/Zuschläge auf Dokumentebene
buyer_referencestringLeitweg-ID (BT-10) — bei xrechnung Pflicht
payment_terms, due_date, payment_meansstring/objectZahlungsbedingungen, Fälligkeit, IBAN/BIC
seller_logostringLogo Base64 (PNG/JPG) — nur Automatisieren/Skalieren
self_checkbooleanSofort gegen EN 16931 prüfen (langsamer). Standard false.

Output

{
  "format":     "zugferd",
  "profile":    "EN16931",
  "pdf_base64": "JVBERi0xLjc…",
  "xml":        "<?xml version=\"1.0\"…",
  "branding":   "free_footer"
}
Self-Check entkoppelt: Standardmäßig kommt die Rechnung sofort zurück. Den Konformitätsnachweis holst du im zweiten Schritt über validate_invoice auf das zurückgegebene pdf_base64 bzw. xml — oder setzt self_check: true für einen einzigen Roundtrip. Branding (Footer im Prüfen-Tarif / White-Label ab Automatisieren) wird serverseitig aus dem Tarif bestimmt. Eigenes Wochenkontingent: Prüfen 1, Automatisieren 20, Skalieren unbegrenzt.
Sandbox-Key (zv_test_…, über GET /v1/keys/me): zum Testen der Rechnungserstellung. Erstellte Rechnungen tragen ein gekacheltes „DEMO"-Wasserzeichen auf jeder Seite plus XML-Marker — voll testbar, aber als echte Rechnung wertlos. 100/Tag, 3/Minute, getrennt vom Live-Kontingent. Prüfungen über den Sandbox-Key zählen dagegen auf dein normales Wochenkontingent: Sie rechnen dasselbe und liefern dasselbe Ergebnis.
POST /v1/convert REST

Macht aus einer bestehenden Rechnung als PDF, Word oder Excel eine E-Rechnung: ZUGFeRD in deinem bisherigen Layout oder XRechnung. Ein Sprachmodell auf unserem eigenen Server liest die Werte aus, wir rechnen sie nach und legen sie als Entwurf vor. Die E-Rechnung entsteht erst, wenn du den Entwurf bestätigst, und kommt nur zurück, wenn sie unsere Prüfung gegen EN 16931 besteht. Ab Automatisieren (20 Umwandlungen im Monat) und Skalieren (100). Umwandlungen zählen nicht auf das Prüf- oder Erstellkontingent.

Ablauf

  1. POST /v1/convert mit einer oder mehreren Dateien. Antwort sofort mit 202 und je Datei einem Auftrag im Status queued.
  2. GET /v1/convert/{id} abfragen, bis der Status draft ist, meist nach ein bis zwei Minuten. Bei mehreren Dateien oder längerer Erkennung kommt zusätzlich eine E-Mail an die Adresse des Kontos.
  3. Den Entwurf prüfen. Was in uncertain steht, sollte ein Mensch ansehen; reasons sagt je Feld, warum.
  4. POST /v1/convert/{id}/confirm mit den bestätigten Werten. Antwort mit der fertigen Datei als Base64. Danach sind Upload und Entwurf gelöscht.

Voraussetzungen

X-Api-Key *HeaderLive-Key ab Automatisieren. Sandbox-Keys und der kostenlose Tarif werden mit 403 abgelehnt.
Absenderprofil *KontoDeine Firma steht als Verkäufer auf der E-Rechnung. Ohne Profil (Firma und Anschrift, im Konto unter „Absender“) antwortet der Upload mit 409 und issuer_profile_missing: true.

Hochladen: POST /v1/convert

files *arrayBis 30 Dateien je Aufruf, je höchstens 10 MB: [{ name, content }], content als Base64. Erlaubt sind PDF, DOCX, XLSX, ODT, ODS, DOC und XLS. Gescannte Rechnungen werden mit Status rejected abgelehnt.
{
  "batch": "lomvuvzjtl5y94syeglx",
  "jobs": [
    { "id": "5113py49uqxfatik47rn", "filename": "RE-2026-121.pdf", "format": "pdf",
      "status": "queued", "reason": null,
      "created_at": "2026-10-12T11:17:58.000Z", "expires_at": "2026-10-13T11:17:58.000Z" }
  ],
  "note": "Sobald ein Entwurf zur Prüfung bereitliegt, hat er den Status „draft“. …"
}

Status eines Auftrags: queued, processing, draft, done, rejected (Datei nicht umwandelbar, Grund in reason), failed. batch ist bei einer einzelnen Datei null.

Aufträge und Kontingent: GET /v1/convert

{
  "jobs": [ … ],
  "quota": { "limit": 20, "used": 11, "overage_cents": 399, "overage_possible": true },
  "blocked_reason": null
}

Gezählt wird je Kalendermonat, in einem Firmenkonto über die Firma. blocked_reason ist gesetzt, wenn der Tarif das Umwandeln nicht enthält.

Entwurf: GET /v1/convert/{id}

Der Auftrag wie oben, im Status draft zusätzlich mit draft. Beträge in Euro, nicht in Cent. GET /v1/convert/{id}/pdf liefert die hochgeladene Rechnung als PDF, solange der Entwurf besteht.

invoice_number, issue_datestringRechnungsnummer und -datum (YYYY-MM-DD)
buyer, sellerobjectname, street, postal_code, city, country, vat_id. Der Verkäufer kommt aus deinem Absenderprofil, nicht aus der Datei.
linesarraydescription, quantity, unit, unit_code, unit_unknown, unit_price, net_amount, tax_rate. unit ist der Text auf der Rechnung, unit_code der Code nach UN/ECE Rec. 20.
allowances_chargesarrayRabatte und Zuschläge auf die ganze Rechnung: type (allowance oder charge), reason, amount netto
net_total, tax_total, gross_total, tax_ratenumberSummen, wie sie auf der Rechnung stehen
tax_exemptionstringBei 0 %: AE (Reverse Charge) oder E (steuerbefreit), wenn der Grund im Text steht, sonst null
checksobjecttotals_add_up, totals_in_text, lines_match_net, buyer_is_not_seller, seller_on_invoice
uncertainarrayFelder, die ein Mensch prüfen sollte: invoice_number, issue_date, net_total, tax_total, gross_total, buyer, lines, units, tax_exemption, seller, allowances_charges
reasonsobjectJe unsicherem Feld ein Satz, warum, etwa "units": "Die Einheit „Fass“ kennen wir nicht …"

Bestätigen: POST /v1/convert/{id}/confirm

format *stringzugferd (deine PDF mit eingebettetem XML) oder xrechnung (nur XML)
invoice_number, issue_date *stringRechnungsnummer und -datum
buyer *objectWie im Entwurf, dazu email (bei XRechnung Pflicht). vat_id ist bei Reverse Charge Pflicht.
lines *arraydescription, quantity, unit_code, unit_price, net_amount, tax_rate. Fehlt tax_rate, gilt der Satz der Rechnung.
net_total, tax_total, gross_total, tax_rate *numberDie Summen müssen centgenau zu den Positionen passen, sonst 422 mit problems
tax_exemptionstringPflicht, sobald eine Position 0 % hat: AE oder E
allowances_chargesarrayRabatte und Zuschläge; wir verteilen sie anteilig auf die Steuersätze
delivery_date, buyer_reference, payment_termsstringLeistungsdatum, Leitweg-ID (BT-10), Zahlungsbedingungen
own_invoicebooleanBestätigt, dass die Rechnung von dir stammt. Nötig, wenn dein Absender nicht in der Datei steht, sonst 422 mit own_invoice_required: true
accept_overagebooleanBestätigt die kostenpflichtige Mehrnutzung, wenn das Monatskontingent aufgebraucht ist, sonst 402 mit overage_required: true
{
  "ok":       true,
  "filename": "RE-2026-121.pdf",
  "mime":     "application/pdf",
  "content":  "JVBERi0xLjc…",
  "note":     "Die E-Rechnung ist formal gültig und von dir bestätigt. …"
}

Fehler

400missingPflichtangaben fehlen; missing nennt sie
402quotaMonatskontingent aufgebraucht. Mit overage_required: true per accept_overage bestätigen; ohne dieses Feld ist Mehrnutzung für das Konto nicht eingerichtet
409Auftrag noch nicht im Status draft oder schon umgewandelt
410Datei nach 24 Stunden gelöscht, bitte neu hochladen
422problemsSummen passen nicht, eine Pflichtangabe der Norm fehlt oder die Prüfung schlägt fehl; problems erklärt es auf Deutsch
Mehrnutzung: Jede Umwandlung über dem Monatskontingent kostet 3,99 € zzgl. USt und kommt auf die nächste Rechnung. Gezählt wird erst bei der erfolgreichen Bestätigung; ein Upload, aus dem nichts wird, kostet nichts. DELETE /v1/convert/{id} verwirft einen Auftrag und löscht die Datei sofort.
Datenschutz: Hochgeladene Dateien, gelesener Text und Entwurf liegen verschlüsselt (AES-256) auf unserem Server in Deutschland, bis du bestätigst oder verwirfst, höchstens 24 Stunden. Die Erkennung läuft auf demselben Server; die Inhalte gehen an keinen weiteren Dienst.
GET /v1/invoices REST

Listet die Rechnungen, die wir dir gestellt haben, mit Nummer, Datum und Beträgen. GET /v1/invoices/{nummer}/pdf liefert das Dokument als PDF. Die Rechnungen sind selbst gültige E-Rechnungen im ZUGFeRD-Format nach EN 16931, deine Buchhaltung kann sie also einlesen. Dieselbe Liste steht im Konto unter „Rechnungen". Der Aufruf kostet kein Kontingent.

Anmeldung

X-Api-Key *HeaderDein API-Key. Alternativ als ?api_key=… an die Adresse.

Beispiel

curl -H "X-Api-Key: dein_key" https://api.zugferd-validator.de/v1/invoices

curl -H "X-Api-Key: dein_key" \
  -o ZF-2026-007.pdf \
  https://api.zugferd-validator.de/v1/invoices/ZF-2026-007/pdf

Antwort

{
  "invoices": [
    { "number": "ZF-2026-007", "date": "2026-08-17T09:12:03.000Z",
      "net": 2000, "vat": 380, "gross": 2380, "currency": "eur" }
  ]
}

Beträge in Cent. Es werden nur eigene Rechnungen ausgeliefert; die Nummer eines anderen Kontos beantworten wir mit 404.

validation_report TOOL

Liefert das Prüfergebnis als Validierungsbericht im Format PDF/A-3b, zum Ablegen und Weitergeben. Der Bericht nennt das Ergebnis, alle Meldungen mit Regel-ID und Feld, den Prüfzeitpunkt, das erkannte Format samt Profil, die SHA-256-Prüfsumme der geprüften Datei und den Regelstand, also die Versionen der eingesetzten Prüfwerkzeuge. Jeder Aufruf prüft die Datei neu und zählt wie eine Validierung gegen das Wochenkontingent. Als MCP-Werkzeug validation_report und über REST als POST /v1/report.

Input

file_content *stringBase64-Inhalt der Rechnung
file_type *stringpdf oder xml
attach_sourcebooleanGeprüfte Rechnung sichtbar anhängen: Bei einer PDF kommen ihre Seiten hinten an den Bericht, bei einer XML wird der Inhalt abgedruckt. Zusätzlich liegt die Datei unverändert eingebettet bei (PDF/A-3, AFRelationship /Source), damit sie maschinell lesbar bleibt. Standard false.
langstringde, en, fr — Standard de
file_namestringDateiname für den Bericht. Ohne Angabe rechnung.pdf bzw. rechnung.xml.

Output

Content-Type: application/pdf
Content-Disposition: attachment; filename="validierungsbericht-rechnung.pdf"
X-Validation-Result: valid | invalid

Beispiel

curl -X POST https://api.zugferd-validator.de/v1/report \
  -H "X-Api-Key: $ZV_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"file_content\": \"$(base64 -w0 rechnung.pdf)\", \"file_type\": \"pdf\", \"attach_source\": true}" \
  -o bericht.pdf
Es wird nichts gespeichert. Die Datei wird für den Aufruf geprüft und danach verworfen; damit Bericht und archivierte Rechnung später zusammenfinden, steht die SHA-256-Prüfsumme im Bericht. Der Bericht ist keine rechtsverbindliche Bescheinigung, sondern dokumentiert eine technische Prüfung zu einem Zeitpunkt gegen einen benannten Regelstand, und er ersetzt nicht die Aufbewahrung der Rechnung im Originalformat.
Ab dem Tarif Automatisieren, Sandbox-Keys eingeschlossen. Im kostenlosen Tarif antwortet der Endpunkt mit 403; einen Beispielbericht mit Wasserzeichen gibt es ohne Schlüssel unter GET /v1/report/sample?lang=de|en|fr.

6. Resource: validation_rules

Gibt das aktuelle Regelwerk des Servers zurück: unterstützte Formate, Profile und die verwendete Validierungsengine.

URI: validation://rules

{
  "supported_formats": [
    "ZUGFeRD 1.0", "ZUGFeRD 2.0", "ZUGFeRD 2.1", "ZUGFeRD 2.2",
    "ZUGFeRD 2.3", "ZUGFeRD 2.x / Factur-X 1.0x",
    "XRechnung 1.2", "XRechnung 2.0", "XRechnung 2.3", "XRechnung 3.0"
  ],
  "supported_profiles": [
    "minimum", "basic_wl", "basic", "en16931", "extended", "xrechnung"
  ],
  "validation_engines": [
    "Mustang Project v2.26.0",
    "KoSIT Validierungstool v1.6.3 (XRechnung 3.0.2 + EN 16931 CII)"
  ],
  "last_updated":      "2026-04-08"
}

7. Fehlerbehandlung

Alle Tools geben bei Fehlern ein JSON-Objekt mit einem error-Feld zurück. Es gibt niemals eine unstrukturierte Fehlerausgabe.

{
  "error":   "Kurze Fehlerkategorie",
  "details": "Ausführliche Beschreibung mit konkretem Hinweis zur Behebung."
}
errorAuslöser
"Fehlender Parameter"Pflichtfeld nicht übergeben
"Ungültiger Parameter"Falscher Wert für file_type
"Ungültiger Base64-Input"Kein gültiger Base64-String übergeben
"Validierungsfehler"Mustang CLI konnte nicht starten (z.B. Java fehlt) oder Timeout nach 30s
"XML-Extraktion fehlgeschlagen"Keine XML-Datei im PDF-Anhang gefunden (bei extract / consistency). Bei validate wird stattdessen ein Notice mit rule_id: "NO_EMBEDDED_XML" zurückgegeben und valid: true gesetzt
"PDF-Lesefehler"PDF kann nicht gelesen werden
"XML-Parsing-Fehler"Extrahiertes XML ist kein valides XML
"Interner Fehler"Unerwarteter Laufzeitfehler
Timeout: Beide Validierungsengines laufen parallel und werden nach jeweils 30 Sekunden abgebrochen. Schlägt Mustang fehl, wird "error": "Validierungsfehler" zurückgegeben. Ein KoSIT-Timeout wird still ignoriert — Mustang-Ergebnisse bleiben erhalten.

8. Gemeinsame Datentypen

ValidationIssue

Wird in den Arrays errors, warnings und notices von validate_invoice verwendet.

FeldTypPflichtBeschreibung
severity"error" | "warning" | "notice"JaSchweregrad des Befundes
rule_idstringJaRegel-ID, z.B. "BR-DE-1", "BR-CL-10". Wert "UNKNOWN" bei XSD-Schema-Verletzungen (KoSIT) oder wenn keine Regel-ID ermittelbar ist
fieldstringNeinBetroffenes BT-Feld, z.B. "BT-10"
messagestringJaFehlermeldung auf Deutsch
fix_suggestionstringNeinKonkreter Korrekturhinweis mit XML-Beispiel
xpathstringNeinXPath zum betroffenen XML-Element

InvoiceMetadata

Optionales Feld im Ergebnis von validate_invoice (nur bei file_type: "xml").

FeldTypBeschreibung
invoice_numberstring?Rechnungsnummer (BT-1)
issue_datestring?Rechnungsdatum ISO 8601, z.B. "2026-04-01"
sellerstring?Name des Verkäufers (BT-27)
buyerstring?Name des Käufers (BT-44)
total_amountstring?Gesamtbetrag als Dezimalstring, z.B. "1190.00"
currencystring?ISO 4217 Währungscode, z.B. "EUR"

9. Unterstützte Formate & Profile

Formate

FormatStandardAnmerkung
ZUGFeRD 1.0ZUGFeRD 1.0 / GEFEGÄltere Version, eingeschränkte Profilunterstützung
ZUGFeRD 2.0FeRD 2.0Erste CII-basierte Version
ZUGFeRD 2.1Factur-X 1.0 (FR)Technisch identisch mit Factur-X 1.0
ZUGFeRD 2.2Factur-X 1.0.05Kleinere Korrekturen
ZUGFeRD 2.3Factur-X 1.0.06Version vor 2.4
ZUGFeRD 2.x / Factur-X 1.0xEN 16931 + D16BAktuelle Hauptversion (2026) — API gibt "ZUGFeRD 2.x" zurück
XRechnung 1.2XRechnung 1.2Ältere XRechnung-Version
XRechnung 2.xXRechnung 2.0–2.3Verschiedene Zwischenversionen
XRechnung 3.0XRechnung 3.0Aktuelle XRechnung-Version

Profile (ZUGFeRD/Factur-X)

Profil-IDAnzeigenameTypischer Einsatz
minimumMINIMUMEinfache maschinelle Verarbeitung
basic_wlBASIC-WLOhne Positionsdetails
basicBASICStandard-Rechnungen
en16931EN 16931 (COMFORT)Öffentliche Auftraggeber, PEPPOL
extendedEXTENDEDKomplexe B2B-Prozesse
xrechnungXRECHNUNGDeutsche öffentliche Verwaltung

10. Regelwerk & Korrekturvorschläge

Der Server enthält eine Datenbank mit Korrekturvorschlägen für 160 Regelkategorien. Fehler beider Validierungsengines (Mustang + KoSIT) werden konsolidiert — wenn eine bekannte Regel-ID gefunden wird, wird der Korrekturvorschlag automatisch angehängt.

BR-DE-Regeln 26 Regeln

Deutsche Erweiterungen — Pflicht für XRechnung-konforme Rechnungen.

Regel-IDFeldKurzbeschreibung
BR-DE-1BG-16PAYMENT INSTRUCTIONS (BG-16) fehlen
BR-DE-2BG-6SELLER CONTACT (BG-6)
BR-DE-3BT-37Stadt des Verkäufers (BT-37)
BR-DE-4BT-38PLZ des Verkäufers (BT-38)
BR-DE-5BT-41Ansprechpartner des Verkäufers (BT-41)
BR-DE-6BT-42Telefonnummer des Verkäufers (BT-42)
BR-DE-7BT-43E-Mail des Verkäufers (BT-43)
BR-DE-8BT-52Stadt des Käufers (BT-52)
BR-DE-9BT-53PLZ des Käufers (BT-53)
BR-DE-10BT-77Lieferstadt (BT-77)
BR-DE-11BT-78Liefer-PLZ (BT-78)
BR-DE-12–in aktueller XRechnung-Fassung entfernt
BR-DE-13–in aktueller XRechnung-Fassung entfernt
BR-DE-14BT-119USt-Satz (BT-119)
BR-DE-15BT-10Käuferreferenz / Leitweg-ID (BT-10)
BR-DE-16BT-31USt-ID/Steuernummer des Verkäufers
BR-DE-17BT-3Unzulässiger Rechnungstyp-Code (BT-3)
BR-DE-18BT-20Skonto-Angaben (BT-20) im falschen Format
BR-DE-19–in aktueller XRechnung-Fassung entfernt
BR-DE-20–in aktueller XRechnung-Fassung entfernt
BR-DE-21BT-24Specification identifier (BT-24) nicht XRechnung-konform
BR-DE-22–Anhang-Dateinamen nicht eindeutig
BR-DE-23–in aktueller XRechnung-Fassung entfernt
BR-DE-24–in aktueller XRechnung-Fassung entfernt
BR-DE-25–in aktueller XRechnung-Fassung entfernt
BR-DE-26BT-3Rechnungskorrektur ohne Bezugsrechnung (BG-3)

EN-16931-Kernregeln (BR-*) 10 Regeln

Regel-IDFeldKurzbeschreibung
BR-1BT-24Specification identifier (BT-24)
BR-2BT-1Rechnungsnummer (BT-1)
BR-3BT-2Rechnungsdatum (BT-2)
BR-4BT-3Rechnungstyp-Code (BT-3)
BR-5BT-5Währungscode (BT-5)
BR-6BT-27Verkäufername (BT-27)
BR-7BT-44Käufername (BT-44)
BR-8BG-5Postanschrift des Verkäufers (BG-5)
BR-9BG-5Ländercode des Verkäufers (BT-40)
BR-10BG-8Postanschrift des Käufers (BG-8)

Berechnungsregeln (BR-CO-*) & Codelistenregeln (BR-CL-*) 8 Regeln

Regel-IDKurzbeschreibung
BR-CO-3Steuerdatum und Steuerdatum-Code schließen sich aus
BR-CO-9USt-ID des Verkäufers ohne Länderpräfix
BR-CO-10Summe der Netto-Positionsbeträge stimmt nicht
BR-CO-13Gesamtbetrag ohne USt falsch berechnet
BR-CL-10Ungültige schemeID (nicht aus ISO 6523)
BR-CL-16Ungültiger Zahlungsart-Code (nicht aus UNTDID 4461)
BR-CL-17Ungültige USt-Kategorie auf Positionsebene
BR-CL-18Ungültige USt-Kategorie auf Belegebene

Steuerkategorieregeln (BR-S/Z/E/AE-*) 4 Regeln

Regel-IDKurzbeschreibung
BR-S-1Steuerbetrag bei Normalsatz (S) angegeben
BR-Z-1Steuerbetrag bei Nullsatz (Z) = 0
BR-E-1Steuerbetrag bei Steuerbefreiung (E) = 0
BR-AE-1Steuerbetrag bei Reverse Charge (AE) = 0

11. Nutzungsbeispiele

Beispiel 1: XRechnung-XML validieren

{
  "tool": "validate_invoice",
  "arguments": {
    "file_content": "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
    "file_type":   "xml",
    "profile":     "xrechnung"
  }
}
{
  "valid":   true,
  "format":  "XRechnung 3.0",
  "profile": "XRECHNUNG",
  "summary": "Keine Probleme gefunden",
  "errors":  [],
  "warnings": [],
  "metadata": {
    "invoice_number": "INV-2026-0042",
    "issue_date":     "2026-04-07",
    "seller":         "Tech GmbH",
    "buyer":          "Bundesbehörde X",
    "total_amount":   "5950.00",
    "currency":       "EUR"
  }
}

Beispiel 2: Fehlerhafte Rechnung mit Korrekturvorschlag

{
  "tool": "validate_invoice",
  "arguments": {
    "file_content": "JVBERi0xLjQK...",
    "file_type":   "pdf"
  }
}
{
  "valid":   false,
  "format":  "ZUGFeRD 2.x",
  "profile": "EN16931",
  "summary": "1 Fehler gefunden",
  "errors": [{
    "severity":       "error",
    "rule_id":        "BR-DE-23",
    "field":          "BT-10",
    "message":        "Käuferreferenz (BT-10) muss für XRechnung angegeben werden.",
    "fix_suggestion": "Füge 'ram:BuyerReference' hinzu, z.B. '04011000-1234-34' für Behörden.",
    "xpath":          "//ram:ApplicableHeaderTradeAgreement/ram:BuyerReference"
  }],
  "warnings": []
}

Beispiel 3: XML extrahieren und validieren

// Schritt 1 — XML aus PDF extrahieren
{ "tool": "extract_xml", "arguments": { "pdf_content": "JVBERi0x..." } }

// Schritt 2 — Extrahiertes XML validieren (base64-kodiert übergeben)
{ "tool": "validate_invoice", "arguments": { "file_content": "<base64 des xml_content>", "file_type": "xml" } }

Beispiel 4: Konsistenzprüfung

{
  "tool": "check_consistency",
  "arguments": { "pdf_content": "JVBERi0xLjQK..." }
}
{
  "consistent":    false,
  "discrepancies": [{
    "field":     "total_amount",
    "pdf_value": "1190.00",
    "xml_value": "1180.00",
    "message":   "Gesamtbetrag im PDF ('1190.00') unterscheidet sich von dem im XML ('1180.00')."
  }]
}

Beispiel 3: Plain-PDF ohne eingebettetes XML

Eine normale PDF-Rechnung ohne ZUGFeRD/Factur-X-Anhang gibt valid: true mit einem informativen Notice zurück — kein Fehler, aber ein Hinweis dass keine strukturierten Daten geprüft werden konnten.

{
  "tool": "validate_invoice",
  "arguments": {
    "file_content": "JVBERi0xLjQK...",
    "file_type":   "pdf"
  }
}
{
  "valid":    true,
  "format":   null,
  "profile":  null,
  "summary":  "2 Hinweise gefunden",
  "errors":   [],
  "warnings": [],
  "notices": [
    {
      "severity": "notice",
      "rule_id":  "UNKNOWN",
      "message":  "XML could not be extracted"
    },
    {
      "severity": "notice",
      "rule_id":  "NO_EMBEDDED_XML",
      "message":  "Kein eingebettetes XML gefunden. Die PDF ist möglicherweise keine ZUGFeRD/Factur-X Rechnung."
    }
  ]
}

12. Grenzen & Bekannte Einschränkungen

EinschränkungDetails
TimeoutMustang CLI wird serverseitig nach 30 Sekunden abgebrochen. Sehr große oder korrupte Dateien können diesen Timeout auslösen.
Rate-LimitValidierung: Prüfen 20/Woche · Automatisieren 500/Woche · Skalieren unbegrenzt. Erstellung (eigenes Kontingent): Prüfen 1/Woche · Automatisieren 20/Woche · Skalieren unbegrenzt. Sandbox-Erstellung: 100/Tag, max. 3/Minute. Sandbox-Prüfungen zählen auf das normale Wochenkontingent. Bei Überschreitung: HTTP 429.
PDF-OCRcheck_consistency wertet nur maschinenlesbaren PDF-Text aus. Eingescannte PDFs ohne OCR-Schicht werden nicht unterstützt.
Metadaten bei PDFsvalidate_invoice extrahiert Metadaten auch bei PDFs, sofern ein eingebettetes XML vorhanden und lesbar ist. Bei Plain-PDFs ohne XML fehlt dieses Feld.
KonsistenzprüfungNur drei Felder werden verglichen (Nummer, Datum, Betrag). Adressen, Steuernummern und Positionsdetails werden nicht abgeglichen.
Unbekannte Regel-IDsFehlt eine Regel-ID in der Fix-Suggestions-DB, bleibt fix_suggestion leer. Die Meldung wird trotzdem zurückgegeben.
DateigrößeKeine explizite Größenbeschränkung, aber sehr große PDFs (>50 MB) können zum Timeout führen.

13. Changelog

Oktober 2026: Umwandeln

  • Neu: POST /v1/convert macht aus PDF, Word oder Excel eine E-Rechnung (ZUGFeRD im bisherigen Layout oder XRechnung), mit Entwurf, Bestätigung und Prüfung vor der Ausgabe.
  • Erkennt mehrere Steuersätze, Rabatte und Zuschläge, Reverse Charge und Einheiten; unsichere Felder mit Begründung.
  • Ab Automatisieren (20 im Monat) und Skalieren (100), Mehrnutzung 3,99 € je Umwandlung mit ausdrücklicher Bestätigung.

Juni 2026 — Rechnungserstellung

  • Neues Tool create_invoice / POST /v1/create: valide E-Rechnungen aus strukturierten Daten erzeugen — als ZUGFeRD-PDF (PDF/A-3) oder reine XRechnung-XML (mit Leitweg-ID für B2G).
  • Mehrere Positionen, alle USt-Kategorien (S/Z/E/AE), Rabatte/Zuschläge, Zahlungsangaben, Fälligkeit.
  • Belegtypen: Rechnung, Gutschrift/Storno, Korrektur, Gutschriftverfahren, Anzahlungs- und Teilrechnung — mit Bezug auf die Ursprungsrechnung.
  • Tier-abhängiges Branding (Footer im Prüfen-Tarif / White-Label ab Automatisieren mit optionalem Logo); eigenes Wochenkontingent, getrennt von der Validierung.
  • Sandbox-/Test-Keys (zv_test_…): freies Integrieren mit „DEMO"-Wasserzeichen, ohne das Live-Kontingent zu verbrauchen.

April 2026 — Erstveröffentlichung

  • Validierung gegen EN 16931 (validate_invoice) für ZUGFeRD/Factur-X-PDF und XRechnung-XML, mit konkreten Korrekturvorschlägen.
  • XML-Extraktion (extract_xml) und Konsistenzprüfung PDF↔XML (check_consistency).
  • MCP-Client für Claude & andere KI-Agenten; Mustang- und KoSIT-Engines.