Webhooks
Buluthat sendet die Ergebnisse an Ihre Adresse, ohne dass Sie danach fragen müssen POST es werden übertragen: Auto-Call-Ergebnisse, Zusammenfassungen von Assistentengesprächen, Status von Sprach-Bestätigungscodes. Derselbe Umschlag, dieselbe Signatur, dieselbe Wiederholungsrichtlinie.
Umschlag
POST https://sizin-adresiniz/buluthat
Content-Type: application/json
X-Buluthat-Event: call_finished
X-Buluthat-Delivery: 4471
X-Buluthat-Signature: sha256=9f2b…
{
"event": "call_finished",
"sent_at": "2026-09-18T10:12:35+03:00",
"tenant_id": 1,
"data": { }
}
| Absenderkennung | Beschreibung |
|---|---|
X-Buluthat-Event | Ereignisname |
X-Buluthat-Delivery | Zustell-ID; bleibt bei Wiederholungen gleich (als Idempotenzschlüssel verwenden) |
X-Buluthat-Signature | sha256= + HMAC-SHA256-Signatur des Bodys; bei der Registrierung webhook_secret wird gesendet, wenn angegeben |
Signaturprüfung
Signatur Rohbody wird berechnet über; berechnen Sie nicht über erneut serialisiertes JSON.
$raw = file_get_contents('php://input');
$given = $_SERVER['HTTP_X_BULUTHAT_SIGNATURE'] ?? '';
$expect = 'sha256=' . hash_hmac('sha256', $raw, $secret);
if (!hash_equals($expect, $given)) { http_response_code(401); exit; }
$event = json_decode($raw, true);
// Node.js (express, raw body ile)
const crypto = require('crypto');
const expect = 'sha256=' + crypto.createHmac('sha256', secret).update(req.rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expect), Buffer.from(req.get('X-Buluthat-Signature') || ''))) return res.sendStatus(401);
Antwort und Wiederholung
Ihr Empfänger 2xx zurückgeben; der Body wird nicht gelesen. Reihen Sie die Verarbeitung ein und sofort 200 am sichersten ist es, zurückzugeben (10 Sek. Timeout).
2xx bleibt die Zustellung aus, wird in diesen Abständen erneut versucht: 1 Min., 5 Min., 15 Min., 1 Std., 3 Std., 6 Std.. Nach dem sechsten Versuch wird abgebrochen und im Panel failed erscheint als. Dasselbe Ereignis kann mehrfach eintreffen; X-Buluthat-Delivery filtern Sie Duplikate heraus mit.
Ereignisse
Auto-Call
| Ereignis | Wann | data |
|---|---|---|
call_finished | Anruf beendet, Ergebnis endgültig (einmal pro Nummer) | results dieselben Felder wie: phone, external_id, status, dtmf, dtmf_label, amd_result, talk_seconds, custom_fields… |
dtmf | Im Moment des Tastendrucks | phone, external_id, digit, label |
campaign_finished | Alle Nummern abgearbeitet | campaign_id, Übersichtszahlen |
Welche Ereignisse in der Kampagne gesendet werden webhook_events wird gewählt mit (call_finished,dtmf).
Sprachassistent
| Ereignis | Wann | data |
|---|---|---|
session_ended | Gespräch beendet, Zusammenfassung erstellt | session_id, bot_id, caller_number, direction, duration_seconds, summary, intent, sentiment_label, outcome, tools (aufgerufene Tools), task_id (bei Aufgabenanruf) und die Ergebnisfelder |
Webhook-Adresse und Geheimnis des Assistenten werden im Assistentenformular festgelegt.
Sprach-Bestätigungscode
| Ereignis | Wann |
|---|---|
voice_otp.delivered | Code vorgelesen |
voice_otp.verified | Code verifiziert |
voice_otp.no_answer, voice_otp.busy, voice_otp.failed, voice_otp.expired | Fehlgeschlagene Ergebnisse |
data statt request Schlüssel wird verwendet: { "id", "status", "reference", "phone" }.
Sicherheitsempfehlungen
- Geben Sie nur HTTPS-Adressen an; an Adressen mit fehlerhaftem Zertifikat wird nicht zugestellt.
webhook_secretimmer definieren und die Signatur verifizieren.- Wenn Sie den Empfänger per IP einschränken möchten, fordern Sie die IP des Buluthat-Panel-Servers über das Support-Center an.
- Verarbeiten Sie die Daten im Ereignis-Body als „Daten“, nicht als „Anweisung“; der vom Anrufer gesprochene Text kommt in Zusammenfassungen vor.
