Die External API verbindet eigene Systeme, Automationen und Integrationen mit Billutant. Ein Token reicht, um Kunden, Artikel, Vorlagen und Rechnungen mandantensicher zu verwalten.
POST /invoices
Authorization: Bearer bt_live_...
Content-Type: application/json
{
"customerId": "customer_123",
"itemIds": ["item_setup", "item_monthly"],
"draft": false,
"send": true,
"emailTemplateId": "template_invoice"
}Die Integration braucht keinen OAuth-Flow und keine lokale SDK-Installation. Ein Secret, eine Base URL und JSON reichen für den ersten Test.
Erstelle in Billutant einen API-Token und speichere ihn im externen System als Secret.
Starte gegen die Test-Umgebung, bis Payload, Status und Versand sauber funktionieren.
Sende JSON mit customerId und itemIds an /invoices. Produktion braucht später nur die andere Base URL.
Tokens werden in Billutant in den Einstellungen erzeugt. Jede Anfrage verwendet den Header Authorization: Bearer TOKEN und wird automatisch rate-limited.
Produktion und Test nutzen jeweils denselben Pfad unter /api/v1.
https://app.billutant.com/api/v1https://test.billutant.com/api/v1Der Token ist nur einmal sichtbar. Speichere ihn im externen Tool als Secret.
Authorization: Bearer bt_live_...
Schreibende Requests verwenden application/json. GET-Endpunkte brauchen keinen Body.
Content-Type: application/json
Standardmäßig sind 60 Requests pro Minute und Token vorgesehen. Bei Überschreitung antwortet die API mit 429.
Die Rechnungs-API bleibt bewusst schlank: Kunden und Artikel werden per ID referenziert, das Rechnungsdatum setzt Billutant automatisch.
/invoicesErstellt eine Rechnung aus vorhandener Kunden-ID und Artikel-IDs. Optional direkt senden.
/invoicesLiefert die Rechnungen des verbundenen Billutant Mandanten.
/invoices/{id}Liest eine einzelne Rechnung, wenn sie zum Mandanten des Tokens gehört.
/invoices/{id}Aktualisiert nur Rechnungen im Status Entwurf. Finalisierte Rechnungen bleiben gesperrt.
/invoices/{id}/sendSendet eine bestehende, nicht als Entwurf gespeicherte Rechnung mit emailTemplateId.
/invoices/{id}Rechnungen können über die API nicht gelöscht werden.
customerId und itemIds sind Pflicht. send versendet automatisch, wenn eine gültige emailTemplateId übergeben wird und der Kunde eine gültige E-Mail-Adresse hat.
createDate wird nicht akzeptiert und von Billutant gesetzt.
draft: true erstellt einen Entwurf.
draft und send können nicht gleichzeitig true sein.
PATCH /invoices/{id} kann Entwürfe ändern, aber nicht senden.
POST /invoices/{id}/send braucht nur emailTemplateId im Body.
DELETE /invoices/{id} ist gesperrt.
curl -X POST https://test.billutant.com/api/v1/invoices \
-H "Authorization: Bearer bt_live_..." \
-H "Content-Type: application/json" \
-d '{"customerId":"customer_123","itemIds":["item_setup"],"send":false}'{
"success": true,
"data": {
"id": "invoice_123",
"invoiceNumber": "2026-0012",
"status": "pending",
"customerId": "customer_123",
"files": ["2026-0012.pdf"],
"sent": true,
"draft": false
}
}Für robuste Integrationen sollte der Client zuerst den HTTP-Status auswerten und erst danach die JSON-Antwort weiterverarbeiten.
Erfolgreich
Der Request wurde verarbeitet. Bei POST /invoices enthält data die erstellte Rechnung.
Payload prüfen
Pflichtfelder fehlen oder Regeln wie draft und send wurden verletzt.
Token prüfen
Der Bearer Token fehlt, ist ungültig oder wurde im externen Tool falsch gespeichert.
Feature aktivieren
Die External Invoice API ist für den verbundenen Mandanten noch nicht freigeschaltet.
Ressource prüfen
Die angefragte ID existiert nicht oder gehört nicht zum Mandanten des Tokens.
Methode wechseln
Die Route existiert, aber die HTTP-Methode ist dort nicht erlaubt, zum Beispiel DELETE /invoices/{id}.
Retry später
Das Rate Limit wurde erreicht. Clients sollten verzögert erneut senden.
async function createBillutantInvoice(token) {
const response = await fetch('https://test.billutant.com/api/v1/invoices', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
customerId: 'customer_123',
itemIds: ['item_setup'],
send: false,
}),
});
const payload = await response.json();
if (!response.ok) {
throw new Error(payload.error || `Billutant API request failed with ${response.status}`);
}
return payload.data;
}{
"success": false,
"error": "emailTemplateId is required when send is true."
}Kunden, Artikel und E-Mail-Vorlagen können direkt über die API gepflegt werden, damit externe Systeme keine manuellen Vorarbeiten in Billutant brauchen.
/customersListe vorhandener Kunden für die Auswahl in externen Tools.
/customersLegt einen Kunden an. Firma, Name oder E-Mail ist als Identifikation erforderlich.
/customers/{id}Liest einen einzelnen Kunden, wenn er zum Mandanten des Tokens gehört.
/customers/{id}Ändert Stammdaten eines vorhandenen Kunden.
/customers/{id}Löscht Kunden, wenn externe Workflows das ausdrücklich brauchen.
/itemsLiest Produkte und Leistungen, die als Rechnungspositionen genutzt werden.
/itemsSpeichert eine Leistung mit Name, Beschreibung, Preis, Steuer und Einheit.
/items/{id}Liest ein einzelnes Produkt oder eine Leistung aus dem verbundenen Mandanten.
/items/{id}Ändert Name, Beschreibung, Preis, Steuer oder Einheit eines Artikels.
/items/{id}Löscht einen Artikel, wenn externe Workflows ihn nicht mehr benötigen.
/email-templatesLiest E-Mail-Vorlagen, die beim automatischen Versand verwendet werden.
/email-templatesErstellt eine Vorlage mit Typ, Label, Betreff und Body für den Rechnungsversand.
/email-templates/{id}Liest eine einzelne E-Mail-Vorlage aus dem verbundenen Mandanten.
/email-templates/{id}Aktualisiert Typ, Label, Betreff, Body oder Mahnparameter einer Vorlage.
/email-templates/{id}Löscht eine E-Mail-Vorlage, wenn sie nicht mehr genutzt wird.
Nutze zuerst die Test-Umgebung. Wenn Payload und Versand passen, stellst du im externen Tool nur die Base URL auf Produktion um.