Verbinden Sie BISpicy POS mit JTL-Wawi, Lexware, Shopify, DATEV oder Ihrem eigenen ERP-System. Produkte, Bestand, Verkäufe, Kunden und Webhooks - alles über eine API.
Zuletzt aktualisiert: 9. November 2026 · Aufbewahrung des Webhook-Zustellprotokolls (BIS ERP 0.0.0.1529) · 20. Oktober 2026: Schnellstart „API-Key erstellen“ an das neue Kundencenter angeglichen
Die BISpicy POS REST API ermöglicht die Integration externer Systeme mit Ihrem Kassensystem. Synchronisieren Sie Produkte, Bestände, Verkaufsdaten und Kundendaten mit Ihrer bestehenden Infrastruktur.
| System | Typischer Einsatz |
|---|---|
| JTL-Wawi | Artikel- und Bestandssync, Verkäufe als Aufträge importieren |
| Lexware | Buchhaltungsexport, Kundenstammdaten |
| Shopify / WooCommerce | Omnichannel-Bestand, Online-Bestellungen |
| DATEV | Täglicher Kassenbericht, Buchungsdaten |
| Custom ERP | Eigene Integrationen, Automatisierungen |
| Parameter | Wert |
|---|---|
| Base URL | https://bispicy.com/api/v1/ |
| Protokoll | HTTPS (TLS 1.3) |
| Format | JSON (UTF-8) |
| Authentifizierung | Bearer Token + HMAC-SHA256 |
| Rate Limits | 60 / 300 / 1.000 Requests/Min |
| Idempotency | 24h Cache für POST/PUT/PATCH |
In 3 Schritten zur ersten API-Abfrage:
Erstellen Sie einen API-Key im BISpicy Kundencenter unter Anbindungen → API und Webhooks.
API-Schlüssel und Webhooks anlegen, ändern, erneuern, löschen und testen dürfen nur Benutzer mit der Rolle Administrator und der Lizenzinhaber des Betriebs (seit BIS ERP 0.0.0.1084). Andere Benutzer sehen die Liste und bekommen beim Ändern eine Meldung. Bestehende Schlüssel arbeiten unverändert weiter.
Für GET-Requests reicht der API-Key als Bearer Token:
Für POST, PUT, PATCH, DELETE ist zusätzlich eine HMAC-Signatur erforderlich.
| Header | Beschreibung |
|---|---|
Authorization | Bearer {api_key} |
X-BISpicy-Timestamp | Unix-Timestamp (Sekunden) |
X-BISpicy-Signature | v1={hmac_hex} |
Idempotency-Key | Eindeutige ID pro Request (UUID empfohlen) |
Content-Type | application/json |
Der Server prüft bei jedem Request:
401401403403401 (Replay-Schutz)401429Bei der API-Key-Erstellung werden Scopes festgelegt. Vergeben Sie nur die Berechtigungen, die tatsächlich benötigt werden (Principle of Least Privilege).
| Scope | Erlaubt |
|---|---|
products:read | Artikel und Kategorien lesen |
products:write | Artikel erstellen, ändern, löschen |
orders:read | Verkäufe und Bestellungen lesen |
inventory:read | Bestände lesen |
inventory:write | Bestände anpassen |
customers:read | Kundendaten lesen |
customers:write | Kunden erstellen, ändern, löschen |
reports:read | Kassenschlüsse, Z-Bons, Steuerberichte |
webhooks:manage | Webhooks erstellen, ändern, löschen |
settings:read | Geschäftseinstellungen lesen |
products:read + inventory:read + inventory:write.| Methode | Pfad | Scope | Beschreibung |
|---|---|---|---|
| GET | /products | products:read | Produktliste (paginiert, Filter) |
| GET | /products/{id} | products:read | Einzelnes Produkt |
| POST | /products | products:write | Produkt erstellen |
| PUT | /products/{id} | products:write | Produkt aktualisieren |
| DEL | /products/{id} | products:write | Produkt löschen (Soft-Delete) |
| POST | /products/batch | products:write | Batch-Upsert (max. 500) |
| Kategorien | |||
| GET | /categories | products:read | Kategorien auflisten (hierarchisch) |
| GET | /categories/{id} | products:read | Einzelne Kategorie |
| POST | /categories | products:write | Kategorie erstellen |
| PUT | /categories/{id} | products:write | Kategorie aktualisieren |
| DEL | /categories/{id} | products:write | Kategorie löschen |
| Bestand | |||
| GET | /inventory | inventory:read | Bestandslevel (low_stock Filter) |
| POST | /inventory/adjustments | inventory:write | Bestandskorrektur (set/add/subtract) |
| Verkäufe (Read-Only) | |||
| GET | /orders | orders:read | Verkaufsliste |
| GET | /orders/{id} | orders:read | Einzelner Verkauf mit Positionen |
| Kunden | |||
| GET | /customers | customers:read | Kundenliste |
| GET | /customers/{id} | customers:read | Einzelner Kunde |
| POST | /customers | customers:write | Kunde erstellen |
| PUT | /customers/{id} | customers:write | Kunde aktualisieren |
| DEL | /customers/{id} | customers:write | DSGVO-Anonymisierung |
| Webhooks | |||
| GET | /webhooks | webhooks:manage | Webhook-Liste |
| POST | /webhooks | webhooks:manage | Webhook erstellen |
| PUT | /webhooks/{id} | webhooks:manage | Webhook aktualisieren |
| DEL | /webhooks/{id} | webhooks:manage | Webhook löschen |
| POST | /webhooks/{id}/test | webhooks:manage | Test-Event senden |
Produktliste mit Pagination und Filtern.
| Parameter | Typ | Beschreibung |
|---|---|---|
page | int | Seitennummer (Default: 1) |
per_page | int | Ergebnisse pro Seite (Default: 50, Max: 200) |
since | ISO 8601 | Nur Änderungen seit Zeitstempel (Delta-Sync) |
active | bool | Nur aktive Produkte filtern |
category_id | string | Nach Kategorie filtern |
sku | string | Exakte Suche nach Artikelnummer (SKU) |
ean | string | Exakte Suche nach EAN/GTIN-Barcode |
search | string | Volltextsuche in Name, SKU, EAN |
Neues Produkt erstellen.
Bis zu 500 Produkte in einem Request erstellen oder aktualisieren.
Kategorien verwalten die hierarchische Produktstruktur. Kompatibel mit JTL-Wawi, Lexware und anderen ERP-Systemen.
Kategorien auflisten mit optionalen Filtern.
| Parameter | Typ | Beschreibung |
|---|---|---|
since | ISO 8601 | Nur geänderte Kategorien |
active | bool | Nur aktive/inaktive Kategorien |
parent_id | UUID | Unterkategorien einer bestimmten Kategorie |
root | bool | Nur Hauptkategorien (ohne Elternkategorie) |
Neue Kategorie erstellen.
Kategorie aktualisieren. Nur übergebene Felder werden geändert.
Kategorie löschen. Produkte werden automatisch aus der Kategorie entfernt. Kategorien mit Unterkategorien können nicht gelöscht werden.
Aktuelle Bestandslevel aller Produkte. Mit low_stock=true nur Artikel unter Mindestbestand.
Bestandskorrekturen durchführen.
| Typ | Beschreibung |
|---|---|
set | Absolut setzen (Inventur) |
add | Hinzufügen (Wareneingang) |
subtract | Abziehen (Schwund, Korrektur) |
Verkaufsliste mit Filtern: since (Delta-Sync), until, device_id.
Einzelner Verkauf mit allen Positionen, MwSt-Aufschlüsselung, Zahlungsart und TSE-Daten.
Vollständiges CRUD für Kundenstammdaten.
Echtzeit-Benachrichtigungen per HTTP POST wenn auf der Kasse etwas passiert.
| Event | Auslöser |
|---|---|
sale.completed | Verkauf an der Kasse abgeschlossen |
sale.refunded | Verkauf erstattet (Rückgabe oder Storno) |
order.created | Neuer Auftrag angelegt |
order.status_changed | Status eines Auftrags geändert |
order.partially_shipped | Auftrag teilweise versendet |
order.shipped | Auftrag vollständig versendet |
product.created | Neues Produkt angelegt |
product.updated | Produkt geändert |
product.deleted | Produkt gelöscht |
category.created | Neue Kategorie angelegt |
category.updated | Kategorie geändert |
category.deleted | Kategorie gelöscht |
customer.created | Neuer Kunde angelegt |
customer.updated | Kundendaten geändert |
customer.deleted | Kunde anonymisiert (DSGVO) |
inventory.updated | Bestand geändert |
inventory.transfer | Ware zwischen Lagerplätzen umgebucht (Lager-App oder BIS ERP) |
voucher.created | Gutschein angelegt |
voucher.updated | Gutschein geändert |
voucher.redeemed | Gutschein eingelöst |
voucher.cancelled | Gutschein storniert |
* | Alle Ereignisse; auch Präfixe wie order.* |
Artikel-, Kategorie-, Kunden-, Gutschein- und Bestandsereignisse (product.*, category.*, customer.*, voucher.*, inventory.updated) melden Änderungen, die über diese API gemacht werden. Verkäufe der Kasse, neue Aufträge und Umbuchungen meldet BIS ERP unabhängig davon, wo sie entstehen; Status- und Versandmeldungen (order.status_changed, order.partially_shipped, order.shipped) gibt es für Aufträge, die über diese API angelegt wurden.
Jeder Webhook wird mit HMAC-SHA256 signiert. Verifizieren Sie die Signatur im Header X-BISpicy-Webhook-Signature:
Bei Fehlern (kein 2xx-Response) wird die Zustellung mit exponentiellem Backoff wiederholt:
| Versuch | Wartezeit |
|---|---|
| 1 | 1 Minute |
| 2 | 5 Minuten |
| 3 | 30 Minuten |
| 4 | 2 Stunden |
| 5 | 6 Stunden |
| 6 | 12 Stunden |
| 7 | 24 Stunden |
| 8 (letzter) | Dead Letter Queue |
https-Adresse sein: Interne, lokale oder reservierte Adressen werden beim Speichern mit einem Fehler abgelehnt, Weiterleitungen werden nicht verfolgt. Ein manuell wiederholter Dead Letter bekommt noch bis zu drei Versuche.customer.created. Seit BIS ERP 0.0.0.1529 wird es automatisch gelöscht: erfolgreich zugestellte Meldungen nach 30 Tagen, nicht zustellbare (Dead Letter) nach 90 Tagen. Zustellungen, die noch auf einen weiteren Versuch warten, bleiben stehen. Einen Dead Letter wiederholen Sie deshalb innerhalb von 90 Tagen.| Tier | Requests/Minute | Requests/Tag |
|---|---|---|
| Basic | 60 | 5.000 |
| Standard | 300 | 50.000 |
| Premium | 1.000 | 200.000 |
Jede Response enthält Rate-Limit-Header:
Bei Überschreitung: 429 Too Many Requests mit Retry-After Header.
| Code | Bedeutung |
|---|---|
| 200 | OK - Erfolgreicher GET, PUT, PATCH, DELETE |
| 201 | Created - Erfolgreicher POST |
| 400 | Bad Request - Ungültiges JSON, fehlende Pflichtfelder |
| 401 | Unauthorized - API-Key ungültig/abgelaufen, HMAC falsch |
| 403 | Forbidden - Fehlender Scope, IP nicht erlaubt |
| 404 | Not Found - Ressource existiert nicht |
| 409 | Conflict - Duplikat (SKU/EAN), Idempotency-Conflict; PUT /products/{id} mit is_active: offene_auftraege (Deaktivieren mit offenen Aufträgen, open_order_count) bzw. ean_vergeben (Aktivieren, EAN trägt inzwischen ein anderes aktives Produkt) |
| 422 | Unprocessable - Validierungsfehler |
| 429 | Too Many Requests - Rate Limit überschritten |
| 500 | Server Error - Bitte mit request_id melden |
| Code | HTTP | Beschreibung |
|---|---|---|
AUTHENTICATION_REQUIRED | 401 | Kein Authorization-Header |
INVALID_API_KEY | 401 | API-Key ungültig oder deaktiviert |
INVALID_SIGNATURE | 401 | HMAC-Signatur stimmt nicht |
TIMESTAMP_EXPIRED | 401 | Timestamp älter als 5 Minuten |
INSUFFICIENT_SCOPE | 403 | API-Key hat nicht den nötigen Scope |
IP_NOT_ALLOWED | 403 | IP nicht in Whitelist |
VALIDATION_ERROR | 422 | Feldvalidierung fehlgeschlagen |
RATE_LIMIT_EXCEEDED | 429 | Rate Limit überschritten |