Auto-Call

Ruft eine Rufnummernliste mit Ansage, IVR oder Umfrage an; liefert das Ergebnis und die Tastenwahl zurück. Integrationsschlüssel (bt_…, Geltungsbereich autocall).

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

Typischer Ablauf:

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

Pflicht: name, trunk_slug und media_file_id oder tts_template. Werden beide angegeben, wird zuerst die personalisierte Stimme, dann die vorgefertigte Ansage abgespielt.

FeldWerteNotiz
campaign_typeannouncement, ivr, surveyannouncement spielt die Ansage ab und legt auf, wartet nicht auf Tasten
digit_labels{"1":"Evet"}Für die Umfrage ausfüllen. Eine Taste mit Beschriftung wird auch ohne Ziel erfasst
digit_destinations{"9":"queue:4"}Leitet die Person weiter, die die Taste gedrückt hat: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup
amd_actionhangup, play, continueWas bei Erreichen eines Anrufbeantworters geschieht
tts_template"Sayın {ad}, …"Variablen: {sayin}, {unvan}, {adi}, {ad}, {telefon} und fields Felder
statusdraft, queuedqueued wenn Sie es angeben, wird die Kampagne sofort eingereiht
retry_count / retry_delay_minutesZahlWiederholter Anruf bei Nichtannahme/Besetzt
thanks_tts_textTextDankesansage nach der Umfrage-Tastenabfrage

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

POSTupdate_campaign

Teilaktualisierung; nur gesendete Felder ändern sich. status nicht senden (das würde die laufende Kampagne beenden); für den Status start/pause/cancel verwenden.

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

POSTadd_leads

Höchstens 5.000 Einträge pro Anfrage. Dieselbe Nummer wird in derselben Kampagne nicht zweimal hinzugefügt (duplicate).

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

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

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

POSTrequeue_leads

Stellt bereits angerufene Nummern erneut in die Warteschlange (calls wird zurückgesetzt, die Tastenwahl gelöscht). Eine bereits wartende Nummer wird nicht angerührt (skipped). Verlassen Sie sich bei Zahlungserinnerungen nicht auf die Taste „Ich habe bezahlt“, sondern nutzen Sie dies, um anhand Ihrer eigenen Daten erneut anzurufen.

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

POSTstart · pause · cancel

{ "campaign_id": 7 }

start stellt die Kampagne in die Warteschlange; die Anrufe starten innerhalb des Tages-/Uhrzeitfensters. Fügen Sie einer abgeschlossenen Kampagne Nummern hinzu, wird sie automatisch wieder geöffnet.

GETresults

Ergebnis je Rufnummer. limit (Standard 200, höchstens 1000), offset; Filter 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" }
  } ]
}

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

Ereignisprotokoll der Kampagne (originate, answered, amd, dtmf, cdr, error) — zur Diagnose.

Webhook

webhook_url Ist es definiert, sendet Buluthat das Ergebnis per POST an Sie. Ereignisse: call_finished (einmal pro Nummer), dtmf (im Moment des Tastendrucks), campaign_finished. Header X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret wenn angegeben). Body results trägt dieselben Felder wie. Zu Signaturprüfung und Wiederholungsrichtlinie siehe Webhooks.

Personalisierte Ansage und Kosten

Die Vorlage wird in feste und variable Teile zerlegt; der feste Satz wird in einer Liste mit tausend Personen einmal vertont, das Gleiche {tutar} Der Wert wird kein zweites Mal erzeugt (gemessene Einsparung %97,9). Senden Sie die Variablenwerte im Standardformat ("1.000 TL" immer gleich geschrieben). Die Unterscheidung Herr/Frau erfolgt automatisch anhand des Namens; bei Unisex-Namen bleibt die Anrede leer.

PHP-Client

Unter Panel > Auto-Call > Reiter API heruntergeladene 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 */ }