Skip to Content

Referenz

Alle Angaben stammen aus dem tatsächlichen Server-Schema. Ein automatischer Test wacht darüber, dass diese Referenz nicht von der Implementierung abweicht.

Authentifizierung

Jeder Aufruf trägt den API-Schlüssel als Bearer-Token:

Authorization: Bearer flstr_live_…

Der Mandant (das Konto) ergibt sich aus dem Schlüssel – niemals aus dem Request-Body. Ein Schlüssel sieht und schreibt ausschließlich Daten seines eigenen Kontos.


POST /api/v1/invoices

Erstellt eine Rechnung, schreibt sie fest (KoSIT-validiert, unveränderbar aufbewahrt, lückenlose Nummer) und gibt das ZUGFeRD zurück.

Request-Body

Pflichtfelder sind fett. Beträge sind ganzzahlige Cent (kein Komma, kein Float).

FeldTypGrenzen / Werte
idempotencyKeyStringPflicht, max. 255 Zeichen. Siehe Idempotenz.
issueDateStringPflicht, YYYY-MM-DD (Rechnungsdatum).
outputFormatStringzugferd (Default) · xrechnung · pdf.
deliveryDateStringYYYY-MM-DD – Leistungsdatum.
deliveryPeriodObjekt{ "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" } – Leistungszeitraum (statt deliveryDate).
currencyString3 Zeichen, Default EUR.
buyerReferenceStringmax. 255 – Käuferreferenz / Leitweg-ID (B2G).
taxSchemeStringstandard (Default) · kleinunternehmer · reverseCharge · taxExempt · intraCommunity · export.
taxExemptionReasonStringmax. 1000 – Befreiungsgrund (bei steuerfreien Fällen).
taxExemptionReasonCodeStringmax. 50 – z. B. VATEX-EU-AE.
recipientObjektPflicht – der Empfänger, siehe unten.
linesArrayPflicht, 1–1000 Positionen, siehe unten.
paymentDueDateStringYYYY-MM-DD – Fälligkeit.
paymentTermsStringmax. 1000 – Zahlungsbedingungen (Text).
skontoObjekt{ "percent": 2, "days": 7, "basisAmountCents": 0 } (optional).
notesString[]max. 20 Einträge à max. 1000 Zeichen.

recipient (der Rechnungsempfänger):

FeldTypGrenzen
nameStringPflicht, max. 200.
streetStringPflicht, max. 200.
postcodeStringPflicht, max. 10.
cityStringPflicht, max. 100.
countryCodeString2 Zeichen (Default DE).
customerNumberStringmax. 50 – steuert den Kunden-Upsert.
contactNameStringmax. 200.
vatIdStringmax. 30 – USt-IdNr. (Pflicht bei reverseCharge/intraCommunity).
emailStringmax. 200.
phoneStringmax. 50.

lines[] (je Position):

FeldTypGrenzen / Werte
nameStringPflicht, max. 400.
quantityZahlPflicht (auch Dezimal, z. B. 2.5).
unitCodeStringPflicht – UN/ECE-Code: C62 Stück · HUR Stunde · DAY Tag · MON Monat · E49 Pauschale · KGM Kilogramm · MTR Meter · LTR Liter.
unitPriceCentsGanzzahlPflicht, ≥ 0 – Netto-Einzelpreis in Cent (z. B. 9000 = 90,00 €).
vatCategoryStringPflichtS Regelsatz · AE Reverse Charge · K innergem. · G Ausfuhr · E steuerfrei/§19 · Z/O.
vatRatePercentZahlPflicht, 0–100 (z. B. 19 oder 7).
descriptionStringmax. 1000.

Unbekannte Zusatzfelder werden abgelehnt (400) – der Body wird streng geprüft. So kann z. B. keine organizationId untergeschoben werden; der Mandant kommt immer aus dem Schlüssel.

Response (201 = neu · 200 = idempotente Wiederholung)

{ "invoiceNumber": "RE-2026-1", "invoiceId": "…", "status": "finalized", "idempotent": false, "idempotencyMismatch": false, "customer": { "number": "K-100", "apiCreated": true, "apiUpdated": false }, "documents": { "xml": { "base64": "…", "filename": "RE-2026-1.xml", "contentType": "application/xml" }, "pdf": { "base64": "…", "filename": "RE-2026-1.pdf", "contentType": "application/pdf" } } }
FeldBedeutung
invoiceNumberDie vergebene, lückenlose Rechnungsnummer.
invoiceIdDie ID für den späteren GET-Abruf.
statusImmer finalized (festgeschrieben).
idempotenttrue, wenn dieser Aufruf eine Wiederholung mit bekanntem Schlüssel war (dieselbe Rechnung, nicht neu erzeugt).
idempotencyMismatchNur true, wenn derselbe Schlüssel mit abweichenden Daten kam (die bestehende Rechnung wird zurückgegeben, die neuen Daten ignoriert).
customernull, wenn keine customerNumber übergeben wurde; sonst { number, apiCreated, apiUpdated } – siehe Kunden-Upsert.
documents.xmlDas maßgebliche CII-XML (immer vorhanden).
documents.pdfDas PDF/A-3 – null bei outputFormat: "xrechnung" (XML-only).

Statuscodes

CodeBedeutung
201Rechnung erstellt + festgeschrieben.
200Idempotente Wiederholung (dieselbe Rechnung).
400Ungültige Daten / ungültiges JSON / idempotencyKey fehlt.
401Schlüssel ungültig, widerrufen oder abgelaufen.
403Tarif zu niedrig (Basic nötig) oder Schlüssel vom Betreiber gesperrt.
422KoSIT-Validierung fehlgeschlagen (kosit_validation) oder Vorbedingung fehlt, z. B. kein Unternehmensprofil (invalid_state).
429rate_limit (Anfrage-Limit – kurz warten, wiederholen) oder daily_cap (Tages-Limit – nicht wiederholen).
503Rate-Limiter vorübergehend nicht verfügbar.

Details zu jedem Code: Fehler. Jede Fehlerantwort trägt ein Feld error (Maschinen-Code) und message (Klartext); interne Details werden nie ausgegeben.


GET /api/v1/invoices/{id}

Holt die festgeschriebene Datei erneut. Query ?type=pdf (Default) oder ?type=xml.

curl "https://e-rechnung.flstr.de/api/v1/invoices/6f1c…?type=xml" \ -H "Authorization: Bearer flstr_live_DEIN_SCHLUESSEL" -o rechnung.xml

Die Antwort ist die Datei selbst (nicht JSON): Content-Type: application/pdf bzw. application/xml, als Download-Anhang. Ein Schlüssel kann nur Belege seines eigenen Kontos abrufen – fremde/unbekannte IDs ergeben 404. Bei outputFormat: "xrechnung" gibt es kein PDF, nur ?type=xml.