Avtomatik Zəng

Nömrə siyahısına anons, IVR ya da sorğu zəngi etdirir; nəticəni və düymələməni geri verir. İnteqrasiya açarı (bt_…, əhatə autocall).

Nöqtə: https://api.buluthat.com/api/autocall.php?action=<işlem>

Tipik axın:

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" } } ]
  }'

Məcburi: name, trunk_slug və media_file_id ya da tts_template. İkisi birlikdə verilərsə əvvəlcə şəxsi səs, sonra hazır anons çalınır.

SahəDəyərlərQeyd
campaign_typeannouncement, ivr, surveyannouncement anonsu çalır bağlayır, düymə gözləmir
digit_labels{"1":"Evet"}Sorğu üçün doldurun. Etiketi olan düymə, hədəfi olmasa da qeyd edilir
digit_destinations{"9":"queue:4"}Düyməyə basanı yönləndirir: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup
amd_actionhangup, play, continueAvtocavabverənə düşəndə nə ediləcəyi
tts_template"Sayın {ad}, …"Dəyişənlər: {sayin}, {unvan}, {adi}, {ad}, {telefon} və fields sahələri
statusdraft, queuedqueued versəniz kampaniya dərhal növbəyə girir
retry_count / retry_delay_minutessayCavabsız/məşğul üçün təkrar zəng
thanks_tts_textmətnSorğu düymələndikdən sonra təşəkkür cümləsi

Cavab: { "ok": true, "data": { "id": 7, "status": "draft", … } }

POSTupdate_campaign

Qismən yeniləmə; yalnız göndərilən sahələr dəyişir. status göndərməyin (işləyən kampaniyanı düşürür); vəziyyət üçün start/pause/cancel istifadə edin.

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

POSTadd_leads

Tək sorğuda ən çox 5.000 qeyd. Eyni kampaniyada eyni nömrə ikinci dəfə əlavə edilmir (duplicate).

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

Qısa format: { "campaign_id": 7, "phones": ["05551112233", "05551112234"] }

Cavab: { "inserted": 2, "duplicate": 0, "invalid": 0 }

POSTrequeue_leads

Əvvəl zəng edilmiş nömrələri yenidən növbəyə alır (calls sıfırlanır, düymələmə təmizlənir). Artıq gözləyən nömrəyə toxunulmur (skipped). Ödəniş xatırlatmasında "ödədim" düyməsinə etibar etmək əvəzinə öz qeydinizə görə yenidən zəng etmək üçün istifadə edin.

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

POSTstart · pause · cancel

{ "campaign_id": 7 }

start kampaniyanı növbəyə alır; zəng gün/saat pəncərəsi daxilində başlayır. Tamamlanmış kampaniyaya nömrə əlavə etsəniz kampaniya avtomatik yenidən açılır.

GETresults

Nömrə üzrə nəticə. limit (defolt 200, ən çox 1000), offset; filtrlər 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" }
  } ]
}

Vəziyyətlər: 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

Kampaniya hadisə jurnalı (originate, answered, amd, dtmf, cdr, error) — diaqnostika üçün.

Webhook

webhook_url təyin edilibsə Buluthat nəticəni sizə POST edir. Hadisələr: call_finished (nömrə başına bir dəfə), dtmf (düyməyə basıldığı anda), campaign_finished. Başlıqlar X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret verilibsə). Gövdə results ilə eyni sahələri daşıyır. İmza doğrulama və təkrar siyasəti üçün bax Webhook-lar.

Şəxsi anons və xərc

Şablon sabit və dəyişən hissələrə bölünür; sabit cümlə minlik siyahıda bir dəfə səsləndirilir, eyni {tutar} dəyəri ikinci dəfə yaradılmır (ölçülən qənaət %97,9). Dəyişən dəyərləri standart formatda göndərin ("1.000 TL" həmişə eyni yazılsın). Bəy/Xanım ayrımı addan avtomatikdir; unisex adlarda titul boş buraxılır.

PHP klienti

Panel > Avtomatik Zəng > API tabından endirilən 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 */ }