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": { }
}
AbsenderkennungBeschreibung
X-Buluthat-EventEreignisname
X-Buluthat-DeliveryZustell-ID; bleibt bei Wiederholungen gleich (als Idempotenzschlüssel verwenden)
X-Buluthat-Signaturesha256= + 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

EreignisWanndata
call_finishedAnruf beendet, Ergebnis endgültig (einmal pro Nummer)results dieselben Felder wie: phone, external_id, status, dtmf, dtmf_label, amd_result, talk_seconds, custom_fields…
dtmfIm Moment des Tastendrucksphone, external_id, digit, label
campaign_finishedAlle Nummern abgearbeitetcampaign_id, Übersichtszahlen

Welche Ereignisse in der Kampagne gesendet werden webhook_events wird gewählt mit (call_finished,dtmf).

Sprachassistent

EreignisWanndata
session_endedGespräch beendet, Zusammenfassung erstelltsession_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

EreignisWann
voice_otp.deliveredCode vorgelesen
voice_otp.verifiedCode verifiziert
voice_otp.no_answer, voice_otp.busy, voice_otp.failed, voice_otp.expiredFehlgeschlagene 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_secret immer 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.