orders:write Bestellungen & Fulfillment Erlaubt ausschließlich das Melden von Verkaufs- und Erfüllungsdaten.
Rechnungskit API · v1
Sende Bestellungen und Fulfillment aus deinem SaaS, Headless-Shop oder Backend. Verfolge die Rechnung über deine eigene Bestellnummer und lade PDF oder XML serverseitig ab.
https://api.rechnungskit.de/v1Authorization: Bearer rk_live_…application/json · integer centsQuickstart
Erstelle unter Einstellungen → API einen projektgebundenen Schlüssel. Der vollständige Schlüssel wird genau einmal angezeigt und gehört ausschließlich in dein Backend oder Secret-Management.
orders:write Bestellungen & Fulfillment Erlaubt ausschließlich das Melden von Verkaufs- und Erfüllungsdaten.
invoices:read Status & Dokumente Erlaubt das Lesen von Rechnungsmetadaten sowie PDF und XML.
Integrationsablauf
Du musst keine interne Rechnungskit-ID kennen. Nutze eine dauerhaft eindeutige orderNo und – bei Zahlung über Stripe, Mollie oder einen anderen Provider –
dessen eindeutige paymentRef.
Deine orderNo wird zum stabilen Korrelationsschlüssel.
Zahlungswebhook matcht über paymentRef; physische Ware wartet auf
Fulfillment.
GET /v1/orders/{orderNo} liefert die zugeordneten Rechnungen.
Speichere die zurückgegebene Invoice-UUID oder Belegnummer für diesen Beleg.
PDF und XML bleiben Bearer-geschützt und werden serverseitig abgerufen.
1 · Bestellung
Jeder POST benötigt einen stabilen Idempotency-Key. Bei einem Timeout kannst
du dieselbe Anfrage mit demselben Key wiederholen, ohne eine zweite Bestellung anzulegen.
POST /v1/orderscurl https://api.rechnungskit.de/v1/orders \
-X POST \
-H "Authorization: Bearer $RK_API_KEY" \
-H "Idempotency-Key: order:CM-10482:v1" \
-H "Content-Type: application/json" \
-d '{
"orderNo": "CM-10482",
"paymentRef": "pi_3PqK8w2eZvKYlo2C",
"currency": "EUR",
"requiresShipping": false,
"billingAddress": {
"name": "Lisa Brandt",
"street": "Torstraße 99",
"postal_code": "10119",
"city": "Berlin",
"country_code": "DE"
},
"items": [{
"name": "Monatsabo Pro · Juni 2026",
"sku": "saas-pro",
"quantity": 1,
"unitNetCents": 4118,
"taxRate": 19
}]
}'Bestellung angenommen{
"data": {
"id": "6d754aec-40d9-4c1a-a78c-50dbb6c8e307",
"orderNo": "CM-10482",
"status": "created"
},
"requestId": "9d61558e-3c00-465d-b980-c074db600047"
}data.id ist die interne Bestellungs-ID, nicht die spätere Rechnungs-ID. Für deinen Ablauf bleibt CM-10482 maßgeblich.| Feld | Typ | Hinweis |
|---|---|---|
orderNo | string | In deinem Projekt dauerhaft eindeutig |
billingAddress | object | Land immer; vollständige Anschrift für reguläre Rechnungen |
items[] | array | Mindestens eine Position |
unitNetCents oder unitGrossCents | integer | Geldbeträge ausschließlich in Cent |
paymentRef | string? | Eindeutige Provider-Referenz für Payment-Matching |
requiresShipping | boolean? | true hält physische Ware bis zur Erfüllung zurück |
2 · Erfüllung
Bei physischer Ware ist das Versanddatum das relevante Leistungsdatum. Melde daher den vollständigen Versand. Teilfulfillments erzeugen noch keinen vollständigen Beleg.
POST /v1/fulfillmentscurl https://api.rechnungskit.de/v1/fulfillments \
-X POST \
-H "Authorization: Bearer $RK_API_KEY" \
-H "Idempotency-Key: fulfillment:CM-10482:fulfilled:v1" \
-H "Content-Type: application/json" \
-d '{
"orderNo": "CM-10482",
"status": "fulfilled",
"shippedAt": "2026-07-27T10:30:00Z",
"trackingNumber": "003404341612"
}'3 · Status & Dokumente
Frage den Status mit deiner eigenen Bestellnummer ab. Sobald eine Rechnung angelegt wurde,
enthält invoices[] ihre UUID, Belegnummer und ihren Archivstatus.
GET /v1/orders/CM-10482curl https://api.rechnungskit.de/v1/orders/CM-10482 \ -H "Authorization: Bearer $RK_API_KEY"
Rechnung gefunden{
"data": {
"orderNo": "CM-10482",
"status": "invoiced",
"fulfillmentStatus": "fulfilled",
"invoices": [{
"id": "f77ba43d-6f06-4b84-bd24-5cfab76a1192",
"number": "RK-2026-0148",
"status": "archived",
"url": "/v1/invoices/f77ba43d-6f06-4b84-bd24-5cfab76a1192"
}]
},
"requestId": "3a61c30d-4386-4c60-9354-841342cbc372"
}Verwende anschließend die UUID, wenn du einen ganz bestimmten Beleg herunterladen willst. Das ist bei Stornos oder mehreren Dokumenten zu einer Bestellung eindeutig.
GET /v1/invoices/{id}/pdfcurl https://api.rechnungskit.de/v1/invoices/f77ba43d-6f06-4b84-bd24-5cfab76a1192/pdf \ -H "Authorization: Bearer $RK_API_KEY" \ --output RK-2026-0148.pdf
/invoices/CM-10482 liefert den neuesten Beleg. Für einen exakten Original- oder Korrekturbeleg immer die UUID aus invoices[] verwenden.Alternative · Rechnungskauf
Bei Kauf auf Rechnung gibt es zunächst keine Provider-Zahlung. Sende stattdessen den in Rechnungskit unter Connect freigegebenen Gateway-Namen. Nach vollständigem Fulfillment entsteht die Rechnung mit offenem Posten und Zahlungsziel.
POST /v1/orders{
"orderNo": "CM-10483",
"paymentGateway": "invoice",
"financialStatus": "pending",
"requiresShipping": true,
"billingAddress": { "...": "vollständige Rechnungsanschrift" },
"items": [ "..." ]
}paymentGateway muss exakt zu einem unter Connect → Rechnungskauf aktivierten Gateway passen. Ohne passende Zahlung oder
freigegebenes Invoice-first-Gateway bleibt die Bestellung bewusst ohne Rechnung.Referenz
/api/health Prozess- und Datenbankstatus
öffentlich/v1 API-Discovery und verfügbare Endpunkte
öffentlich/v1/orders Bestellung idempotent anlegen oder aktualisieren
orders:write/v1/orders/{orderNo} Bestell-, Fulfillment- und Rechnungsstatus abrufen
invoices:read/v1/fulfillments Versand oder Leistungserfüllung melden
orders:write/v1/invoices Rechnungen filtern und per Cursor paginieren
invoices:read/v1/invoices/{reference} Metadaten über UUID, Beleg-, Bestell- oder Zahlungsreferenz
invoices:read/v1/invoices/{reference}/pdf Archiviertes PDF herunterladen
invoices:read/v1/invoices/{reference}/xml Archiviertes EN-16931-XML herunterladen
invoices:readMaschinenlesbare Referenz: OpenAPI 3.1 herunterladen ↗
Fehler & Wiederholungen
Der Header X-Request-Id und das JSON-Feld requestId identifizieren dieselbe Anfrage. Du findest sie 30 Tage lang in der API-Aktivität
deines Projekts.
validation_failed{
"error": {
"code": "validation_failed",
"message": "billingAddress.country_code is required for VAT determination",
"field": "billingAddress.country_code"
},
"requestId": "9d61558e-3c00-465d-b980-c074db600047"
}| Status | Bedeutung | Reaktion |
|---|---|---|
400/422 | Request oder Fachfelder ungültig | Nicht blind wiederholen; Daten korrigieren |
401/403 | Key ungültig oder Scope fehlt | Key und Berechtigungen prüfen |
404 | Bestellung oder Beleg noch nicht vorhanden | Bei asynchronem Ablauf mit Backoff erneut prüfen |
409 | Konflikt oder Dokument noch nicht archiviert | Antwortcode auswerten und später erneut abrufen |
429/503 | Temporär nicht verfügbar | Retry-After beachten, exponentieller Backoff |
Sandbox
Jedes Konto hat einen Testmodus: Ein Klick in den Projekteinstellungen erstellt ein
separates Sandbox-Projekt mit eigenen rk_test_…-Schlüsseln. Die Sandbox nutzt
dieselbe API und dieselbe Pipeline wie die Produktion, inklusive EN-16931-Validierung und
PDF/A-3-Rendering. Du testest also exakt das Verhalten, das später live läuft.
TEST-2026-0001 Eigener Nummernkreis Testbelege sind unübersehbar als Testbeleg gekennzeichnet, in PDF und XML, und laufen in einem eigenen TEST-Nummernkreis.
0,00 € Ohne Abrechnung Testbelege zählen nicht in die Abrechnung und tauchen weder im DATEV-Export noch in OSS- oder ZM-Auswertungen auf.
isoliert Kein Versand, keine Wirkung Rechnungsversand ist in der Sandbox gesperrt; Testbelege haben keine steuerliche Wirkung und lassen sich jederzeit per Reset verwerfen.
rk_test_…-Schlüssel und wechsle erst danach den Schlüssel auf rk_live_…. Der Code bleibt identisch; nur der Schlüssel entscheidet, ob
Belege echt sind. Die Sandbox ist für Integrations- und Abnahmetests gedacht (Fair Use),
nicht für Lasttests.Sicherheit
status: ok bestätigt den Prozess, db: true zusätzlich die Datenbankverbindung. Prüfe beide Werte, nicht nur HTTP
200.
Bereit?
Die vollständige Zeichenfolge wird nur einmal angezeigt.