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.

CampoValoriNota
campaign_typeannouncement, ivr, surveyannouncement 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_actionhangup, play, continueCosa fare quando risponde la segreteria telefonica
tts_template"Sayın {ad}, …"Variabili: {sayin}, {unvan}, {adi}, {ad}, {telefon} e fields i campi
statusdraft, queuedqueued se fornite, la campagna entra subito in coda
retry_count / retry_delay_minutesnumeroRichiamata per mancata risposta/occupato
thanks_tts_texttestoFrase 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 */ }