Chiamata automatica
Fa effettuare ad annunci, IVR o sondaggi una lista di numeri; restituisce risultato e digitazione. Chiave di integrazione (bt_…, ambito autocall).
Endpoint: https://api.buluthat.com/api/autocall.php?action=<işlem>
Flusso tipico:
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" } } ]
}'
Obbligatorio: name, trunk_slug e media_file_id oppure tts_template. Se vengono indicati entrambi, viene riprodotto prima l'audio personalizzato, poi l'annuncio predefinito.
| Campo | Valori | Nota |
|---|---|---|
campaign_type | announcement, ivr, survey | announcement riproduce l'annuncio e chiude, non attende tasti |
digit_labels | {"1":"Evet"} | Compilare per il sondaggio. Il tasto con etichetta viene registrato anche se non ha una destinazione |
digit_destinations | {"9":"queue:4"} | Trasferisce chi ha premuto il tasto: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup |
amd_action | hangup, play, continue | Cosa fare quando risponde la segreteria telefonica |
tts_template | "Sayın {ad}, …" | Variabili: {sayin}, {unvan}, {adi}, {ad}, {telefon} e fields i campi |
status | draft, queued | queued se fornite, la campagna entra subito in coda |
retry_count / retry_delay_minutes | numero | Richiamata per mancata risposta/occupato |
thanks_tts_text | testo | Frase di ringraziamento dopo la digitazione del sondaggio |
Risposta: { "ok": true, "data": { "id": 7, "status": "draft", … } }
POSTupdate_campaign
Aggiornamento parziale; cambiano solo i campi inviati. status non inviate (fa cadere la campagna in corso); per lo stato start/pause/cancel usate.
{ "campaign_id": 7, "max_channels": 5, "retry_count": 2 }
POSTadd_leads
Al massimo 5.000 record per richiesta. Nella stessa campagna lo stesso numero non viene aggiunto due volte (duplicate).
{ "campaign_id": 7, "leads": [ { "phone": "05551112233", "name": "Ahmet Yılmaz", "external_id": "CRM-1", "fields": { "borc": "1.240 TL" } } ] }
Forma breve: { "campaign_id": 7, "phones": ["05551112233", "05551112234"] }
Risposta: { "inserted": 2, "duplicate": 0, "invalid": 0 }
POSTrequeue_leads
Rimette in coda i numeri già chiamati (calls azzerata, digitazione cancellata). Il numero già in attesa non viene toccato (skipped). Nei solleciti di pagamento, invece di fidarsi del tasto "ho pagato", lo si usa per richiamare in base ai Suoi registri.
{ "campaign_id": 7, "phones": ["05551112233"] }
POSTstart · pause · cancel
{ "campaign_id": 7 }
start mette in coda la campagna; la chiamata parte entro la fascia giorno/ora. Se aggiungete numeri a una campagna completata, la campagna si riapre automaticamente.
GETresults
Risultato per numero. limit (predefinito 200, massimo 1000), offset; filtri 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" }
} ]
}
Stati: 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
Registro degli eventi della campagna (originate, answered, amd, dtmf, cdr, error) — per la diagnosi.
Webhook
webhook_url se è definito, Buluthat Le invia il risultato in POST. Eventi: call_finished (una volta per numero), dtmf (nel momento in cui viene premuto il tasto), campaign_finished. Intestazioni X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret se indicato). Corpo results ha gli stessi campi di. Per la verifica della firma e la politica di ripetizione vedi Webhook.
Annuncio personalizzato e costi
Il modello viene suddiviso in parti fisse e variabili; la frase fissa viene sintetizzata una sola volta in una lista di mille persone, lo stesso {tutar} il valore non viene prodotto una seconda volta (risparmio misurato %97,9). Inviate i valori delle variabili in formato standard ("1.000 TL" venga scritto sempre allo stesso modo). La distinzione Sig./Sig.ra è automatica dal nome; per i nomi unisex il titolo resta vuoto.
Client PHP
Scaricato da Pannello > Chiamata automatica > scheda 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 */ }
