Automatisch bellen

Laat de nummerlijst een aankondiging, IVR of enquête bellen; geeft het resultaat en de toetsinvoer terug. Integratiesleutel (bt_…, bereik autocall).

Endpoint: https://api.buluthat.com/api/autocall.php?action=<işlem>

Typische flow:

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

Verplicht: name, trunk_slug en media_file_id of tts_template. Als beide worden opgegeven, wordt eerst het gepersonaliseerde geluid afgespeeld, daarna de kant-en-klare aankondiging.

VeldWaardenNotitie
campaign_typeannouncement, ivr, surveyannouncement speelt de aankondiging af en hangt op, wacht niet op een toets
digit_labels{"1":"Evet"}Invullen voor een enquête. Een toets met een label wordt geregistreerd, ook zonder bestemming
digit_destinations{"9":"queue:4"}Verbindt wie een toets indrukt door: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup
amd_actionhangup, play, continueWat te doen als het antwoordapparaat opneemt
tts_template"Sayın {ad}, …"Variabelen: {sayin}, {unvan}, {adi}, {ad}, {telefon} en fields velden
statusdraft, queuedqueued geeft u dit op, dan komt de campagne direct in de rij
retry_count / retry_delay_minutesaantalOpnieuw bellen bij geen gehoor/bezet
thanks_tts_texttekstBedankzin na de toetsinvoer van de enquête

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

POSTupdate_campaign

Gedeeltelijke update; alleen de verzonden velden veranderen. status niet meesturen (het laat een lopende campagne vallen); voor de status start/pause/cancel gebruik.

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

POSTadd_leads

Maximaal 5.000 records per verzoek. Hetzelfde nummer wordt in dezelfde campagne niet twee keer toegevoegd (duplicate).

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

Korte notatie: { "campaign_id": 7, "phones": ["05551112233", "05551112234"] }

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

POSTrequeue_leads

Zet eerder gebelde nummers opnieuw in de rij (calls wordt gereset, de toetsinvoer gewist). Een nummer dat al wacht wordt niet aangeraakt (skipped). Gebruik dit bij betalingsherinneringen om, in plaats van op de toets "ik heb betaald" te vertrouwen, opnieuw te bellen op basis van uw eigen administratie.

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

POSTstart · pause · cancel

{ "campaign_id": 7 }

start zet de campagne in de rij; het bellen begint binnen het dag-/tijdvenster. Voegt u nummers toe aan een afgeronde campagne, dan wordt de campagne automatisch heropend.

GETresults

Resultaat per nummer. limit (standaard 200, maximaal 1000), offset; filters 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" }
  } ]
}

Statussen: 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

Gebeurtenislogboek van de campagne (originate, answered, amd, dtmf, cdr, error) — voor diagnose.

Webhook

webhook_url is het ingesteld, dan stuurt Buluthat het resultaat naar u. Gebeurtenissen: call_finished (eenmaal per nummer), dtmf (op het moment van de toetsdruk), campaign_finished. Headers X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret indien opgegeven). Body results heeft dezelfde velden als. Zie voor handtekeningverificatie en herhaalbeleid Webhooks.

Gepersonaliseerde aankondiging en kosten

Het sjabloon wordt in vaste en variabele delen gesplitst; de vaste zin wordt in een lijst van duizend personen eenmaal ingesproken, dezelfde {tutar} dezelfde waarde wordt niet twee keer gegenereerd (gemeten besparing %97,9). Stuur variabele waarden in een standaardformaat ("1.000 TL" altijd hetzelfde geschreven). De keuze tussen meneer/mevrouw gebeurt automatisch op basis van de naam; bij unisex namen blijft de aanspreektitel leeg.

PHP-client

Gedownload via Paneel > Automatisch bellen > tabblad 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 */ }