Booking-Webhooks
Booking-Webhooks senden einen signierten POST an einen HTTPS-Endpunkt unter Ihrer Kontrolle, sobald ein Booking in Ihrem Workspace den Status wechselt — erstellt, bestätigt, storniert, umgeplant, abgelehnt, neu zugewiesen oder als No-Show markiert. Diese Seite behandelt die Event-Liste, die Payload, die Header, die Signaturprüfung und den Delivery-/Retry-Vertrag. Für die schreibgeschützte Bookings-API und eine schnelle Orientierung beginnen Sie mit der Bookings-Einführung.
Webhook-Abonnements werden in den Bookings-Einstellungen der Copera-App von einem Workspace-Administrator konfiguriert — sie werden nicht über die Public API erstellt oder verwaltet. Jedes Abonnement hat eine Empfänger-URL, eine Menge von Events und ein Signing-Secret.
Events
| Event | Wird ausgelöst, wenn |
|---|---|
booking.created | Ein Booking wird erstellt (pending oder confirmed). |
booking.confirmed | Ein Booking wird bestätigt. |
booking.cancelled | Ein Booking wird storniert. |
booking.rescheduled | Ein Booking wird auf eine neue Zeit umgeplant. |
booking.declined | Ein ausstehendes Booking wird vom Host abgelehnt. |
booking.reassigned | Der Host eines Bookings wird neu zugewiesen (Round-Robin). |
booking.no_show | Ein No-Show für Host oder Booker wird erfasst. |
Ein Abonnement empfängt nur die enthaltenen Events und nur, solange es aktiv ist.
Payload
Jede Delivery ist ein POST mit JSON-Body:
{
"event": "booking.confirmed",
"createdAt": "2026-07-06T09:00:00.000Z",
"data": {
"id": "665f…",
"status": "CONFIRMED",
"bookingTypeId": "665f…",
"bookingTypeTitle": "Intro Call",
"start": "2026-07-08T15:00:00.000Z",
"end": "2026-07-08T15:30:00.000Z",
"durationMinutes": 30,
"timezoneAtBooking": "America/Sao_Paulo",
"hosts": [{ "userId": "665f…", "role": "ORGANIZER" }],
"booker": {
"name": "Alice Booker",
"email": "[email protected]",
"phone": "+15551234567",
"timezone": "America/Sao_Paulo",
"locale": "en"
},
"guests": [],
"answers": [{ "questionId": "q1", "label": "Topic", "value": "Pricing" }],
"location": { "type": "MEETING_CHANNEL" }
}
}
Der Block data ist die Booking-Daten Ihres eigenen Workspace, daher sind Kontaktdaten des Bookers enthalten. Sensible interne Felder werden nie gesendet.
Webhook-Event mit der Public API korrelieren
Die Webhook-Payload trägt data.id. Übergeben Sie sie direkt an GET /public/v1/bookings/{id}, um die vollständigen Booking-Details zu holen:
curl -H "Authorization: Bearer $TOKEN" \
"https://api.copera.ai/public/v1/bookings/${data.id}"
Nutzen Sie denselben Wert data.id mit einer authentifizierten Bookings-API-Anfrage, wenn Sie Webhook-Events mit den vollen Booking-Details korrelieren wollen.
Header
| Header | Wert |
|---|---|
X-Copera-Event | Der Event-String (z. B. booking.confirmed). |
X-Copera-Signature | sha256=<hex> — HMAC-SHA256 des rohen Request-Body mit Ihrem Abonnement-Secret. |
X-Copera-Webhook-Version | Die Payload-Vertragsversion (derzeit 1). |
Signatur prüfen
Berechnen Sie den HMAC-SHA256 des rohen Request-Body (vor dem JSON-Parsing) mit Ihrem Abonnement-Secret und vergleichen Sie ihn zeitkonstant mit dem Hex in X-Copera-Signature:
import { createHmac, timingSafeEqual } from "node:crypto";
function isValidSignature(rawBody, header, secret) {
const expected =
"sha256=" + createHmac("sha256", secret).update(rawBody, "utf8").digest("hex");
const a = Buffer.from(header);
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}
Delivery und Retries
- Antworten Sie mit
2xx, um den Empfang zu bestätigen. - Ein
4xxgilt als endgültige Ablehnung — Copera retryt nicht. - Ein
5xx, Netzwerkfehler oder Timeout wird mit exponentiellem Backoff erneut versucht (insgesamt 3 Versuche). Machen Sie Ihren Empfänger idempotent — dasselbe Event kann mehrfach zugestellt werden. - Empfänger-URLs müssen öffentliche HTTPS-Endpunkte sein; private oder interne Adressen werden abgelehnt.
Referenz
- Bookings-Einführung — Orientierung, Quick Start, Parity und die schreibgeschützte Bookings-API.
- Authentifizierung — Token-Scopes für die Bookings-Lese-Endpunkte.