Entwickler

API-Dokumentation

Prüfen Sie XRechnung- und ZUGFeRD-Rechnungen gegen die offiziellen KoSIT-Regeln und machen Sie aus rohem XML eine lesbare Rechnung – über eine einfache JSON-API. Rechnungen werden nur im Arbeitsspeicher verarbeitet und nie gespeichert.

  • REST · JSON
  • Version v1
  • max. 15 MB
  • Bearer-API-Schlüssel (Pro & Agency)

Ü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 in v1-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-data mit der Datei im Feld file (alternativ werden die Feldnamen invoice und document akzeptiert), oder
  • die Rohdatei als Request-Body mit Content-Type: application/xml, application/pdf oder application/octet-stream.
  • Maximale Größe: 15 MB. Größere Anfragen werden mit 413 abgelehnt.

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.xml oder zugferd-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

FeldTypBeschreibung
validbooleanGesamturteil (siehe Regeln unten).
legal_ustg14_compliantbooleanNur true, wenn das Dokument gültig ist und ein Profil verwendet, das als E-Rechnung nach § 14 UStG gilt.
statusstring, optionalMaschinenlesbarer Status für Sonderfälle, z. B. INVALID_NOT_EINVOICE bei einem einfachen PDF ohne XML-Daten.
messagestring, optionalLesbare Erläuterung zu status.
detected_containerstringXML | PDF_A3 | INVALID_NOT_EINVOICE
detected_syntaxstringUN_CEFACT_CII | OASIS_UBL_2_1_INVOICE | OASIS_UBL_2_1_CREDIT_NOTE
detected_profilestringXRECHNUNG_3_0_2, XRECHNUNG_LEGACY, EN16931, EXTENDED, BASIC, PEPPOL_BIS_3_0, BASIC_WL, MINIMUM, ZUGFERD_1_0_LEGACY, UNKNOWN – siehe Profile
document_typestring380_INVOICE, 381_CREDIT_NOTE, 384_CORRECTED_INVOICE, 389_SELF_BILLED_INVOICE, 326_PARTIAL_INVOICE
pdfa_compliantbooleanErgebnis der PDF/A-3-Konformitätsprüfung (nur bei PDF_A3 aussagekräftig).
summary.errors_countintegerAnzahl der FATAL-Verstöße.
summary.warnings_countintegerAnzahl der WARNING-Hinweise.
violations[]arrayAlle Befunde; leeres Array, wenn keine vorliegen.
violations[].rule_idstringRegel-ID genau wie vom Validator gemeldet, z. B. BR-DE-15, BR-CO-15, PEPPOL-EN16931-R008.
violations[].severitystringFATAL | WARNING
violations[].bt_referencestringBetroffener Business Term bzw. betroffene Gruppe (z. B. BT-10, BG-6), sofern bekannt.
violations[].xpathstringFundstelle im XML-Dokument.
violations[].raw_messagestringOriginalmeldung des Validators.
violations[].title_de, title_enstringKurzer, verständlicher Titel auf Deutsch und Englisch.
violations[].fix_de, fix_enstringKonkreter 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_profileBedeutung§ 14 UStG konform
XRECHNUNG_3_0_2XRechnung 3.0.x (deutsche CIUS der EN 16931)Ja
XRECHNUNG_LEGACYÄltere XRechnung-Version (vor 3.0); Prüfung gegen die aktuellen RegelnAbhängig vom Prüfergebnis
EN16931ZUGFeRD 2.x / Factur-X Profil EN 16931 (Comfort)Ja
EXTENDEDZUGFeRD 2.x / Factur-X Profil EXTENDEDJa
BASICZUGFeRD 2.x / Factur-X Profil BASICJa
PEPPOL_BIS_3_0Peppol BIS Billing 3.0 (geprüft gegen die EN-16931-Kernregeln)Ja
BASIC_WLZUGFeRD / Factur-X BASIC WL – ohne RechnungspositionenNein
MINIMUMZUGFeRD / Factur-X MINIMUM – ohne RechnungspositionenNein
ZUGFERD_1_0_LEGACYZUGFeRD 1.0 – älter als EN 16931Nein
UNKNOWNSpezifikationskennung nicht erkanntNein

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

ParameterWerteBeschreibung
formatjson | html | pdfQuery-Parameter. Standard: json. HTMX-Anfragen erhalten HTML.
langde | enSprache 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

FeldBeschreibung
valid_mathtrue, wenn alle nachgerechneten Summen mit der Rechnung übereinstimmen.
syntaxErkannte Syntax (gleiche Werte wie detected_syntax).
profile_levelErkanntes Profil (gleiche Werte wie detected_profile).
source_containerXML | ZUGFERD_PDF_A3
invoiceEinheitliche 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.totalsline_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_mathvalid, br_co_10_valid, br_co_13_valid, br_co_14_valid, br_co_15_valid und – nur bei Abweichungen – discrepancies[].
html_previewEinbettungsfertiges 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": "…"
}
HTTPstatusBedeutung
400INVALID_REQUESTFehlerhafte Anfrage, z. B. Multipart ohne Dateiteil.
400EMPTY_PAYLOADDie hochgeladene Datei ist leer.
400UNSUPPORTED_FORMATWeder eine unterstützte XML-Rechnung noch ein PDF.
400UNSAFE_XML_DECLARATIONDas XML enthält <!DOCTYPE oder <!ENTITY und wurde abgelehnt (Schutz vor XXE).
401UNAUTHORIZEDFehlender oder ungültiger Authorization: Bearer-API-Schlüssel (siehe Authentifizierung).
405–Methode nicht erlaubt; der Header Allow nennt die zulässige Methode.
413PAYLOAD_TOO_LARGEDie Anfrage überschreitet 15 MB bzw. das Dekompressionslimit für eingebettete PDF-Streams.
429RATE_LIMIT_EXCEEDEDZu viele Anfragen; siehe Ratenbegrenzung.
502SIDECAR_VALIDATION_ERRORDer Prüfdienst konnte das Dokument nicht verarbeiten. Bitte später erneut versuchen.
503SIDECAR_BUSYMaximale 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.

EndpunktZweckStatus
POST /api/v1/generateEN-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-VersandAutomatische Weiterleitung geprüfter Rechnungen an den Rechnungsempfänger und Ihr DATEV-Postfach.Geplant
Validator ausprobieren