Create ZUGFeRD e-invoices from JSON or PDF, verify Factur-X, check VAT IDs and Peppol.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Prüft per SML/SMP-Lookup, ob ein Geschäftspartner im Peppol-Netz erreichbar ist, und listet seine registrierten Dokumenttypen. Akzeptiert eine volle Kennung ("0088:4399901550926"), eine nackte GLN, eine deutsche USt-IdNr. oder eine Leitweg-ID. registered:false ist ein normales Ergebnis, kein Fehler. Kostenlos.
Kennung des Partners: volle Peppol-Kennung ("0088:4399901550926"), nackte GLN, deutsche USt-IdNr. ("DE123456789") oder Leitweg-ID ("991-33333TEST-33").
Prüft per SML/SMP-Lookup, ob ein Geschäftspartner im Peppol-Netz erreichbar ist, und listet seine registrierten Dokumenttypen. Akzeptiert eine volle Kennung ("0088:4399901550926"), eine nackte GLN, eine deutsche USt-IdNr. oder eine Leitweg-ID. registered:false ist ein normales Ergebnis, kein Fehler. Kostenlos.
| Argument | Type | Description |
|---|---|---|
| participant* | string | Kennung des Partners: volle Peppol-Kennung ("0088:4399901550926"), nackte GLN, deutsche USt-IdNr. ("DE123456789") oder Leitweg-ID ("991-33333TEST-33"). |
{
"type": "object",
"required": [
"participant"
],
"properties": {
"participant": {
"type": "string",
"description": "Kennung des Partners: volle Peppol-Kennung (\"0088:4399901550926\"), nackte GLN, deutsche USt-IdNr. (\"DE123456789\") oder Leitweg-ID (\"991-33333TEST-33\")."
}
},
"additionalProperties": false
}Prüft eine USt-IdNr. live gegen VIES (EU-Bestätigungsverfahren): Gültigkeit plus Firmenname, sofern der Mitgliedsstaat ihn herausgibt. Antwort-Status ist valid, invalid oder unavailable (VIES nicht erreichbar — keine Aussage). Kostenlos.
| Argument | Type | Description |
|---|---|---|
| vat_id* | string | Die zu prüfende USt-IdNr. mit Länderpräfix, z. B. "DE325821677" oder "ATU12345675". Leerzeichen, Punkte und Bindestriche werden toleriert. |
{
"type": "object",
"required": [
"vat_id"
],
"properties": {
"vat_id": {
"type": "string",
"description": "Die zu prüfende USt-IdNr. mit Länderpräfix, z. B. \"DE325821677\" oder \"ATU12345675\". Leerzeichen, Punkte und Bindestriche werden toleriert."
}
},
"additionalProperties": false
}Erzeugt eine ZUGFeRD-PDF aus strukturierten EN-16931-Daten (kein LLM). Mit visueller PDF (pdf_base64/upload_id) wird das XML in diese PDF eingebettet; ohne PDF wird die Rechnung aus den Daten gesetzt, optional mit Logo (logo_base64: PNG, JPEG oder SVG, max. 500 KB) und Sprache (lang: de oder en). Verletzen die Daten EN-16931-Geschäftsregeln, liefert der Remote-Kanal (Chat-Connector) strukturierte Issues statt einer Datei zurück — invoice korrigieren (siehe extract_invoice) und mit denselben Quelldaten (upload_id/pdf_base64) erneut aufrufen. Ohne aktives Abo kostenlos mit Konto (API-Key): die PDF trägt dann das finisma-Prüfsiegel als Wasserzeichen, standardmäßig bis zu 5 Rechnungen pro Tag; mit Abo ohne Wasserzeichen und ohne Tageslimit. Rabatte und Zuschläge je Position (lines[].allowanceCharges) dürfen als Prozentsatz ohne Betrag kommen: amount = round2(Menge × unitPriceNet × percent / 100); ebenso auf die ganze Rechnung (allowanceCharges): Grundbetrag ohne Angabe ist die Summe der lineNetAmount mit ratePercent. lineNetAmount, vatBreakdown und die Summen muss der Aufrufer mit diesen Beträgen rechnen. Für öffentliche Auftraggeber erzeugt invoice.profile='xrechnung' eine XRechnung 3.0 (nur als reines XML über die REST-API mit format=xml; Pflichten: Leitweg-ID in buyerReference, Verkäufer-Kontakt mit Telefon und E-Mail, payment, electronicAddress beider Parteien).
| Argument | Type | Description |
|---|---|---|
| lang | string | Sprache der aus den Daten gesetzten Rechnung (Beschriftungen, Zahlen- und Datumsformat). Standard: de. |
| invoice* | object | Strukturierte Rechnungsdaten nach EN 16931 (wird gegen Schema und Geschäftsregeln geprüft). |
| filename | string | Dateiname der erzeugten Rechnung (Standard: invoice.pdf). |
| logo_mime | string |
Extrahiert EN-16931-Rechnungsdaten aus einer hochgeladenen PDF (Formularfelder) plus Validierungs-Issues, als Korrekturschritt vor create_zugferd: Felder und Issues dem Nutzer zeigen, korrigieren lassen, danach create_zugferd mit dem korrigierten invoice und derselben upload_id aufrufen. Unsichere Felder stehen als Platzhalter 'KORRIGIEREN' (Text) bzw. '1900-01-01' (Datum) drin und werden als Issue mit Code EXTRACTION_UNCERTAIN gemeldet — diese Felder müssen vor create_zugferd korrigiert werden. Enthält die PDF bereits eine eingebettete E-Rechnung (ZUGFeRD/Factur-X), kommen die Felder deterministisch aus der XML (source='xml') statt aus einer Sprachmodell-Lesung des Druckbilds. Erfordert ein Konto mit aktivem Abo oder Guthaben.
| Argument | Type | Description |
|---|---|---|
| upload_id | string | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben. Wird im Ergebnis erneut zurückgegeben und kann anschließend bei create_zugferd als 'upload_id' verwendet werden, damit dieselbe Quell-PDF eingebettet wird. |
| pdf_base64 | string | Die zu extrahierende PDF-Rechnung, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. |
{
"type": "object",
"properties": {
"upload_id": {
"type": "string",
"description": "Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben. Wird im Ergebnis erneut zurückgegeben und kann anschließend bei create_zugferd als 'upload_id' verwendet werden, damit dieselbe Quell-PDF eingebettet wird."
},
"pdf_base64": {
"type": "string",
"description": "Die zu extrahierende PDF-Rechnung, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf.",
"contentEncoding": "base64",
"contentMediaType": "application/pdf"
}
},
"additionalProperties": false
}Liest Kontoauszüge, Kontoberichte und Avise (camt.052, camt.053, camt.054, Versionen .02 und .08) und Gebührenabrechnungen (camt.086, .01 bis .05) in strukturiertes JSON; auch mehrere Dateien als ZIP. 052/053/054: Konten, Salden und Buchungen (Buchungs- und Valutadatum, Betrag, Währung, Soll/Haben, je Transaktion Gegenpartei mit IBAN, Verwendungszweck, End-to-End-Referenz, Buchungscode BkTxCd mit GVC). 086: Abrechnungen mit Services und Summen je Währung. Kostenlos bis 5 Aufrufe pro Monat und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kostet jeder weitere Aufruf 1 Credit. Ein Konto (API-Key oder OAuth) ist immer nötig.
| Argument | Type | Description |
|---|---|---|
| xml | string | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. |
| filename | string | Optionaler Dateiname, erscheint in den Meldungen. |
| file_base64 | string | Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'. |
{
"type": "object",
"properties": {
"xml": {
"type": "string",
"description": "Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'."
},
"filename": {
"type": "string",
"description": "Optionaler Dateiname, erscheint in den Meldungen."
},
"file_base64": {
"type": "string",
"description": "Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'.",
"contentEncoding": "base64"
}
},
"additionalProperties": false
}Erzeugt einen kurzlebigen Upload-Link für eine PDF-Rechnung. Nötig für Chat-Clients (ChatGPT, Claude), die eine angehängte Datei nicht zuverlässig als pdf_base64 an ein Tool übergeben können. Zwei Wege: Der Nutzer lädt die PDF über upload_url im Browser hoch, ODER der Client mit Shell und Netzzugriff lädt sie selbst hoch, per POST als Multipart-Feld 'file' an upload_api_url (curl -F "[email protected]"). Für den direkten Weg muss die Domain finisma.de erreichbar sein; in Claude-Umgebungen mit Netz-Sandbox heißt das, finisma.de in der Domain-Allowlist einzutragen. Die zurückgegebene upload_id kann danach bei create_zugferd/verify_zugferd anstelle von pdf_base64 verwendet werden.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Prüft Kontoauszüge, Kontoberichte und Avise (camt.052, camt.053, camt.054 in den Versionen .02 und .08) sowie Gebührenabrechnungen (camt.086, .01 bis .05); auch mehrere Dateien als ZIP. Liefert je Datei Nachricht, Version, die Befunde der Prüfregeln (Salden, Summen, IBAN-Prüfziffern, Reihenfolge), das Ergebnis der Schemaprüfung (mit Zeile und Spalte) und ein Gesamturteil. Kostenlos bis 5 Aufrufe pro Tag und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kauft 1 Credit einen Prüfblock mit 10 weiteren Prüfungen (für Zahlungsdateien und Kontoauszüge gemeinsam, ohne Ablaufdatum). Ein Konto (API-Key oder OAuth) ist immer nötig.
| Argument | Type | Description |
|---|---|---|
| xml | string | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. |
| filename | string | Optionaler Dateiname, erscheint in den Meldungen. |
| file_base64 | string | Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'. |
{
"type": "object",
"properties": {
"xml": {
"type": "string",
"description": "Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'."
},
"filename": {
"type": "string",
"description": "Optionaler Dateiname, erscheint in den Meldungen."
},
"file_base64": {
"type": "string",
"description": "Die Datei Base64-kodiert: eine XML-Datei oder ein ZIP mit mehreren XML-Dateien (max. 10 MB). Alternativ 'xml'.",
"contentEncoding": "base64"
}
},
"additionalProperties": false
}Prüft eine Zahlungsdatei pain.001 (SEPA-Überweisung oder Auslandszahlung AXZ, Versionen .09 und .03). Erkennt das Profil selbst, fasst den Zahllauf zusammen (Anzahl, Summe je Währung), liefert die Befunde der fachlichen Prüfregeln (Code, Schwere, Meldung, Pfad), das Ergebnis der Schemaprüfung (mit Zeile und Spalte) und ein Gesamturteil. Kostenlos bis 5 Aufrufe pro Tag und Konto. Mit dem Zahlungsverkehr-Abo (Feature payments) ohne Limit. Ohne Abo kauft 1 Credit einen Prüfblock mit 10 weiteren Prüfungen (für Zahlungsdateien und Kontoauszüge gemeinsam, ohne Ablaufdatum). Ein Konto (API-Key oder OAuth) ist immer nötig.
| Argument | Type | Description |
|---|---|---|
| xml | string | Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'. |
| profile | string | Profil der Prüfung: auto (Erkennung aus der Datei), sct (SEPA-Überweisung) oder axz (Auslandszahlung). |
| filename | string | Optionaler Dateiname, erscheint in den Meldungen. |
| file_base64 | string | Die XML-Datei Base64-kodiert (max. 10 MB). Alternativ 'xml'. |
{
"type": "object",
"properties": {
"xml": {
"type": "string",
"description": "Die Datei als XML-Text (max. 10 MB). Alternativ 'file_base64'."
},
"profile": {
"enum": [
"auto",
"sct",
"axz"
],
"type": "string",
"default": "auto",
"description": "Profil der Prüfung: auto (Erkennung aus der Datei), sct (SEPA-Überweisung) oder axz (Auslandszahlung)."
},
"filename": {
"type": "string",
"description": "Optionaler Dateiname, erscheint in den Meldungen."
},
"file_base64": {
"type": "string",
"description": "Die XML-Datei Base64-kodiert (max. 10 MB). Alternativ 'xml'.",
"contentEncoding": "base64"
}
},
"additionalProperties": false
}Prüft eine ZUGFeRD-/Factur-X-PDF: Struktur, EN-16931-Regeln, PDF/A-3-Anhänge.
| Argument | Type | Description |
|---|---|---|
| upload_id | string | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben. |
| pdf_base64 | string | Die zu prüfende PDF-Datei, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. |
{
"type": "object",
"properties": {
"upload_id": {
"type": "string",
"description": "Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Genau eines von beiden angeben."
},
"pdf_base64": {
"type": "string",
"description": "Die zu prüfende PDF-Datei, Base64-kodiert (max. 25 MB). Alternativ 'upload_id' angeben. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf.",
"contentEncoding": "base64",
"contentMediaType": "application/pdf"
}
},
"additionalProperties": false
}| Optional; der Typ wird sonst aus dem Inhalt erkannt. |
| upload_id | string | Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Höchstens eines von beiden angeben. |
| pdf_base64 | string | Optional: die visuelle Rechnungs-PDF, Base64-kodiert (max. 25 MB). In sie wird das CII-XML eingebettet. Alternativ 'upload_id' angeben. Ohne beides wird die Rechnung aus den Daten gesetzt. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf. |
| attachments | array | Optionale Anhänge (z. B. Stundennachweise). Erlaubt: PDF, PNG, JPEG, CSV, XLSX, ODS, XML; je max. 10 MB. |
| logo_base64 | string | Optionales Logo für die aus den Daten gesetzte Rechnung (nur ohne PDF): PNG, JPEG oder SVG, Base64-kodiert oder als data:-URI, max. 500 KB. Steht rechts oben im Kopf. SVG nur ohne Skripte und ohne Verweise auf andere Dateien. |
{
"type": "object",
"required": [
"invoice"
],
"properties": {
"lang": {
"enum": [
"de",
"en"
],
"type": "string",
"description": "Sprache der aus den Daten gesetzten Rechnung (Beschriftungen, Zahlen- und Datumsformat). Standard: de."
},
"invoice": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"invoiceNumber",
"issueDate",
"seller",
"buyer",
"lines",
"vatBreakdown",
"totalNet",
"totalVat",
"totalGross"
],
"properties": {
"buyer": {
"type": "object",
"required": [
"name"
],
"properties": {
"gln": {
"type": "string",
"maxLength": 20
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"vatId": {
"type": "string",
"maxLength": 20
},
"address": {
"type": "object",
"default": {},
"properties": {
"city": {
"type": "string",
"maxLength": 100
},
"line1": {
"type": "string",
"maxLength": 150
},
"line2": {
"type": "string",
"maxLength": 150
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"countryCode": {
"type": "string",
"default": "DE",
"maxLength": 2,
"minLength": 2
}
},
"additionalProperties": false
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 150
},
"email": {
"type": "string",
"maxLength": 150
},
"phone": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"registrationId": {
"type": "string",
"maxLength": 60,
"description": "BT-30 (Verkäufer) / BT-47 (Käufer): Handelsregisternummer bzw. Registerkennung der Partei, z. B. \"HRB 12345, Amtsgericht München\". Nur angeben, wenn sie auf der Rechnung steht. Beim Käufer reicht sie bei Reverse Charge (Kategorie AE) statt der USt-IdNr., bei innergemeinschaftlicher Lieferung (K) nicht."
},
"electronicAddress": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"scheme": {
"type": "string",
"default": "EM",
"maxLength": 10
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"lines": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"quantity",
"unitPriceNet",
"vatRatePercent",
"lineNetAmount"
],
"properties": {
"name": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"quantity": {
"type": "number"
},
"unitCode": {
"type": "string",
"default": "C62",
"maxLength": 12
},
"categoryCode": {
"type": "string",
"maxLength": 12
},
"unitPriceNet": {
"type": "number"
},
"lineNetAmount": {
"type": "number"
},
"buyerArticleId": {
"type": "string",
"maxLength": 200
},
"vatRatePercent": {
"type": "number"
},
"globalArticleId": {
"type": "string",
"maxLength": 60
},
"sellerArticleId": {
"type": "string",
"maxLength": 200
},
"allowanceCharges": {
"type": "array",
"items": {
"type": "object",
"required": [
"charge"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0,
"description": "BT-136/BT-141: Betrag ohne Vorzeichen. Darf fehlen, wenn percent gesetzt ist: dann gilt round2(basisAmount × percent / 100)."
},
"charge": {
"type": "boolean",
"description": "true = Zuschlag (BG-28), false = Abzug/Rabatt (BG-27)."
},
"reason": {
"type": "string",
"maxLength": 200
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "BT-138/BT-143: Prozentsatz, z. B. 10 für 10 % Rabatt."
},
"reasonCode": {
"type": "string",
"maxLength": 10
},
"basisAmount": {
"type": "number",
"description": "BT-137/BT-142: Grundbetrag des Prozentsatzes. Ohne Angabe Menge × unitPriceNet der Position (je Eintrag, nicht gestaffelt)."
}
},
"additionalProperties": false
},
"maxItems": 10
},
"globalArticleScheme": {
"type": "string",
"pattern": "^[0-9A-Za-z]+$",
"maxLength": 10
}
},
"additionalProperties": false
},
"maxItems": 500,
"minItems": 1
},
"notes": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 1000
},
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 1000
},
"subjectCode": {
"type": "string"
}
},
"additionalProperties": false
}
]
},
"maxItems": 20
},
"payee": {
"type": "object",
"required": [
"name"
],
"properties": {
"gln": {
"type": "string",
"maxLength": 20
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"registrationId": {
"type": "string",
"maxLength": 60
}
},
"additionalProperties": false
},
"seller": {
"type": "object",
"required": [
"name"
],
"properties": {
"gln": {
"type": "string",
"maxLength": 20
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"vatId": {
"type": "string",
"maxLength": 20
},
"address": {
"type": "object",
"default": {},
"properties": {
"city": {
"type": "string",
"maxLength": 100
},
"line1": {
"type": "string",
"maxLength": 150
},
"line2": {
"type": "string",
"maxLength": 150
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"countryCode": {
"type": "string",
"default": "DE",
"maxLength": 2,
"minLength": 2
}
},
"additionalProperties": false
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 150
},
"email": {
"type": "string",
"maxLength": 150
},
"phone": {
"type": "string",
"maxLength": 40
}
},
"additionalProperties": false
},
"registrationId": {
"type": "string",
"maxLength": 60,
"description": "BT-30 (Verkäufer) / BT-47 (Käufer): Handelsregisternummer bzw. Registerkennung der Partei, z. B. \"HRB 12345, Amtsgericht München\". Nur angeben, wenn sie auf der Rechnung steht. Beim Käufer reicht sie bei Reverse Charge (Kategorie AE) statt der USt-IdNr., bei innergemeinschaftlicher Lieferung (K) nicht."
},
"electronicAddress": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"scheme": {
"type": "string",
"default": "EM",
"maxLength": 10
}
},
"additionalProperties": false
},
"customerAssignedId": {
"type": "string",
"maxLength": 100
}
},
"additionalProperties": false
},
"dueDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"payment": {
"type": "object",
"properties": {
"bic": {
"type": "string",
"pattern": "^[A-Za-z0-9 ]*$",
"maxLength": 15
},
"iban": {
"type": "string",
"pattern": "^[A-Za-z0-9 ]*$",
"maxLength": 40
},
"terms": {
"type": "string",
"maxLength": 1000
},
"mandateId": {
"type": "string",
"maxLength": 35
},
"meansCode": {
"type": "string"
},
"reference": {
"type": "string",
"maxLength": 140
},
"creditorId": {
"type": "string",
"maxLength": 35
},
"accountName": {
"type": "string",
"maxLength": 200
},
"debitedIban": {
"type": "string",
"pattern": "^[A-Za-z0-9 ]*$",
"maxLength": 40
},
"discountDays": {
"type": "integer",
"maximum": 999,
"minimum": 0
},
"discountPercent": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"additionalProperties": false
},
"profile": {
"enum": [
"en16931",
"xrechnung"
],
"type": "string",
"default": "en16931"
},
"currency": {
"type": "string",
"default": "EUR",
"maxLength": 3,
"minLength": 3
},
"delivery": {
"type": "object",
"properties": {
"gln": {
"type": "string",
"maxLength": 20
},
"name": {
"type": "string",
"maxLength": 200
},
"address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 100
},
"line1": {
"type": "string",
"maxLength": 150
},
"line2": {
"type": "string",
"maxLength": 150
},
"postalCode": {
"type": "string",
"maxLength": 20
},
"countryCode": {
"type": "string",
"maxLength": 2,
"minLength": 2
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"totalNet": {
"type": "number"
},
"totalVat": {
"type": "number"
},
"issueDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"costCenter": {
"type": "string",
"maxLength": 60
},
"paidAmount": {
"type": "number",
"minimum": 0
},
"totalGross": {
"type": "number"
},
"deliveryDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"vatBreakdown": {
"type": "array",
"items": {
"type": "object",
"required": [
"ratePercent",
"basisAmount",
"taxAmount"
],
"properties": {
"taxAmount": {
"type": "number"
},
"basisAmount": {
"type": "number"
},
"ratePercent": {
"type": "number"
},
"categoryCode": {
"type": "string",
"default": "S",
"maxLength": 12
},
"exemptionReason": {
"type": "string",
"maxLength": 500
},
"exemptionReasonCode": {
"type": "string",
"maxLength": 30
}
},
"additionalProperties": false
},
"maxItems": 50,
"minItems": 1
},
"invoiceNumber": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"buyerReference": {
"type": "string",
"maxLength": 80
},
"invoicingPeriod": {
"type": "object",
"properties": {
"end": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"start": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"additionalProperties": false
},
"taxCurrencyCode": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"allowanceCharges": {
"type": "array",
"items": {
"type": "object",
"required": [
"charge"
],
"properties": {
"amount": {
"type": "number",
"minimum": 0,
"description": "BT-92/BT-99: Betrag ohne Vorzeichen. Darf fehlen, wenn percent gesetzt ist: dann gilt round2(basisAmount × percent / 100)."
},
"charge": {
"type": "boolean",
"description": "true = Zuschlag (BG-21), false = Abzug/Nachlass (BG-20)."
},
"reason": {
"type": "string",
"maxLength": 200
},
"percent": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "BT-94/BT-101: Prozentsatz, z. B. 2 für 2 % Nachlass."
},
"reasonCode": {
"type": "string",
"maxLength": 10
},
"basisAmount": {
"type": "number",
"description": "BT-93/BT-100: Grundbetrag des Prozentsatzes. Ohne Angabe die Summe der lineNetAmount aller Positionen mit ratePercent (bei gemischten Kategorien desselben Satzes nur die mit categoryCode)."
},
"ratePercent": {
"type": "number",
"description": "BT-96/BT-103: Steuersatz in Prozent. Darf beim Prozent-Eintrag ohne basisAmount fehlen, wenn alle Positionen denselben Satz haben."
},
"categoryCode": {
"type": "string",
"default": "S",
"maxLength": 12
}
},
"additionalProperties": false
},
"maxItems": 50
},
"documentTypeCode": {
"type": "string",
"default": "380"
},
"projectReference": {
"type": "string",
"maxLength": 200
},
"contractReference": {
"type": "string",
"maxLength": 200
},
"despatchAdviceRef": {
"type": "string",
"maxLength": 200
},
"receivingAdviceRef": {
"type": "string",
"maxLength": 200
},
"deliveryCountryCode": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"precedingInvoiceDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"totalVatInTaxCurrency": {
"type": "number"
},
"precedingInvoiceNumber": {
"type": "string",
"maxLength": 60
},
"purchaseOrderReference": {
"type": "string",
"maxLength": 60
}
},
"description": "Strukturierte Rechnungsdaten nach EN 16931 (wird gegen Schema und Geschäftsregeln geprüft).",
"additionalProperties": false
},
"filename": {
"type": "string",
"description": "Dateiname der erzeugten Rechnung (Standard: invoice.pdf)."
},
"logo_mime": {
"enum": [
"image/png",
"image/jpeg",
"image/svg+xml"
],
"type": "string",
"description": "Optional; der Typ wird sonst aus dem Inhalt erkannt."
},
"upload_id": {
"type": "string",
"description": "Referenz auf eine zuvor über request_upload_link hochgeladene Datei, anstelle von pdf_base64. Höchstens eines von beiden angeben."
},
"pdf_base64": {
"type": "string",
"description": "Optional: die visuelle Rechnungs-PDF, Base64-kodiert (max. 25 MB). In sie wird das CII-XML eingebettet. Alternativ 'upload_id' angeben. Ohne beides wird die Rechnung aus den Daten gesetzt. Chat-Clients, die eine angehängte Datei nicht zuverlässig als Base64 übergeben können, rufen zuerst request_upload_link auf.",
"contentEncoding": "base64",
"contentMediaType": "application/pdf"
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename",
"data_base64"
],
"properties": {
"filename": {
"type": "string"
},
"mime_type": {
"type": "string",
"description": "Optional; wird sonst aus der Dateiendung abgeleitet."
},
"data_base64": {
"type": "string",
"description": "Dateiinhalt, Base64-kodiert (max. 10 MB).",
"contentEncoding": "base64"
},
"description": {
"type": "string",
"description": "Optionale Beschreibung der rechnungsbegründenden Unterlage (BT-123), z. B. \"Stundennachweis März 2026\". Ohne Angabe steht dort der Dateiname."
}
},
"additionalProperties": false
},
"description": "Optionale Anhänge (z. B. Stundennachweise). Erlaubt: PDF, PNG, JPEG, CSV, XLSX, ODS, XML; je max. 10 MB."
},
"logo_base64": {
"type": "string",
"description": "Optionales Logo für die aus den Daten gesetzte Rechnung (nur ohne PDF): PNG, JPEG oder SVG, Base64-kodiert oder als data:-URI, max. 500 KB. Steht rechts oben im Kopf. SVG nur ohne Skripte und ohne Verweise auf andere Dateien.",
"contentEncoding": "base64"
}
},
"additionalProperties": false
}