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.
| Feld | Werte | Notiz |
|---|---|---|
campaign_type | announcement, ivr, survey | announcement 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_action | hangup, play, continue | Was bei Erreichen eines Anrufbeantworters geschieht |
tts_template | "Sayın {ad}, …" | Variablen: {sayin}, {unvan}, {adi}, {ad}, {telefon} und fields Felder |
status | draft, queued | queued wenn Sie es angeben, wird die Kampagne sofort eingereiht |
retry_count / retry_delay_minutes | Zahl | Wiederholter Anruf bei Nichtannahme/Besetzt |
thanks_tts_text | Text | Dankesansage 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 */ }
