Entwickler
Webhooks
Erhalten Sie signierte HTTPS-Benachrichtigungen, wenn Anrufe enden, Nachrichten aufgenommen werden, sich Termine, Bestellungen und Reservierungen ändern, oder eine Kampagne endet, und prüfen Sie, dass jede wirklich von Ringhum stammt.
6 Min. Lesezeit Aktualisiert am 24 September 2026
Auf dieser Seite
Ein Webhook sendet in dem Moment, in dem in Ihrem Workspace etwas geschieht, eine HTTPS-Anfrage an Ihren Server. Nutzen Sie Webhooks statt die API abzufragen: Endet ein Anruf, erhalten Sie Zusammenfassung, Ergebnis, erfasste Details und Transkript sofort. Jede Zustellung ist mit einem Geheimnis signiert, das nur Sie und Ringhum kennen, sodass Ihr Server alles ablehnen kann, was nicht von Ringhum stammt.
Einen Endpunkt hinzufügen
Nur der Workspace-Owner und Admins können Endpunkte hinzufügen, testen und entfernen.
- Öffnen Sie Entwickler in der Seitenleiste.
- Klicken Sie in der Karte Webhooks auf Endpunkt hinzufügen.
- Geben Sie die Endpunkt-URL ein. Sie muss mit
https://beginnen. - Haken Sie unter Ereignisse die gewünschten Ereignisse an.
call.endedist bereits angehakt. - Klicken Sie auf Endpunkt hinzufügen.
- Kopieren Sie das Signaturgeheimnis aus dem grünen Feld (es beginnt mit
whsec_) und bewahren Sie es auf Ihrem Server auf. Klicken Sie auf Fertig.
Wichtig: Das Signaturgeheimnis wird nur einmal angezeigt. Falls Sie es verlieren, entfernen Sie den Endpunkt und fügen Sie ihn erneut hinzu, um ein neues Geheimnis zu erhalten.
Sie können so viele Endpunkte hinzufügen, wie Sie benötigen. Webhooks decken jeden Assistenten im Workspace ab. Sie können Endpunkte auch über die API verwalten, mit POST /webhooks und einem Schlüssel mit der Berechtigung write.
Ereignisse
| Ereignis | Wann es gesendet wird |
|---|---|
call.started |
Ein Anruf wurde von einem Assistenten angenommen |
call.ended |
Ein Anruf endete und wurde zusammengefasst (enthält Transkript und Zusammenfassung) |
call.transferred |
Ein Anruf wurde an eine Person weitergeleitet |
message.taken |
Der Assistent hat eine Nachricht aufgenommen |
appointment.booked |
Der Assistent hat einen Termin gebucht |
appointment.rescheduled |
Ein Termin wurde auf eine neue Zeit verschoben |
appointment.cancelled |
Ein Termin wurde storniert |
order.created |
Eine Bestellung wurde aufgegeben (von einem Assistenten, von Hand oder über die API) |
order.updated |
Eine Bestellung wechselte zu einem neuen Status |
order.cancelled |
Eine Bestellung wurde storniert |
reservation.created |
Ein Zimmer wurde reserviert (von einem Assistenten, von Hand oder über die API) |
reservation.updated |
Eine Reservierung wechselte zu einem neuen Status (bestätigt, eingecheckt, ausgecheckt, nicht erschienen) |
reservation.cancelled |
Eine Reservierung wurde storniert |
campaign.completed |
Eine ausgehende Kampagne hat ihre Liste fertig abgerufen |
test.ping |
Sie haben auf Test senden geklickt |
Wie eine Zustellung aussieht
Jede Zustellung ist ein POST mit einem JSON-Body und diesen Headern:
POST https://example.com/hooks/ringhum
Content-Type: application/json
User-Agent: Ringhum-Webhooks/1.0
X-Ringhum-Event: call.ended
X-Ringhum-Timestamp: 1789250000
X-Ringhum-Signature: v1=5f1a…
{
"id": "evt_8f2k…",
"type": "call.ended",
"created_at": "2026-09-24T14:03:11+00:00",
"data": {
"call_id": 4812,
"direction": "inbound",
"from": "+14155550132",
"to": "+14155550100",
"assistant_id": 3,
"status": "completed",
"outcome": "message_taken",
"sentiment": "neutral",
"duration_seconds": 94,
"summary": "Caller asked for a quote for a kitchen repair…",
"extracted": { "name": "Dana Lee", "reason": "Quote" },
"transcript": [
{ "role": "assistant", "content": "Hello, you've reached…" },
{ "role": "user", "content": "Hi, I'd like a quote…" }
]
}
}
Das data-Objekt hängt vom Ereignis ab:
call.endedundmessage.taken: die obigen Anruffelder.call.startedundcall.transferred:call_id,direction,from,to,assistant_id,statusundstarted_at.appointment.*:appointment_id,title,status,starts_at,ends_at,timezone,customer(Name, Telefon, E-Mail),contact_id,service,staff,call_idundnotes.order.*:order_id,number,status,fulfillment,customer,address,itemsmit Optionen und Preisen,currency,subtotal,fee,total,source,call_idund, bei Stornierungen,cancel_reason.reservation.*:reservation_id,number,status,room,check_in,check_out,nights,adults,children,guest,currency,nightly,totalundsource.campaign.completed:campaign_id,nameund die Fortschrittszahlen der Kampagne.
Hinweis: Bucht der Assistent während eines Anrufs einen Termin, können Sie
appointment.bookedzweimal erhalten. Eine wird beim Vornehmen der Buchung mit den Terminfeldern gesendet. Die andere wird gesendet, nachdem der Anruf zusammengefasst wurde, mit den Anruffeldern. Prüfen Sie, obdataappointment_idodercall_identhält, und nutzen Sie das Feldid, um zu vermeiden, eine Zustellung zweimal zu verarbeiten.
Die Signatur prüfen
Die Signatur ist ein HMAC-SHA256 aus dem Zeitstempel, einem Punkt und dem rohen Request-Body, mit dem Signaturgeheimnis Ihres Endpunkts als Schlüssel. Sie wird als v1= gefolgt vom Hex-Digest gesendet.
- Lesen Sie den rohen Body genau so, wie er empfangen wurde, vor jedem JSON-Parsing.
- Bilden Sie die Zeichenkette
{X-Ringhum-Timestamp}.{roher Body}. - Berechnen Sie das HMAC-SHA256 mit Ihrem Geheimnis und stellen Sie
v1=voran. - Vergleichen Sie es mit
X-Ringhum-Signaturemittels eines zeitkonstanten Vergleichs. - Lehnen Sie die Anfrage ab, wenn der Zeitstempel mehr als fünf Minuten alt ist, um wiederholte Anfragen zu blockieren.
Node.js:
const crypto = require('crypto');
function isValid(req, rawBody, secret) {
const ts = req.header('X-Ringhum-Timestamp');
const sig = req.header('X-Ringhum-Signature') || '';
const expected = 'v1=' + crypto.createHmac('sha256', secret).update(`${ts}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
return fresh && sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}
PHP:
$ts = $_SERVER['HTTP_X_RINGHUM_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_RINGHUM_SIGNATURE'] ?? '';
$expected = 'v1=' . hash_hmac('sha256', $ts . '.' . file_get_contents('php://input'), $secret);
if (! hash_equals($expected, $sig) || abs(time() - (int) $ts) > 300) {
http_response_code(400);
exit;
}
Antworten, Zeitüberschreitungen und Wiederholungen
- Antworten Sie mit einem beliebigen
2xx-Status, um die Zustellung zu bestätigen. Erledigen Sie langsame Arbeit erst, nachdem Sie geantwortet haben. - Ringhum wartet bis zu 10 Sekunden auf Ihre Antwort.
- Antwortet Ihr Endpunkt nicht mit einem
2xx, wird die Zustellung insgesamt bis zu 3-mal versucht: sofort, erneut nach etwa 10 Sekunden, und ein letztes Mal etwa 60 Sekunden später. Danach wird sie verworfen. - Zustellungen können außer der Reihe eintreffen. Nutzen Sie
created_atund die IDs indata, um sie zu ordnen.
Die Tabelle Webhooks zeigt für jeden Endpunkt den letzten HTTP-Status und wann er gesendet wurde. Ein fehlschlagender Endpunkt bleibt aktiv; Ringhum schaltet ihn nicht für Sie ab.
Testen, pausieren und entfernen
- Test senden sendet sofort ein
test.ping-Ereignis, und eine Meldung zeigt den HTTP-Status, den Ihr Endpunkt zurückgegeben hat. - Der Schalter Aktiv pausiert einen Endpunkt. Ereignisse, die während der Pause auftreten, werden nicht nachträglich gesendet.
- Entfernen löscht den Endpunkt und sein Geheimnis.
Häufige Fragen
Was ist der Unterschied zu den Apps Zapier, Make und n8n unter Integrationen? Diese Verbindungen nutzen die Seite Integrationen und ihre sechs Ereignistypen. Ihr Body ist {"event", "workspace", "sent_at", "data"}, und wenn Sie ein Geheimnis festlegen, ist der Signatur-Header X-Ringhum-Signature: sha256=…, ein HMAC-SHA256 allein aus dem Body. Die hier beschriebenen Entwickler-Webhooks decken mehr Ereignisse ab und verwenden die v1=-Signatur mit Zeitstempel. Siehe Auswählen, was gesendet wird.
Mein Endpunkt gibt 2xx zurück, aber mein Code sieht nichts. Prüfen Sie, ob das Ereignis für diesen Endpunkt angehakt ist, ob der Endpunkt aktiv ist, und ob Ihre Firewall Anfragen aus dem Internet zulässt.
Warum schlägt die Signaturprüfung fehl? Meist wurde der Body vor dem Hashing geparst und neu kodiert. Hashen Sie die rohen Bytes genau so, wie sie empfangen wurden.
← Zurück
API-Schlüssel und Berechtigungen
Weiter →
Verbinden Sie Ringhum mit Claude und anderen KI-Tools (MCP)
Ähnliche Artikel
API-Schlüssel und Berechtigungen
Erstellen und widerrufen Sie API-Schlüssel auf der Seite Entwickler, wählen Sie Lese- oder Schreibzugriff, und lernen Sie die Grundlagen der Ringhum-REST-API kennen - Basis-URL, Authentifizierung, Paginierung, Fehler und Rate Limits.
Verbinden Sie Ringhum mit Claude und anderen KI-Tools (MCP)
Fügen Sie Ringhum als Connector in Claude, ChatGPT, Cursor, VS Code und anderen KI-Apps hinzu, die das Model Context Protocol unterstützen, wählen Sie Nur-Lese- oder Lese-und-Änderungs-Zugriff, und trennen Sie eine App.
Auswählen, was gesendet wird
Legen Sie fest, welche Anrufe, Posteingangseinträge, Termine und Bestellungen jede verbundene App erhält, und beschränken Sie Anruf-Updates auf Anrufe, bei denen jemand handeln muss.
Eine App verbinden
Wie Sie Slack, Ihr CRM, Helpdesk, Aufgaben-Tool, Ihre Tabelle, Ihren Shop oder Kalender mit Ringhum verbinden, welche Art von Verbindung jede App verwendet, und wie Sie prüfen, dass es funktioniert.
Kommen Sie nicht weiter?
Schreiben Sie an [email protected] oder senden Sie uns eine Nachricht. Die Tarife Team und Scale erhalten bevorzugten Support.