Erstellen, finalisieren und versenden Sie E-Rechnungen programmatisch. Alle Felder des EN 16931 Standards werden unterstuetzt.
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
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:
Idempotency-Replayed: true) — es entsteht kein zweiter Beleg.IDEMPOTENCY_KEY_REUSED — pro Vorgang einen eindeutigen Key vergeben.REQUEST_IN_PROGRESS.Erstellt und finalisiert eine E-Rechnung. Alle EN 16931 Felder (BT-1 bis BT-160) werden unterstuetzt.
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| invoiceNumber | string | Rechnungsnummer (automatisch wenn leer) | |
| invoiceDate | date | Rechnungsdatum ISO 8601 (Standard: heute) | |
| dueDate | date | Faelligkeitsdatum | |
| deliveryDate | date | Lieferdatum | |
| taxPointDate | date | BT-7 | Steuerdatum (Tax Point Date) |
| currency | string | Waehrung ISO 4217 (Standard: EUR) | |
| taxCurrency | string | BT-6 | USt-Waehrung wenn abweichend |
| exchangeRate | decimal | Wechselkurs bei Fremdwaehrung | |
| notes | string | Notizen / Bemerkungen | |
| format | string | Zielformat (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 |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| recipientName | string | JA | Name des Empfaengers |
| recipientTradingName | string | BT-45 | Handelsname |
| recipientStreet | string | Strasse | |
| recipientPostalCode | string | PLZ | |
| recipientCity | string | Ort | |
| recipientCountry | string | Laendercode (Standard: DE) | |
| recipientVatId | string | USt-IdNr. | |
| recipientContactName | string | Kontaktperson | |
| recipientEmail | string | ||
| recipientElectronicAddress | string | BT-49 | Elektronische Adresse (Routing) |
| recipientElectronicAddressScheme | string | BT-49-1 | Schema: "EM", "0204", "0088" |
| recipientRegistrationId | string | BT-47 | Handelsregisternummer |
| recipientRegistrationIdScheme | string | BT-47-1 | Schema der Registernummer |
| recipientAdditionalLegalInfo | string | BT-33 | Zusaetzliche rechtliche Infos |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| senderElectronicAddress | string | BT-34 | Elektronische Adresse des Verkaeufers |
| senderElectronicAddressScheme | string | BT-34-1 | Schema: "EM", "0204" |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| buyerReference | string | BT-10 | Leitweg-ID / Buyer Reference |
| orderReference | string | BT-13 | Bestellnummer |
| contractReference | string | BT-12 | Vertragsnummer |
| despatchReference | string | BT-16 | Lieferscheinnummer |
| projectReference | string | BT-11 | Projektreferenz |
| salesOrderReference | string | BT-14 | Auftragsbestaetigungsnummer |
| tenderReference | string | BT-17 | Ausschreibungsreferenz |
| objectIdentifier | string | BT-18 | Objekt-Kennung (Abo-ID etc.) |
| objectIdentifierScheme | string | BT-18-1 | Schema der Objektkennung |
| accountingReference | string | BT-19 | Kostenstelle des Kaeufers |
| precedingInvoiceNumber | string | BT-25 | Vorangeg. Rechnungsnummer |
| precedingInvoiceDate | date | BT-26 | Datum der vorangeg. Rechnung |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| paymentMethodCode | string | BT-81 | Zahlungsart-Code (UNTDID 4461) |
| paymentTermsText | string | BT-20 | Zahlungsbedingungstext |
| skontoProzent | decimal | Skonto-Prozentsatz | |
| skontoTage | integer | Skonto-Frist in Tagen | |
| paymentReference | string | BT-83 | Verwendungszweck |
| mandateReference | string | BT-89 | SEPA-Mandatsreferenz |
| creditorId | string | BT-90 | Glaeubiger-ID |
| debitAccountId | string | BT-91 | IBAN des belasteten Kontos |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| deliveryPartyName | string | BT-70 | Name des Lieferempfaengers |
| deliveryLocationId | string | BT-69 | Lieferort-Kennung |
| deliveryLocationIdScheme | string | BT-69-1 | Schema der Lieferort-Kennung |
| deliveryStreet | string | BT-75 | Lieferadresse Strasse |
| deliveryPostalCode | string | BT-78 | Lieferadresse PLZ |
| deliveryCity | string | BT-77 | Lieferadresse Ort |
| deliveryCountry | string | BT-80 | Lieferadresse Laendercode |
| invoicePeriodStart | date | BT-73 | Leistungszeitraum Beginn |
| invoicePeriodEnd | date | BT-74 | Leistungszeitraum Ende |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| taxRepresentative.name | string | BT-62 | Name des Steuervertreters |
| taxRepresentative.vatId | string | BT-63 | USt-IdNr. des Steuervertreters |
| taxRepresentative.street | string | BT-64 | Strasse |
| taxRepresentative.postalCode | string | BT-67 | PLZ |
| taxRepresentative.city | string | BT-66 | Ort |
| taxRepresentative.country | string | BT-69 | Laendercode |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| allowancesCharges[].isCharge | boolean | true=Zuschlag, false=Rabatt | |
| allowancesCharges[].amount | integer | Betrag in Cent | |
| allowancesCharges[].percent | decimal | Prozentsatz | |
| allowancesCharges[].baseAmount | integer | Basisbetrag in Cent | |
| allowancesCharges[].reason | string | Grund | |
| allowancesCharges[].reasonCode | string | UNTDID 5189/7161 Code | |
| allowancesCharges[].taxCategory | string | Steuerkategorie | |
| allowancesCharges[].taxRate | decimal | Steuersatz |
| Feld | Typ | Beschreibung | |
|---|---|---|---|
| description | string | JA | Positionsbeschreibung |
| quantity | decimal | JA | Menge |
| unitCode | string | Einheit (C62=Stueck, HUR=Stunde, DAY=Tag, MON=Monat) | |
| unitPrice | integer | JA | Nettoeinzelpreis in Cent |
| grossUnitPrice | integer | BT-148 | Bruttoeinzelpreis in Cent (vor Rabatt) |
| taxRate | decimal | JA | MwSt-Satz in % (z.B. 19) |
| taxCategory | string | Steuerkategorie (S, Z, E, AE, K, G, O) | |
| articleNumber | string | BT-155 | Artikelnummer des Verkaeufers |
| buyerArticleNumber | string | BT-156 | Artikelnummer des Kaeufers |
| ean | string | BT-157 | EAN / GTIN |
| itemStandardIdScheme | string | BT-157-1 | Schema: "0160"=GTIN |
| baseQuantity | decimal | BT-149 | Basismenge (z.B. 100 = "pro 100") |
| baseQuantityUnit | string | BT-150 | Einheit der Basismenge |
| orderLineReference | string | BT-132 | Bestellpositionsnummer |
| positionAccountingReference | string | BT-133 | Kostenstelle der Position |
| objectIdentifier | string | BT-128 | Objekt-Kennung der Position |
| objectIdentifierScheme | string | BT-128-1 | Schema der Objektkennung |
| originCountry | string | BT-159 | Ursprungsland (ISO 3166-1) |
| discountAmount | integer | BT-136 | Rabattbetrag in Cent |
| discountPercent | decimal | BT-138 | Rabatt in Prozent |
| surchargeAmount | integer | BT-141 | Zuschlag in Cent |
| attributes | object | BT-160 | Artikelattribute {"name":"wert"} |
| classifications | object | BT-158 | Klassifizierungen {"CPV":"45000000"} |
| periodStart | date | BT-134 | Positionszeitraum Beginn |
| periodEnd | date | BT-135 | Positionszeitraum Ende |
| allowancesCharges | array | BG-27/28 | Zu-/Abschlaege auf Positionsebene |
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"
}
]
}'
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"
}
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.
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.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| reason | string | JA | Stornogrund (erscheint in den Bemerkungen der Gutschrift) |
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"
}'
Gleiches Format wie beim Erstellen einer Rechnung. Die Gutschrift erhaelt eine eigene Nummer aus Ihrem Nummernkreis; Betraege sind negativ.
INVALID_STATE). Teil-Gutschriften sind
derzeit nur ueber das Dashboard moeglich.
Versendet eine finalisierte E-Rechnung per E-Mail. Die XML-Datei wird automatisch als Anhang mitgesendet.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| recipientEmail | string | JA | E-Mail-Adresse des Empfaengers |
| subject | string | Betreff (Standard: aus Vorlage) | |
| message | string | Nachrichtentext (Standard: aus Vorlage) |
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"
}'
{
"message": "Rechnung erfolgreich versendet.",
"invoiceId": "inv_abc123",
"sentTo": "rechnung@musterfirma.de"
}
Laed die generierte XML-Datei einer finalisierten E-Rechnung herunter.
curl -O -J https://app.billvox.de/api/v1/invoices/inv_abc123/xml \
-H "Authorization: Bearer bvx_IHR_API_KEY"
Die XML-Datei wird direkt als Download geliefert (Content-Type: application/xml).
Laed das PDF einer finalisierten E-Rechnung herunter. Bei Hybridformaten (ZUGFeRD / Factur-X) ist das PDF mit eingebettetem XML die eigentliche Rechnung.
curl -O -J https://app.billvox.de/api/v1/invoices/inv_abc123/pdf \
-H "Authorization: Bearer bvx_IHR_API_KEY"
PDF_NOT_AVAILABLE
liefern — in diesem Fall nach einigen Sekunden erneut versuchen.
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.
curl https://app.billvox.de/api/v1/validate \
-H "Authorization: Bearer bvx_IHR_API_KEY" \
-F "file=@rechnung.xml"
Gesamtstatus (gueltig, warnung, fehler oder unlesbar),
erkanntes Format, die Einzelbefunde mit Regel-ID und die ausgelesenen Eckdaten der Rechnung.
Wandelt eine E-Rechnung in ein anderes Format um. target ist zugferd-pdf,
xrechnung-ubl oder xrechnung-cii; die Antwort ist die erzeugte Datei.
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 melden Ereignisse per POST an eine eigene https-Adresse. Angelegt
werden sie in den Einstellungen unter "Abo & API" (Pro-Plan).
| Ereignis | Wann |
|---|---|
invoice.received | Eine Eingangsrechnung ist eingegangen und geprueft. |
invoice.finalized | Eine Ausgangsrechnung wurde finalisiert. |
invoice.sent | Eine Ausgangsrechnung wurde per E-Mail versendet. |
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.
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-Status | Code | Beschreibung |
|---|---|---|
| 400 | VALIDATION_ERROR | Fehlende oder ungueltige Felder im Request — details enthaelt je Eintrag das betroffene Feld und den Grund |
| 400 | CREATE_ERROR | Rechnung konnte nicht erstellt werden |
| 400 | FINALIZE_ERROR | Rechnung konnte nicht finalisiert werden (z.B. Generierungsfehler) |
| 400 | INVALID_STATE | Aktion im aktuellen Belegstatus nicht moeglich (z.B. Gutschrift fuer Entwurf oder Gutschrift) |
| 400 | SEND_ERROR | E-Mail konnte nicht versendet werden |
| 401 | UNAUTHORIZED | Fehlender oder ungueltiger API-Key |
| 403 | QUOTA_EXCEEDED | Monatliches Belegkontingent des Plans erschoepft |
| 404 | NOT_FOUND | Rechnung nicht gefunden |
| 404 | PDF_NOT_AVAILABLE | PDF wird noch im Hintergrund erstellt — spaeter erneut versuchen |
| 409 | IDEMPOTENCY_KEY_REUSED | Idempotency-Key wurde mit anderem Request-Inhalt wiederverwendet |
| 409 | REQUEST_IN_PROGRESS | Ein Request mit diesem Idempotency-Key wird gerade verarbeitet |
| 422 | INVOICE_NOT_COMPLIANT | Die generierte Rechnung verletzt Geschaeftsregeln des Zielformats (EN 16931 / XRechnung) — Einzelbefunde in details; es wurde keine Rechnung angelegt |
| 429 | - | Rate-Limit ueberschritten |
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.
© Billvox — Zurueck zur App