تماس خودکار

برای فهرست شماره‌ها اعلان، IVR یا تماس نظرسنجی انجام می‌دهد؛ نتیجه و کلید فشرده‌شده را برمی‌گرداند. کلید یکپارچه‌سازی (bt_…، دامنه autocall).

نقطه: https://api.buluthat.com/api/autocall.php?action=<işlem>

جریان معمول:

1. media          -> anons id'sini al (ya da tts_template kullan)
2. trunks         -> çıkış hattının slug'ını al
3. create_campaign -> status "draft", digit_labels ile anket seçenekleri
4. add_leads      -> numaraları partiler hâlinde gönder
5. start          -> kampanyayı kuyruğa al
6. webhook        -> sonuçlar size gelsin (ya da results ile çekin)
7. summary        -> tuş dağılımı

GETping · media · trunks · caller_ids

GET https://api.buluthat.com/api/autocall.php?action=ping
GET https://api.buluthat.com/api/autocall.php?action=media       → [{ "id": 12, "name": "Hatırlatma anonsu" }]
GET https://api.buluthat.com/api/autocall.php?action=trunks      → çıkış hatları (slug)
GET https://api.buluthat.com/api/autocall.php?action=caller_ids  → kullanılabilir arayan numaralar

POSTcreate_campaign

curl -X POST "https://api.buluthat.com/api/autocall.php?action=create_campaign" \
  -H "Authorization: Bearer bt_xxx" -H "Content-Type: application/json" \
  -d '{
    "name": "Randevu hatırlatma",
    "campaign_type": "survey",
    "trunk_slug": "hat-1",
    "caller_id": "02124119610",
    "tts_enabled": true,
    "tts_template": "Merhaba {sayin}, {randevu} randevunuzu hatırlatmak için aradık. Geliyorsanız 1, iptal için 2.",
    "digit_labels": { "1": "Geliyorum", "2": "İptal" },
    "digit_destinations": { "9": "queue:4" },
    "start_time": "09:00", "end_time": "18:00",
    "weekdays": ["mon","tue","wed","thu","fri"],
    "max_channels": 3, "ring_timeout_seconds": 30,
    "retry_count": 1, "retry_delay_minutes": 30,
    "amd_enabled": true, "amd_action": "hangup",
    "webhook_url": "https://ornek.com/buluthat/sonuc",
    "webhook_secret": "gizli",
    "webhook_events": "call_finished,dtmf",
    "status": "draft",
    "leads": [ { "phone": "05551112233", "name": "Ahmet Yılmaz", "external_id": "CRM-1", "fields": { "randevu": "12 Eylül 14:00" } } ]
  }'

الزامی: name, trunk_slug و media_file_id یا tts_template. اگر هر دو داده شوند، ابتدا صدای شخصی‌سازی‌شده و سپس اعلان آماده پخش می‌شود.

حوزهمقادیریادداشت
campaign_typeannouncement, ivr, surveyannouncement اعلان را پخش می‌کند و قطع می‌کند، منتظر کلید نمی‌ماند
digit_labels{"1":"Evet"}برای نظرسنجی پر کنید. کلیدی که برچسب دارد، حتی بدون مقصد ثبت می‌شود
digit_destinations{"9":"queue:4"}کسی که کلید را فشار دهد منتقل می‌کند: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup
amd_actionhangup, play, continueوقتی به پیام‌گیر برسد چه کار شود
tts_template"Sayın {ad}, …"متغیرها: {sayin}, {unvan}, {adi}, {ad}, {telefon} و fields فیلدهای
statusdraft, queuedqueued اگر بدهید کمپین فوراً وارد صف می‌شود
retry_count / retry_delay_minutesعددتماس مجدد برای بی‌پاسخ/مشغول
thanks_tts_textمتنجمله تشکر پس از فشردن کلید در نظرسنجی

پاسخ: { "ok": true, "data": { "id": 7, "status": "draft", … } }

POSTupdate_campaign

به‌روزرسانی جزئی؛ فقط فیلدهای ارسال‌شده تغییر می‌کنند. status ارسال نکنید (کمپین در حال اجرا را از کار می‌اندازد)؛ برای وضعیت start/pause/cancel استفاده کنید.

{ "campaign_id": 7, "max_channels": 5, "retry_count": 2 }

POSTadd_leads

حداکثر 5.000 رکورد در یک درخواست. در همان کمپین همان شماره دوباره افزوده نمی‌شود (duplicate).

{ "campaign_id": 7, "leads": [ { "phone": "05551112233", "name": "Ahmet Yılmaz", "external_id": "CRM-1", "fields": { "borc": "1.240 TL" } } ] }

قالب کوتاه: { "campaign_id": 7, "phones": ["05551112233", "05551112234"] }

پاسخ: { "inserted": 2, "duplicate": 0, "invalid": 0 }

POSTrequeue_leads

شماره‌هایی که قبلاً شماره‌گیری شده‌اند را دوباره در صف قرار می‌دهد (calls صفر می‌شود، کلید فشرده‌شده پاک می‌شود). به شماره‌ای که از قبل منتظر است دست نمی‌زند (skipped). در یادآوری وصول مطالبات، به‌جای اعتماد به کلید «پرداخت کردم»، از آن برای تماس مجدد بر اساس سابقه خودتان استفاده کنید.

{ "campaign_id": 7, "phones": ["05551112233"] }

POSTstart · pause · cancel

{ "campaign_id": 7 }

start کمپین را در صف قرار می‌دهد؛ تماس در بازه روز/ساعت شروع می‌شود. اگر به کمپین تکمیل‌شده شماره اضافه کنید کمپین خودکار دوباره باز می‌شود.

GETresults

نتیجه به تفکیک شماره. limit (پیش‌فرض 200، حداکثر 1000)، offset؛ فیلترها status, dtmf, phone.

GET https://api.buluthat.com/api/autocall.php?action=results&campaign_id=7&dtmf=1
{
  "ok": true, "total": 512, "limit": 200, "offset": 0,
  "data": [ {
    "campaign_id": 7, "lead_id": 91, "external_id": "CRM-1",
    "phone": "05551112233", "name": "Ahmet Yılmaz",
    "status": "answered", "attempts": 1,
    "dtmf": "1", "dtmf_label": "Geliyorum", "dtmf_all": ["1"],
    "amd_result": "HUMAN", "duration_seconds": 34, "talk_seconds": 22,
    "hangup_cause": "ANSWERED",
    "started_at": "2026-09-04 10:12:03", "answered_at": "2026-09-04 10:12:11", "ended_at": "2026-09-04 10:12:33",
    "custom_fields": { "randevu": "12 Eylül 14:00" }
  } ]
}

وضعیت‌ها: pending, calling, answered, machine, no_answer, busy, failed, cancelled.

GETsummary

{ "ok": true, "data": {
  "total": 512, "answered": 388, "pressed": 301, "machine": 44,
  "answer_rate": 75.8, "press_rate": 77.6, "talk_seconds": 8624, "avg_talk_seconds": 22,
  "digits": [ { "digit": "1", "label": "Geliyorum", "total": 214, "percent": 55.2 }, { "digit": "2", "label": "İptal", "total": 87, "percent": 22.4 } ]
} }

GETevents

گزارش رویدادهای کمپین (originate، answered، amd، dtmf، cdr، error) — برای عیب‌یابی.

Webhook

webhook_url اگر تعریف شده باشد Buluthat نتیجه را به شما POST می‌کند. رویدادها: call_finished (برای هر شماره یک‌بار)، dtmf (لحظه فشردن کلید)، campaign_finished. هدرها X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret اگر داده شود). بدنه results همان فیلدها را دارد. برای تأیید امضا و سیاست تکرار رجوع شود به Webhookها.

اعلان شخصی‌سازی‌شده و هزینه

قالب به تکه‌های ثابت و متغیر تقسیم می‌شود؛ جمله ثابت در فهرست هزار نفره یک‌بار صداگذاری می‌شود، همان {tutar} مقدار دوباره تولید نمی‌شود (صرفه‌جویی اندازه‌گیری‌شده ٪97,9). مقادیر متغیرها را با قالب استاندارد ارسال کنید ("1.000 TL" همیشه یکسان نوشته شود). تفکیک آقا/خانم از روی نام خودکار است؛ در نام‌های مشترک عنوان خالی می‌ماند.

کلاینت PHP

از تب پنل > تماس خودکار > API دانلود شده buluthat-autocall-client.php:

require_once 'buluthat-autocall-client.php';
$bt = new BuluthatAutoCall('https://api.buluthat.com', 'bt_xxx');
$k = $bt->createCampaign(['name' => 'Ödeme hatırlatma', 'campaign_type' => 'survey', 'trunk_slug' => 'hat-1',
    'tts_enabled' => true, 'tts_template' => 'Merhaba {sayin}, {tutar} tutarındaki ödemenizi hatırlatmak için aradık. Ödediyseniz 1, ödemediyseniz 2.',
    'digit_labels' => ['1' => 'Ödedim', '2' => 'Ödemedim'], 'webhook_url' => 'https://crm.example.com/buluthat-sonuc.php']);
$bt->addLeads($k['id'], [['phone' => '05551112233', 'name' => 'Burak Yılmaz', 'external_id' => 'CARI-451', 'fields' => ['tutar' => '1.000 TL']]]);
$bt->start($k['id']);

// webhook tarafı
$olay = BuluthatAutoCall::readWebhook($secret);   // imzayı doğrular
if ($olay['event'] === 'call_finished' && $olay['data']['dtmf'] === '1') { /* ödedim dedi */ }