Einführung
Mit der billware-API legst du Artikel, Kunden, Adressen und Aufträge in deinem billware-Konto aus deinen eigenen Systemen an und pflegst sie – zum Beispiel aus einem Shop, einer Warenwirtschaft oder einem Skript, das Aufträge aus einer Quelle importiert, für die billware keine Erweiterung hat.
Bevor du loslegst
Die API ist eine Erweiterung deines billware-Kontos. Aktiviere sie einmal und öffne dann die API-Konfiguration in deinem Kundenbereich. Dort findest du die zwei Werte, die jede Anfrage braucht:
| API-Appid | Kennzeichnet dein Konto. Wird im Klartext als erster Teil von X-Bw-Hmac gesendet. |
| API-Secret | Signiert den Request-Body. Sende es nie mit und lege es nie in Client-Code ab. |
So ist ein Aufruf aufgebaut
Es gibt einen Endpunkt für alles. Die Methode steht nicht in der URL – sie kommt in den Header X-Bw-Method, die Parameter kommen als JSON in den Request-Body.
| URL | https://www.billware.de/api/v1 |
| Methode | POST – für jede Funktion, auch für lesende |
X-Bw-Method |
Name der Funktion, z. B. order.create |
X-Bw-Hmac |
API-Appid, ein Doppelpunkt und der berechnete HMAC, z. B. appid:hmac |
Content-Type |
application/json |
Der HMAC ist eine SHA-256-Signatur des rohen Request-Bodys, base64-kodiert. Signiere genau die Bytes, die du sendest: Wenn du den Payload nach dem Signieren neu kodierst, passt die Signatur nicht mehr. Beispiele in fünf Sprachen findest du unter Authentifizierung.
Dein erster Aufruf
test.connection braucht keine Parameter und sagt dir nur, ob deine Zugangsdaten funktionieren. So prüfst du die Signatur, bevor du echte Daten anfasst.
# Get your API credentials from your billware customer area
API_APPID="your-app-id"
API_SECRET="your-api-secret"
PAYLOAD='[]'
# The HMAC is calculated over the exact request body that is sent
HMAC=$(printf '%s' "$PAYLOAD" | openssl dgst -sha256 -hmac "$API_SECRET" -binary | base64)
curl -X POST "https://www.billware.de/api/v1" \
-H "X-Bw-Hmac: $API_APPID:$HMAC" \
-H "X-Bw-Method: test.connection" \
-H "Content-Type: application/json" \
-d "$PAYLOAD"<?php
// Get your API credentials from your billware customer area
$apiAppId = 'your-app-id';
$apiSecret = 'your-api-secret';
$payload = '{}';
// The HMAC is calculated over the exact request body that is sent
$hmac = base64_encode(hash_hmac('sha256', $payload, $apiSecret, true));
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://www.billware.de/api/v1',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-Bw-Hmac: '.$apiAppId.':'.$hmac,
'X-Bw-Method: test.connection',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
print_r(json_decode($response, true));import crypto from 'node:crypto';
// Get your API credentials from your billware customer area
const apiAppId = 'your-app-id';
const apiSecret = 'your-api-secret';
const payload = JSON.stringify({});
// The HMAC is calculated over the exact request body that is sent
const hmac = crypto.createHmac('sha256', apiSecret).update(payload).digest('base64');
const response = await fetch('https://www.billware.de/api/v1', {
method: 'POST',
headers: {
'X-Bw-Hmac': `${apiAppId}:${hmac}`,
'X-Bw-Method': 'test.connection',
'Content-Type': 'application/json'
},
body: payload
});
console.log(await response.json());import base64
import hashlib
import hmac
import json
import requests
# Get your API credentials from your billware customer area
api_appid = "your-app-id"
api_secret = "your-api-secret"
payload = json.dumps({})
# The HMAC is calculated over the exact request body that is sent
signature = base64.b64encode(
hmac.new(api_secret.encode(), payload.encode(), hashlib.sha256).digest()
).decode()
response = requests.post(
"https://www.billware.de/api/v1",
data=payload,
headers={
"X-Bw-Hmac": f"{api_appid}:{signature}",
"X-Bw-Method": "test.connection",
"Content-Type": "application/json",
},
)
print(response.json())using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
// Get your API credentials from your billware customer area
const string apiAppId = "your-app-id";
const string apiSecret = "your-api-secret";
var payload = JsonSerializer.Serialize(new { });
// The HMAC is calculated over the exact request body that is sent
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(payload)));
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://www.billware.de/api/v1")
{
Content = new StringContent(payload, Encoding.UTF8, "application/json")
};
request.Headers.Add("X-Bw-Hmac", $"{apiAppId}:{signature}");
request.Headers.Add("X-Bw-Method", "test.connection");
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());Antwortformat
Jede Antwort ist ein JSON-Objekt mit denselben drei Feldern. data enthält das Ergebnis und ist null, wenn eine Methode nichts zurückgibt.
{
"response": true,
"data": {
"order_ident": "154xy0817679B1kJ"
},
"message": "order created"
}
Eine Anfrage, die verstanden, aber nicht ausgeführt werden konnte – ein fehlendes Pflichtfeld, eine unbekannte Kennung – antwortet trotzdem mit HTTP 200 und "response": false. Werte immer response aus, nicht nur den Statuscode.
Manche Methoden ergänzen Felder neben den drei genannten. order.list zum Beispiel liefert die Werte zur seitenweisen Ausgabe auf der obersten Ebene.
Statuscodes
| Code | Bedeutung |
|---|---|
200 |
Die Anfrage wurde verarbeitet. Das Ergebnis steht in response. |
401 |
Der HMAC passt nicht, oder die API-Appid ist unbekannt. |
402 |
Das Aufrufkontingent deines Kontos ist aufgebraucht. |
403 |
Die Methode gehört zu einer Erweiterung, die für dein Konto nicht aktiv ist. |
404 |
X-Bw-Method fehlt oder nennt eine Funktion, die es nicht gibt. |
503 |
billware ist im Wartungsmodus. Versuch es später noch einmal. |
Aufrufkontingent
Aufrufe werden je Konto in einem gleitenden Fenster von einer Stunde gezählt. Wie viele enthalten sind, hängt von deinem API-Paket ab. Ist das Fenster aufgebraucht, antworten weitere Anfragen mit 402 und der Meldung "Api call limit reached", bis die ältesten Aufrufe aus dem Fenster fallen.
Deine Aufrufe einsehen
Die API-Konfiguration listet jeden Aufruf der letzten Stunde mit Uhrzeit, Methode, Statuscode, der Meldung, mit der billware geantwortet hat, und der aufrufenden IP-Adresse. Das ist meist der schnellste Weg herauszufinden, warum eine Anbindung nicht tut, was du erwartest – und zeigt auch, wie viel von deinem Kontingent noch übrig ist.
Kennungen und Formate
| Kennungen | Artikel, Kunden, Adressen und Aufträge werden über ihre *_ident-Zeichenkette angesprochen, zum Beispiel order_ident. Du bekommst sie vom passenden create-Aufruf und von read. |
| Datum und Uhrzeit | "JJJJ-MM-TT HH:MM:SS", z. B. "2025-07-16 10:00:00" |
| Zahlen | Preise und Mengen werden als Zahlen gesendet, nicht als Zeichenketten. Dezimaltrennzeichen ist der Punkt. |
| Wahrheitswerte | Schalter wie is_paid verwenden 0 und 1. |
Wie es weitergeht
| Authentifizierung | Eine Anfrage signieren und die Verbindung testen. |
| Artikel | Artikel anlegen, lesen, ändern und löschen. |
| Kunden | Kunden und ihre Lieferadressen. |
| Aufträge | Aufträge, Zahlungen und Rechnungsnummern. |
| Postman | Eine fertige Collection mit allen Methoden. |