API — Webhooks
Webhooks ermöglichen Event-basierte Integration: SpeamCore POSTet bei bestimmten Events einen JSON-Payload an Ihre URL.
Event-Typen
| Event | Wann |
|---|---|
customer.created | Neuer Kunde |
customer.updated | Kunde geändert |
customer.deleted | Kunde gelöscht (Soft) |
workorder.completed | Auftrag abgeschlossen |
salesdoc.sent | Beleg versendet |
payment.received | Zahlung eingegangen |
mahnung.sent | Mahnung versendet |
absence.approved | Urlaub genehmigt |
compliance.expiring | Bescheinigung läuft bald ab |
Vollständige Liste in der UI unter Admin → Webhooks.
Konfiguration
POST /api/webhooks
{
"url": "https://my-app.example.com/speamcore-events",
"events": ["customer.*", "workorder.completed"],
"secret": "shared-secret-for-signature",
"active": true
}
Wildcard-Events: customer.* — alle Customer-Events.
Payload-Format
{
"event": "customer.created",
"timestamp": "2026-05-05T14:32:00Z",
"tenantId": "uuid",
"data": {
"id": "uuid",
"name": "Beispiel GmbH",
...
}
}
Signatur-Verifikation
Pro Webhook-Call wird ein Header gesetzt:
X-Speamcore-Signature: sha256=<hex>
Verifikation:
const crypto = require("crypto");
const expectedSig = "sha256=" + crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
if (req.headers["x-speamcore-signature"] !== expectedSig) {
return res.status(401).end();
}
Retry-Verhalten
Bei Fehler (Status >= 400):
- Retry nach 1 min
- Retry nach 5 min
- Retry nach 15 min
- Retry nach 1 h
- Retry nach 6 h
- Aufgeben — Webhook im Log als
failedmarkiert
Bei dauerhaften Fehlern (10 Fehlschläge in Folge): Webhook automatisch deaktiviert + Notification an Admin.
Webhook-Logs
Pro Versand wird protokolliert:
- Event-Typ
- Ziel-URL
- Status-Code
- Response (gekürzt)
- Latenz
- Retry-Anzahl
UI: Admin → Webhooks → Logs.
Tipps
- ✅ Idempotenz im Empfänger — gleiches Event 2x verarbeitet darf nicht doppelt wirken
- ✅ Schnell antworten (200 OK), Verarbeitung asynchron
- ✅ Secret rotieren bei Verdacht auf Leak
- ❌ Webhook-Empfänger nicht öffentlich (auth-pflichtig oder IP-Whitelist)
- ❌ Sensible Daten nicht im Webhook-Body (Lohn, Bank) — separat über API holen
Beispiel-Anwendungen
- CRM-Sync: customer.* → eigenes CRM aktualisieren
- Buchhaltungs-Tool: salesdoc.sent → Rechnung in Buchhaltungs-Tool importieren
- Slack-Notification: workorder.completed → Slack-Channel benachrichtigen
- Reporting: payment.received → Live-Dashboard aktualisieren
Verwandte Doku
- Notification-System — interne Notifications
- Sync und Jobs — Hintergrund-Jobs