Überblick
Alle kostenpflichtigen REST-API-Endpunkte liegen unter dem versionierten Pfad /api/v1. Für manuelle Einzelprüfungen ohne API-Schlüssel steht unser kostenloser Browser-Validator bereit (bis zu 5 Prüfungen pro UTC-Tag). Die Beispiele verwenden die Shell-Variablen $BELEGBRIDGE_URL und $BELEGBRIDGE_API_KEY.
- Verarbeitung nur im Arbeitsspeicher: Hochgeladene Rechnungen werden ausschließlich im Arbeitsspeicher verarbeitet und verworfen, sobald die Antwort gesendet wurde. Nichts wird auf Festplatte, in einer Datenbank oder in Logs gespeichert.
- Inhaltstypen: Antworten sind
application/json; charset=utf-8, sofern nicht anders angegeben. Der Visualizer kann zusätzlich HTML oder PDF liefern (siehe Visualisieren). - Versionierung: Inkompatible Änderungen erscheinen nur unter einem neuen Pfad (z. B.
/api/v2). Neue optionale Felder können jederzeit inv1-Antworten ergänzt werden – bitte ignorieren Sie unbekannte Felder.
export BELEGBRIDGE_URL="<adresse-dieser-website>"
export BELEGBRIDGE_API_KEY="bb_live_..."
Authentifizierung
Alle REST-API-Endpunkte unter /api/v1/* erfordern einen API-Schlüssel im Header Authorization: Bearer bb_live_... und setzen keine Cookies. Der API-Zugang ist in den Tarifen Pro und Agency enthalten. Alle Details finden Sie unter Preise.
Authorization: Bearer bb_live_...
Anfragen ohne gültigen API-Schlüssel erhalten 401 Unauthorized mit dem Header WWW-Authenticate: Bearer realm="BelegBridge API":
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="BelegBridge API"
Content-Type: application/json; charset=utf-8
{
"valid": false,
"legal_ustg14_compliant": false,
"status": "UNAUTHORIZED",
"message": "Missing or invalid API key. Pass 'Authorization: Bearer bb_live_...' — REST API access is included in the Pro and Agency plans (see /#pricing).",
"pricing_url": "/#pricing"
}
Early Access REST-API-Schlüssel für die Tarife Pro und Agency werden aktuell an Early-Access-Mitglieder vergeben. Sichern Sie sich Ihren Zugang unten über die Warteliste.
Ratenbegrenzung
Öffentliche Endpunkte sind durch einen Token-Bucket pro Client geschützt. Der Client wird über einen gesalzenen Hash seiner IP-Adresse erkannt; das Salz wechselt täglich, sodass IP-Adressen nie im Klartext gespeichert werden – weder im Arbeitsspeicher noch in Logs.
Wird das Limit überschritten, antwortet die API mit 429 Too Many Requests und dem Header Retry-After: 60. Warten Sie mindestens die angegebene Anzahl Sekunden, bevor Sie es erneut versuchen.
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json; charset=utf-8
{
"valid": false,
"legal_ustg14_compliant": false,
"status": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded for public validation endpoint. Please try again shortly."
}
Rechnung prüfen
POST /api/v1/validate
Erkennt das Format, prüft das XML mit dem offiziellen KoSIT-Validator (EN-16931- und XRechnung-Geschäftsregeln) und prüft bei PDFs zusätzlich die PDF/A-3-Konformität. Jeder Befund wird auf Deutsch und Englisch mit einem konkreten Lösungsvorschlag übersetzt.
Anfrage
multipart/form-datamit der Datei im Feldfile(alternativ werden die Feldnameninvoiceunddocumentakzeptiert), oder- die Rohdatei als Request-Body mit
Content-Type: application/xml,application/pdfoderapplication/octet-stream. - Maximale Größe: 15 MB. Größere Anfragen werden mit
413abgelehnt.
Unterstützte Eingaben:
- UN/CEFACT Cross Industry Invoice (CII) – XRechnung CII, ZUGFeRD-2.x- / Factur-X-XML
- OASIS UBL 2.1 Invoice und CreditNote – XRechnung UBL, Peppol BIS Billing 3.0
- Hybride PDF/A-3-Dateien mit eingebettetem Anhang
factur-x.xml,xrechnung.xmloderzugferd-invoice.xml(ZUGFeRD 2.x / Factur-X)
# multipart upload
curl -sS -X POST "$BELEGBRIDGE_URL/api/v1/validate" \
-H "Authorization: Bearer $BELEGBRIDGE_API_KEY" \
-F "file=@rechnung.xml"
# raw body (PDF)
curl -sS -X POST "$BELEGBRIDGE_URL/api/v1/validate" \
-H "Authorization: Bearer $BELEGBRIDGE_API_KEY" \
-H "Content-Type: application/pdf" \
--data-binary "@rechnung.pdf"
Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
valid | boolean | Gesamturteil (siehe Regeln unten). |
legal_ustg14_compliant | boolean | Nur true, wenn das Dokument gültig ist und ein Profil verwendet, das als E-Rechnung nach § 14 UStG gilt. |
status | string, optional | Maschinenlesbarer Status für Sonderfälle, z. B. INVALID_NOT_EINVOICE bei einem einfachen PDF ohne XML-Daten. |
message | string, optional | Lesbare Erläuterung zu status. |
detected_container | string | XML | PDF_A3 | INVALID_NOT_EINVOICE |
detected_syntax | string | UN_CEFACT_CII | OASIS_UBL_2_1_INVOICE | OASIS_UBL_2_1_CREDIT_NOTE |
detected_profile | string | XRECHNUNG_3_0_2, XRECHNUNG_LEGACY, EN16931, EXTENDED, BASIC, PEPPOL_BIS_3_0, BASIC_WL, MINIMUM, ZUGFERD_1_0_LEGACY, UNKNOWN – siehe Profile |
document_type | string | 380_INVOICE, 381_CREDIT_NOTE, 384_CORRECTED_INVOICE, 389_SELF_BILLED_INVOICE, 326_PARTIAL_INVOICE |
pdfa_compliant | boolean | Ergebnis der PDF/A-3-Konformitätsprüfung (nur bei PDF_A3 aussagekräftig). |
summary.errors_count | integer | Anzahl der FATAL-Verstöße. |
summary.warnings_count | integer | Anzahl der WARNING-Hinweise. |
violations[] | array | Alle Befunde; leeres Array, wenn keine vorliegen. |
violations[].rule_id | string | Regel-ID genau wie vom Validator gemeldet, z. B. BR-DE-15, BR-CO-15, PEPPOL-EN16931-R008. |
violations[].severity | string | FATAL | WARNING |
violations[].bt_reference | string | Betroffener Business Term bzw. betroffene Gruppe (z. B. BT-10, BG-6), sofern bekannt. |
violations[].xpath | string | Fundstelle im XML-Dokument. |
violations[].raw_message | string | Originalmeldung des Validators. |
violations[].title_de, title_en | string | Kurzer, verständlicher Titel auf Deutsch und Englisch. |
violations[].fix_de, fix_en | string | Konkreter Lösungsvorschlag auf Deutsch und Englisch. |
Wann ist eine Rechnung valid?
valid ist nur dann true, wenn alle folgenden Bedingungen erfüllt sind:
- es gibt keinen einzigen
FATAL-Verstoß, - der KoSIT-Prüfbericht empfiehlt die Annahme,
- das erkannte Profil ist nach § 14 UStG zulässig (siehe Profile) und
- bei PDFs: die Datei ist PDF/A-3-konform.
Warnungen dienen der Information und der Verbesserung der Datenqualität – sie machen eine Rechnung nie ungültig.
Beispiel: Rechnung ohne Käuferreferenz (BT-10) und Verkäuferkontakt (BG-6)
{
"valid": false,
"legal_ustg14_compliant": false,
"detected_container": "XML",
"detected_syntax": "UN_CEFACT_CII",
"detected_profile": "XRECHNUNG_3_0_2",
"document_type": "380_INVOICE",
"pdfa_compliant": false,
"summary": {
"errors_count": 2,
"warnings_count": 0
},
"violations": [
{
"rule_id": "BR-DE-2",
"severity": "FATAL",
"bt_reference": "BG-6",
"xpath": "/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty",
"raw_message": "[BR-DE-2] Die Gruppe \"SELLER CONTACT\" (BG-6) muss übermittelt werden.",
"title_de": "Kontaktdaten des Verkäufers (BG-6) fehlen",
"title_en": "Seller contact details (BG-6) are missing",
"fix_de": "Ergänzen Sie Ansprechpartner (BT-41), Telefonnummer (BT-42) und E-Mail-Adresse (BT-43) des Verkäufers.",
"fix_en": "Add the seller's contact person (BT-41), phone number (BT-42) and email address (BT-43)."
},
{
"rule_id": "BR-DE-15",
"severity": "FATAL",
"bt_reference": "BT-10",
"xpath": "/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement",
"raw_message": "[BR-DE-15] Das Element \"Buyer reference\" (BT-10) muss übermittelt werden.",
"title_de": "Käuferreferenz bzw. Leitweg-ID (BT-10) fehlt",
"title_en": "Buyer reference / Leitweg-ID (BT-10) is missing",
"fix_de": "Tragen Sie die Leitweg-ID des öffentlichen Auftraggebers oder eine andere Käuferreferenz in BT-10 ein.",
"fix_en": "Enter the public-sector routing ID (Leitweg-ID) or another buyer reference in BT-10."
}
]
}
Titel und Lösungsvorschläge werden redaktionell gepflegt und können sich verbessern; für die automatisierte Verarbeitung verwenden Sie bitte rule_id und severity.
Profile & § 14 UStG
Das Feld detected_profile gibt an, welcher Spezifikation die Rechnung folgt. Nur Profile mit dem vollständigen EN-16931-Datensatz (einschließlich Rechnungspositionen) gelten als E-Rechnung nach § 14 UStG.
detected_profile | Bedeutung | § 14 UStG konform |
|---|---|---|
XRECHNUNG_3_0_2 | XRechnung 3.0.x (deutsche CIUS der EN 16931) | Ja |
XRECHNUNG_LEGACY | Ältere XRechnung-Version (vor 3.0); Prüfung gegen die aktuellen Regeln | Abhängig vom Prüfergebnis |
EN16931 | ZUGFeRD 2.x / Factur-X Profil EN 16931 (Comfort) | Ja |
EXTENDED | ZUGFeRD 2.x / Factur-X Profil EXTENDED | Ja |
BASIC | ZUGFeRD 2.x / Factur-X Profil BASIC | Ja |
PEPPOL_BIS_3_0 | Peppol BIS Billing 3.0 (geprüft gegen die EN-16931-Kernregeln) | Ja |
BASIC_WL | ZUGFeRD / Factur-X BASIC WL – ohne Rechnungspositionen | Nein |
MINIMUM | ZUGFeRD / Factur-X MINIMUM – ohne Rechnungspositionen | Nein |
ZUGFERD_1_0_LEGACY | ZUGFeRD 1.0 – älter als EN 16931 | Nein |
UNKNOWN | Spezifikationskennung nicht erkannt | Nein |
Rechnung visualisieren
POST /api/v1/visualize
Wandelt eine XRechnung- oder ZUGFeRD-Rechnung in eine einheitliche, lesbare Darstellung um und rechnet die Summen nach. Akzeptiert dieselben Anfrageformate und dieselbe Größenbegrenzung wie /api/v1/validate.
Parameter
| Parameter | Werte | Beschreibung |
|---|---|---|
format | json | html | pdf | Query-Parameter. Standard: json. HTMX-Anfragen erhalten HTML. |
lang | de | en | Sprache der Beschriftungen in der HTML-/PDF-Ansicht. Query-Parameter oder Multipart-Feld. |
# JSON
curl -sS -X POST "$BELEGBRIDGE_URL/api/v1/visualize?format=json&lang=de" \
-H "Authorization: Bearer $BELEGBRIDGE_API_KEY" \
-F "file=@rechnung.xml"
# PDF herunterladen
curl -sS -X POST "$BELEGBRIDGE_URL/api/v1/visualize?format=pdf&lang=de" \
-H "Authorization: Bearer $BELEGBRIDGE_API_KEY" \
-F "file=@rechnung.xml" \
-o invoice-preview.pdf
JSON-Antwort
| Feld | Beschreibung |
|---|---|
valid_math | true, wenn alle nachgerechneten Summen mit der Rechnung übereinstimmen. |
syntax | Erkannte Syntax (gleiche Werte wie detected_syntax). |
profile_level | Erkanntes Profil (gleiche Werte wie detected_profile). |
source_container | XML | ZUGFERD_PDF_A3 |
invoice | Einheitliche Rechnungsansicht: invoice_number, issue_date, type_code, currency, buyer_reference, seller{…}, buyer{…}, payment{means_code, iban, bic, payment_terms}, lines[], taxes[], totals{…}, penny_math{…}. |
invoice.totals | line_total, tax_basis_total, tax_total, grand_total, due_payable als Dezimal-Strings, jeweils mit einem ganzzahligen Gegenstück in Cent (line_total_cents, …). |
invoice.penny_math | valid, br_co_10_valid, br_co_13_valid, br_co_14_valid, br_co_15_valid und – nur bei Abweichungen – discrepancies[]. |
html_preview | Einbettungsfertiges HTML-Fragment der Rechnung. |
Beispiel (gekürzt):
{
"valid_math": true,
"syntax": "UN_CEFACT_CII",
"profile_level": "XRECHNUNG_3_0_2",
"source_container": "XML",
"invoice": {
"invoice_number": "RE-2026-0042",
"issue_date": "2026-11-02",
"type_code": "380",
"currency": "EUR",
"buyer_reference": "04011000-12345-67",
"seller": { "name": "Muster Webagentur", "city": "Berlin", "country_code": "DE" },
"buyer": { "name": "Beispielkunde AG", "city": "Hamburg", "country_code": "DE" },
"payment": { "means_code": "58", "iban": "DE02120300000000202051", "payment_terms": "14 Tage netto" },
"lines": [
{ "id": "1", "name": "Webentwicklung", "quantity": "10", "unit_code": "HUR", "net_price": "95.00", "line_net_amount": "950.00", "line_net_cents": 95000, "vat_category": "S", "vat_rate": "19" }
],
"taxes": [
{ "category_code": "S", "rate": "19", "taxable_amount": "950.00", "taxable_cents": 95000, "tax_amount": "180.50", "tax_cents": 18050 }
],
"totals": {
"line_total": "950.00", "line_total_cents": 95000,
"tax_basis_total": "950.00", "tax_basis_total_cents": 95000,
"tax_total": "180.50", "tax_total_cents": 18050,
"grand_total": "1130.50", "grand_total_cents": 113050,
"due_payable": "1130.50", "due_payable_cents": 113050
},
"penny_math": {
"valid": true,
"br_co_10_valid": true,
"br_co_13_valid": true,
"br_co_14_valid": true,
"br_co_15_valid": true
}
},
"html_preview": "<div class=\"bb-invoice\">…</div>"
}
Alle Summen werden mit ganzzahligen Cent-Beträgen nachgerechnet – nie mit Gleitkommazahlen – gemäß den EN-16931-Regeln BR-CO-10 (Summe der Positionsnettobeträge), BR-CO-13 (Steuerbemessungsgrundlage), BR-CO-14 (Umsatzsteuergesamtbetrag), BR-CO-15 (Bruttobetrag), BR-CO-16 (Zahlbetrag inkl. Rundung) und BR-CO-17 (Umsatzsteuer je Kategorie). Schon eine Abweichung von einem Cent wird gemeldet.
Fehler & Statuscodes
Hinweis: Eine Rechnung mit Prüffehlern ist kein HTTP-Fehler – sie wird mit 200 OK und "valid": false beantwortet. HTTP-Fehler bedeuten, dass die Anfrage selbst nicht verarbeitet werden konnte. Sie haben diesen Aufbau:
{
"valid": false,
"legal_ustg14_compliant": false,
"status": "UNSUPPORTED_FORMAT",
"message": "…"
}
| HTTP | status | Bedeutung |
|---|---|---|
| 400 | INVALID_REQUEST | Fehlerhafte Anfrage, z. B. Multipart ohne Dateiteil. |
| 400 | EMPTY_PAYLOAD | Die hochgeladene Datei ist leer. |
| 400 | UNSUPPORTED_FORMAT | Weder eine unterstützte XML-Rechnung noch ein PDF. |
| 400 | UNSAFE_XML_DECLARATION | Das XML enthält <!DOCTYPE oder <!ENTITY und wurde abgelehnt (Schutz vor XXE). |
| 401 | UNAUTHORIZED | Fehlender oder ungültiger Authorization: Bearer-API-Schlüssel (siehe Authentifizierung). |
| 405 | – | Methode nicht erlaubt; der Header Allow nennt die zulässige Methode. |
| 413 | PAYLOAD_TOO_LARGE | Die Anfrage überschreitet 15 MB bzw. das Dekompressionslimit für eingebettete PDF-Streams. |
| 429 | RATE_LIMIT_EXCEEDED | Zu viele Anfragen; siehe Ratenbegrenzung. |
| 502 | SIDECAR_VALIDATION_ERROR | Der Prüfdienst konnte das Dokument nicht verarbeiten. Bitte später erneut versuchen. |
| 503 | SIDECAR_BUSY | Maximale gleichzeitige Prüfungen erreicht; erneut versuchen nach Retry-After: 5 Sekunden. |
Sicherheit & Datenschutz
- Schutz vor XXE: XML-Dokumente mit
<!DOCTYPE- oder<!ENTITY-Deklarationen werden vor dem Parsen abgelehnt. - Größenbegrenzung: Anfragen sind auf 15 MB begrenzt.
- Nur Arbeitsspeicher: Rechnungsinhalte werden nie auf Festplatte, in eine Datenbank oder in Logs geschrieben.
- Keine Cookies, kein Tracking: Weder Website noch API setzen Cookies.
- Strikte Content Security Policy: Alle Skripte, Stylesheets und Schriften werden von unserer eigenen Domain ausgeliefert – keine externen CDNs.
Weitere Details: Datenschutzerklärung und Auftragsverarbeitungsvertrag (AVV).
Geplante Endpunkte
Die folgenden Endpunkte gehören zur kostenpflichtigen Bridge und sind noch nicht verfügbar. Pfade und Schemata können sich noch ändern.
| Endpunkt | Zweck | Status |
|---|---|---|
POST /api/v1/generate | EN-16931-XML und ZUGFeRD-2.3-PDF/A-3 aus JSON erzeugen (API-Schlüssel erforderlich). | Geplant |
POST /api/v1/webhooks/stripe/{seller_profile_id} | Stripe-Webhook-Endpunkt pro Verkäuferprofil: macht aus bezahlten Stripe-Rechnungen konforme ZUGFeRD-Rechnungen. | Geplant |
| DATEV-Versand | Automatische Weiterleitung geprüfter Rechnungen an den Rechnungsempfänger und Ihr DATEV-Postfach. | Geplant |