تماس خودکار
برای فهرست شمارهها اعلان، 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_type | announcement, ivr, survey | announcement اعلان را پخش میکند و قطع میکند، منتظر کلید نمیماند |
digit_labels | {"1":"Evet"} | برای نظرسنجی پر کنید. کلیدی که برچسب دارد، حتی بدون مقصد ثبت میشود |
digit_destinations | {"9":"queue:4"} | کسی که کلید را فشار دهد منتقل میکند: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup |
amd_action | hangup, play, continue | وقتی به پیامگیر برسد چه کار شود |
tts_template | "Sayın {ad}, …" | متغیرها: {sayin}, {unvan}, {adi}, {ad}, {telefon} و fields فیلدهای |
status | draft, queued | queued اگر بدهید کمپین فوراً وارد صف میشود |
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 */ }
