自动外呼
向号码列表拨打语音提示、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 */ }
