API v1 — EN 16931 komplett

Billvox E-Rechnungs-API

Erstellen, finalisieren und versenden Sie E-Rechnungen programmatisch. Alle Felder des EN 16931 Standards werden unterstuetzt.

Inhalt

Authentifizierung

Alle API-Anfragen erfordern einen API-Key. Erstellen Sie diesen in den Einstellungen unter "Abo & API" (im Pro-Plan verfuegbar, Preis auf Anfrage).

Senden Sie den Key in einem der folgenden Header:

# Option 1: Authorization Header
Authorization: Bearer bvx_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6

# Option 2: X-Api-Key Header
X-Api-Key: bvx_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Hinweis: Der API-Key wird bei der Erstellung nur einmal angezeigt. Speichern Sie ihn sicher — er kann nicht erneut abgerufen werden.

Idempotenz (Retry-Schutz)

Finalisierte Belege sind aus GoBD-Gruenden unloeschbar. Damit ein Wiederholungsversuch nach einem Timeout keine Dublette erzeugt, unterstuetzen die belegerzeugenden Endpunkte (POST /api/v1/invoices und POST /api/v1/invoices/{id}/credit-note) den optionalen Header Idempotency-Key:

POST /api/v1/invoices
Authorization: Bearer bvx_IHR_API_KEY
Idempotency-Key: bestellung-4711   # max. 200 Zeichen, eindeutig pro Vorgang

So verhaelt sich die API:

Empfehlung: Generieren Sie den Key pro fachlichem Vorgang (z.B. Bestell- oder Auftragsnummer, UUID), nicht pro Sendeversuch — und verwenden Sie bei Timeouts denselben Key fuer den Retry.

Rechnung erstellen

POST /api/v1/invoices

Erstellt und finalisiert eine E-Rechnung. Alle EN 16931 Felder (BT-1 bis BT-160) werden unterstuetzt.

Request-Body (JSON)

FeldTypBeschreibung
invoiceNumberstringRechnungsnummer (automatisch wenn leer)
invoiceDatedateRechnungsdatum ISO 8601 (Standard: heute)
dueDatedateFaelligkeitsdatum
deliveryDatedateLieferdatum
taxPointDatedateBT-7Steuerdatum (Tax Point Date)
currencystringWaehrung ISO 4217 (Standard: EUR)
taxCurrencystringBT-6USt-Waehrung wenn abweichend
exchangeRatedecimalWechselkurs bei Fremdwaehrung
notesstringNotizen / Bemerkungen
formatstringZielformat (Standard: XRechnung_UBL). Gueltig: XRechnung_UBL, XRechnung_CII, ZUGFeRD, Factur_X, Peppol_BIS, SI_UBL, RO_CIUS, PINT_ANZ, PINT_SG, PINT_JP, PINT_MY, UBL_TR, ZATCA, FatturaPA, KSeF_FA3, NAV_Online, FacturaE, myDATA — unbekannte Werte werden abgelehnt
FeldTypBeschreibung
recipientNamestringJAName des Empfaengers
recipientTradingNamestringBT-45Handelsname
recipientStreetstringStrasse
recipientPostalCodestringPLZ
recipientCitystringOrt
recipientCountrystringLaendercode (Standard: DE)
recipientVatIdstringUSt-IdNr.
recipientContactNamestringKontaktperson
recipientEmailstringE-Mail
recipientElectronicAddressstringBT-49Elektronische Adresse (Routing)
recipientElectronicAddressSchemestringBT-49-1Schema: "EM", "0204", "0088"
recipientRegistrationIdstringBT-47Handelsregisternummer
recipientRegistrationIdSchemestringBT-47-1Schema der Registernummer
recipientAdditionalLegalInfostringBT-33Zusaetzliche rechtliche Infos
FeldTypBeschreibung
senderElectronicAddressstringBT-34Elektronische Adresse des Verkaeufers
senderElectronicAddressSchemestringBT-34-1Schema: "EM", "0204"
FeldTypBeschreibung
buyerReferencestringBT-10Leitweg-ID / Buyer Reference
orderReferencestringBT-13Bestellnummer
contractReferencestringBT-12Vertragsnummer
despatchReferencestringBT-16Lieferscheinnummer
projectReferencestringBT-11Projektreferenz
salesOrderReferencestringBT-14Auftragsbestaetigungsnummer
tenderReferencestringBT-17Ausschreibungsreferenz
objectIdentifierstringBT-18Objekt-Kennung (Abo-ID etc.)
objectIdentifierSchemestringBT-18-1Schema der Objektkennung
accountingReferencestringBT-19Kostenstelle des Kaeufers
precedingInvoiceNumberstringBT-25Vorangeg. Rechnungsnummer
precedingInvoiceDatedateBT-26Datum der vorangeg. Rechnung
FeldTypBeschreibung
paymentMethodCodestringBT-81Zahlungsart-Code (UNTDID 4461)
paymentTermsTextstringBT-20Zahlungsbedingungstext
skontoProzentdecimalSkonto-Prozentsatz
skontoTageintegerSkonto-Frist in Tagen
paymentReferencestringBT-83Verwendungszweck
mandateReferencestringBT-89SEPA-Mandatsreferenz
creditorIdstringBT-90Glaeubiger-ID
debitAccountIdstringBT-91IBAN des belasteten Kontos
FeldTypBeschreibung
deliveryPartyNamestringBT-70Name des Lieferempfaengers
deliveryLocationIdstringBT-69Lieferort-Kennung
deliveryLocationIdSchemestringBT-69-1Schema der Lieferort-Kennung
deliveryStreetstringBT-75Lieferadresse Strasse
deliveryPostalCodestringBT-78Lieferadresse PLZ
deliveryCitystringBT-77Lieferadresse Ort
deliveryCountrystringBT-80Lieferadresse Laendercode
invoicePeriodStartdateBT-73Leistungszeitraum Beginn
invoicePeriodEnddateBT-74Leistungszeitraum Ende
FeldTypBeschreibung
taxRepresentative.namestringBT-62Name des Steuervertreters
taxRepresentative.vatIdstringBT-63USt-IdNr. des Steuervertreters
taxRepresentative.streetstringBT-64Strasse
taxRepresentative.postalCodestringBT-67PLZ
taxRepresentative.citystringBT-66Ort
taxRepresentative.countrystringBT-69Laendercode
FeldTypBeschreibung
allowancesCharges[].isChargebooleantrue=Zuschlag, false=Rabatt
allowancesCharges[].amountintegerBetrag in Cent
allowancesCharges[].percentdecimalProzentsatz
allowancesCharges[].baseAmountintegerBasisbetrag in Cent
allowancesCharges[].reasonstringGrund
allowancesCharges[].reasonCodestringUNTDID 5189/7161 Code
allowancesCharges[].taxCategorystringSteuerkategorie
allowancesCharges[].taxRatedecimalSteuersatz

Position-Objekt

FeldTypBeschreibung
descriptionstringJAPositionsbeschreibung
quantitydecimalJAMenge
unitCodestringEinheit (C62=Stueck, HUR=Stunde, DAY=Tag, MON=Monat)
unitPriceintegerJANettoeinzelpreis in Cent
grossUnitPriceintegerBT-148Bruttoeinzelpreis in Cent (vor Rabatt)
taxRatedecimalJAMwSt-Satz in % (z.B. 19)
taxCategorystringSteuerkategorie (S, Z, E, AE, K, G, O)
articleNumberstringBT-155Artikelnummer des Verkaeufers
buyerArticleNumberstringBT-156Artikelnummer des Kaeufers
eanstringBT-157EAN / GTIN
itemStandardIdSchemestringBT-157-1Schema: "0160"=GTIN
baseQuantitydecimalBT-149Basismenge (z.B. 100 = "pro 100")
baseQuantityUnitstringBT-150Einheit der Basismenge
orderLineReferencestringBT-132Bestellpositionsnummer
positionAccountingReferencestringBT-133Kostenstelle der Position
objectIdentifierstringBT-128Objekt-Kennung der Position
objectIdentifierSchemestringBT-128-1Schema der Objektkennung
originCountrystringBT-159Ursprungsland (ISO 3166-1)
discountAmountintegerBT-136Rabattbetrag in Cent
discountPercentdecimalBT-138Rabatt in Prozent
surchargeAmountintegerBT-141Zuschlag in Cent
attributesobjectBT-160Artikelattribute {"name":"wert"}
classificationsobjectBT-158Klassifizierungen {"CPV":"45000000"}
periodStartdateBT-134Positionszeitraum Beginn
periodEnddateBT-135Positionszeitraum Ende
allowancesChargesarrayBG-27/28Zu-/Abschlaege auf Positionsebene

Beispiel

curl -X POST https://app.billvox.de/api/v1/invoices \
  -H "Authorization: Bearer bvx_IHR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientName": "Musterfirma GmbH",
    "recipientStreet": "Musterstrasse 1",
    "recipientPostalCode": "10115",
    "recipientCity": "Berlin",
    "buyerReference": "991-01234-56",
    "projectReference": "PRJ-2026-042",
    "paymentReference": "RE-2026-0042",
    "positions": [
      {
        "description": "Beratungsleistung",
        "quantity": 10,
        "unitCode": "HUR",
        "unitPrice": 12000,
        "taxRate": 19,
        "taxCategory": "S",
        "orderLineReference": "1"
      }
    ]
  }'

Erfolgs-Antwort (201)

Datumsangaben (z. B. invoiceDate) kommen als Kalenderdatum ohne Zeitzone, Zeitpunkte (z. B. createdAt) als UTC im Format ISO 8601 mit Z.

{
  "invoiceId": "inv_abc123",
  "invoiceNumber": "2026-0001",
  "status": "Finalisiert",
  "format": "XRechnung",
  "sha256Hash": "a1b2c3d4...",
  "netAmountCents": 120000,
  "taxAmountCents": 22800,
  "grossAmountCents": 142800,
  "currency": "EUR",
  "downloadUrl": "https://app.billvox.de/api/v1/invoices/inv_abc123/xml",
  "validationWarnings": [],
  "createdAt": "2026-03-03T10:00:00Z",
  "finalizedAt": "2026-03-03T10:00:01Z"
}
Validierung: Vor der Erstellung werden alle Pflichtfelder und Wertebereiche geprueft (400 VALIDATION_ERROR mit Feldbezug in details). Nach der Generierung wird die Rechnung gegen die Geschaeftsregeln des Zielformats (EN 16931 / XRechnung-Schematron) validiert. Bei Verstoessen kommt 422 INVOICE_NOT_COMPLIANT mit den Einzelbefunden — es wird keine Rechnung angelegt und das Kontingent nicht belastet.

Gutschrift / Storno erstellen

POST /api/v1/invoices/{id}/credit-note

Erstellt und finalisiert eine Gutschrift (Voll-Stornierung) zu einer finalisierten oder versendeten Rechnung. Alle Positionen werden automatisch negiert, die Gutschrift referenziert die Originalrechnung (BT-25) und die Originalrechnung wird als storniert markiert.

Request-Body (JSON)

FeldTypPflichtBeschreibung
reasonstringJAStornogrund (erscheint in den Bemerkungen der Gutschrift)

Beispiel

curl -X POST https://app.billvox.de/api/v1/invoices/inv_abc123/credit-note \
  -H "Authorization: Bearer bvx_IHR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Falsche Leistungsabrechnung"
  }'

Erfolgs-Antwort (201)

Gleiches Format wie beim Erstellen einer Rechnung. Die Gutschrift erhaelt eine eigene Nummer aus Ihrem Nummernkreis; Betraege sind negativ.

Hinweis: Entwuerfe koennen nicht storniert werden, und fuer eine Gutschrift kann keine weitere Gutschrift erstellt werden (400 INVALID_STATE). Teil-Gutschriften sind derzeit nur ueber das Dashboard moeglich.

Rechnung versenden

POST /api/v1/invoices/{id}/send

Versendet eine finalisierte E-Rechnung per E-Mail. Die XML-Datei wird automatisch als Anhang mitgesendet.

Request-Body (JSON)

FeldTypPflichtBeschreibung
recipientEmailstringJAE-Mail-Adresse des Empfaengers
subjectstringBetreff (Standard: aus Vorlage)
messagestringNachrichtentext (Standard: aus Vorlage)

Beispiel

curl -X POST https://app.billvox.de/api/v1/invoices/inv_abc123/send \
  -H "Authorization: Bearer bvx_IHR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientEmail": "rechnung@musterfirma.de"
  }'

Erfolgs-Antwort (200)

{
  "message": "Rechnung erfolgreich versendet.",
  "invoiceId": "inv_abc123",
  "sentTo": "rechnung@musterfirma.de"
}

XML / PDF herunterladen

GET /api/v1/invoices/{id}/xml

Laed die generierte XML-Datei einer finalisierten E-Rechnung herunter.

Beispiel

curl -O -J https://app.billvox.de/api/v1/invoices/inv_abc123/xml \
  -H "Authorization: Bearer bvx_IHR_API_KEY"

Antwort

Die XML-Datei wird direkt als Download geliefert (Content-Type: application/xml).

GET /api/v1/invoices/{id}/pdf

Laed das PDF einer finalisierten E-Rechnung herunter. Bei Hybridformaten (ZUGFeRD / Factur-X) ist das PDF mit eingebettetem XML die eigentliche Rechnung.

Beispiel

curl -O -J https://app.billvox.de/api/v1/invoices/inv_abc123/pdf \
  -H "Authorization: Bearer bvx_IHR_API_KEY"
Hinweis: Das PDF wird nach der Finalisierung im Hintergrund erstellt. Direkt nach dem Erstellen kann der Endpunkt kurzzeitig 404 PDF_NOT_AVAILABLE liefern — in diesem Fall nach einigen Sekunden erneut versuchen.

E-Rechnung pruefen / umwandeln

POST /api/v1/validate

Prueft eine E-Rechnung (XML, ZUGFeRD-/Factur-X-PDF oder signierte .p7m-Datei) gegen XML-Schema, EN 16931, § 14 UStG und das Rechenwerk. Anfrage als multipart/form-data mit dem Feld file (max. 10 MB). Mit ?preview=true enthaelt die Antwort zusaetzlich eine HTML-Ansicht der Rechnung. Die Datei wird nicht gespeichert.

Beispiel

curl https://app.billvox.de/api/v1/validate \
  -H "Authorization: Bearer bvx_IHR_API_KEY" \
  -F "file=@rechnung.xml"

Antwort (200)

Gesamtstatus (gueltig, warnung, fehler oder unlesbar), erkanntes Format, die Einzelbefunde mit Regel-ID und die ausgelesenen Eckdaten der Rechnung.

POST /api/v1/convert?target=zugferd-pdf

Wandelt eine E-Rechnung in ein anderes Format um. target ist zugferd-pdf, xrechnung-ubl oder xrechnung-cii; die Antwort ist die erzeugte Datei.

Beispiel

curl -O -J "https://app.billvox.de/api/v1/convert?target=xrechnung-ubl" \
  -H "Authorization: Bearer bvx_IHR_API_KEY" \
  -F "file=@rechnung.pdf"

Webhooks

Webhooks melden Ereignisse per POST an eine eigene https-Adresse. Angelegt werden sie in den Einstellungen unter "Abo & API" (Pro-Plan).

EreignisWann
invoice.receivedEine Eingangsrechnung ist eingegangen und geprueft.
invoice.finalizedEine Ausgangsrechnung wurde finalisiert.
invoice.sentEine Ausgangsrechnung wurde per E-Mail versendet.
Signatur pruefen: Jede Zustellung traegt X-Billvox-Timestamp (Unix-Sekunden) und X-Billvox-Signature-V2: sha256=<hex> – ein HMAC-SHA256 ueber <Timestamp>.<Inhalt> mit dem Secret, das bei der Anlage einmalig angezeigt wird. Lehnen Sie Zustellungen ab, deren Zeitstempel aelter als 5 Minuten ist. Fehlgeschlagene Zustellungen werden bis zu dreimal wiederholt und nach einem Neustart nachgeliefert.

Fehlercodes

Alle Fehler werden als JSON mit folgendem Format zurueckgegeben:

{
  "status": 400,
  "code": "VALIDATION_ERROR",
  "message": "Validierungsfehler: Ein oder mehrere Felder sind ungueltig.",
  "details": [
    "Positions[0].Description: Description (Artikelbezeichnung) ist erforderlich.",
    "RecipientCountry: RecipientCountry muss ein 2-stelliger ISO-3166-Laendercode sein (z.B. DE)."
  ]
}
HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORFehlende oder ungueltige Felder im Request — details enthaelt je Eintrag das betroffene Feld und den Grund
400CREATE_ERRORRechnung konnte nicht erstellt werden
400FINALIZE_ERRORRechnung konnte nicht finalisiert werden (z.B. Generierungsfehler)
400INVALID_STATEAktion im aktuellen Belegstatus nicht moeglich (z.B. Gutschrift fuer Entwurf oder Gutschrift)
400SEND_ERRORE-Mail konnte nicht versendet werden
401UNAUTHORIZEDFehlender oder ungueltiger API-Key
403QUOTA_EXCEEDEDMonatliches Belegkontingent des Plans erschoepft
404NOT_FOUNDRechnung nicht gefunden
404PDF_NOT_AVAILABLEPDF wird noch im Hintergrund erstellt — spaeter erneut versuchen
409IDEMPOTENCY_KEY_REUSEDIdempotency-Key wurde mit anderem Request-Inhalt wiederverwendet
409REQUEST_IN_PROGRESSEin Request mit diesem Idempotency-Key wird gerade verarbeitet
422INVOICE_NOT_COMPLIANTDie generierte Rechnung verletzt Geschaeftsregeln des Zielformats (EN 16931 / XRechnung) — Einzelbefunde in details; es wurde keine Rechnung angelegt
429-Rate-Limit ueberschritten

Rate Limits

Die API ist auf 60 Requests pro Minute begrenzt. Bei Ueberschreitung erhalten Sie einen HTTP 429 Status.

Die erstellten Rechnungen zaehlen zum monatlichen Kontingent Ihres Plans.

Swagger UI: Eine interaktive API-Dokumentation finden Sie unter /api-docs.

© Billvox — Zurueck zur App