Webhookها

Buluthat نتایج را بدون اینکه منتظر پرسش شما بماند به نشانی شما POST می‌کند: نتیجه تماس‌های خودکار، خلاصه گفتگوی دستیار صوتی، وضعیت کد تأیید صوتی. همان پوشش، همان امضا، همان سیاست تکرار.

پوشش

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": { }
}
سرشناسهتوضیح
X-Buluthat-Eventنام رویداد
X-Buluthat-Deliveryشناسه تحویل؛ در تلاش‌های مجدد یکسان می‌ماند (به‌عنوان کلید idempotency استفاده کنید)
X-Buluthat-Signaturesha256= + امضای HMAC-SHA256 بدنه؛ در رکورد webhook_secret اگر داده شود ارسال می‌شود

تأیید امضا

امضا بدنه خام از روی محاسبه می‌شود؛ 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);

پاسخ و تکرار

گیرنده شما 2xx باید برگرداند؛ بدنه خوانده نمی‌شود. پردازش را در صف بگذارید و فوراً 200 برگشتن بهترین کار است (10 ثانیه مهلت).

2xx اگر نرسید تحویل با این فاصله‌ها دوباره تلاش می‌شود: 1 دقیقه، 5 دقیقه، 15 دقیقه، 1 ساعت، 3 ساعت، 6 ساعت. پس از تلاش ششم رها می‌شود و در پنل failed دیده می‌شود. یک رویداد ممکن است چند بار برسد؛ X-Buluthat-Delivery با آن تکرار را پالایش کنید.

رویدادها

تماس خودکار

رویدادچه زمانیdata
call_finishedتماس تمام شد، نتیجه قطعی است (برای هر شماره یک‌بار)results فیلدهای مشابه با: phone, external_id, status, dtmf, dtmf_label, amd_result, talk_seconds, custom_fields…
dtmfلحظه فشردن کلیدphone, external_id, digit, label
campaign_finishedهمه شماره‌ها تکمیل شدcampaign_id، اعداد خلاصه

در کمپین کدام رویدادها ارسال شود webhook_events انتخاب می‌شود (call_finished,dtmf).

دستیار صوتی

رویدادچه زمانیdata
session_endedگفتگو تمام شد، خلاصه تولید شدsession_id, bot_id, caller_number, direction, duration_seconds, summary, intent, sentiment_label, outcome, tools (ابزارهای فراخوانی‌شده)، task_id (اگر تماس مأموریتی بود) و فیلدهای نتیجه

نشانی Webhook دستیار و رمز آن در فرم دستیار تعریف می‌شود.

کد تأیید صوتی

رویدادچه زمانی
voice_otp.deliveredکد خوانده شد
voice_otp.verifiedکد تأیید شد
voice_otp.no_answer, voice_otp.busy, voice_otp.failed, voice_otp.expiredنتایج ناموفق

data به‌جای request کلید استفاده می‌شود: { "id", "status", "reference", "phone" }.

توصیه‌های امنیتی

  • فقط نشانی HTTPS بدهید؛ به نشانی با گواهی نادرست تحویل داده نمی‌شود.
  • webhook_secret همیشه تعریف کنید و امضا را تأیید کنید.
  • اگر می‌خواهید گیرنده را با IP محدود کنید، IP سرور پنل Buluthat را از مرکز پشتیبانی درخواست کنید.
  • داده بدنه رویداد را «داده» تلقی کنید نه «دستورالعمل»؛ متن گفته‌شده توسط تماس‌گیرنده در خلاصه‌ها می‌آید.