Llamadas automáticas

Hace llamadas con locución, IVR o encuesta a la lista de números; devuelve el resultado y la pulsación. Clave de integración (bt_…, alcance autocall).

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

Flujo típico:

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

Obligatorio: name, trunk_slug y media_file_id o tts_template. Si se indican ambos, primero se reproduce la voz personalizada y luego la locución predefinida.

CampoValoresNota
campaign_typeannouncement, ivr, surveyannouncement reproduce la locución y cuelga, no espera teclas
digit_labels{"1":"Evet"}Complete para la encuesta. La tecla con etiqueta se registra aunque no tenga destino
digit_destinations{"9":"queue:4"}Transfiere a quien pulsa la tecla: ext:1001, queue:4, ivr:2, flow:3, repeat, hangup
amd_actionhangup, play, continueQué hacer si cae en el buzón de voz
tts_template"Sayın {ad}, …"Variables: {sayin}, {unvan}, {adi}, {ad}, {telefon} y fields campos
statusdraft, queuedqueued si lo indica, la campaña entra en cola de inmediato
retry_count / retry_delay_minutesnúmeroNueva llamada si no contesta / ocupado
thanks_tts_texttextoFrase de agradecimiento tras la pulsación de la encuesta

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

POSTupdate_campaign

Actualización parcial; solo cambian los campos enviados. status no envíe (tumba la campaña en curso); para el estado start/pause/cancel utilice.

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

POSTadd_leads

Máximo 5.000 registros por solicitud. El mismo número no se agrega por segunda vez en la misma campaña (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"] }

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

POSTrequeue_leads

Vuelve a poner en cola los números llamados anteriormente (calls se restablece, se borra la pulsación). No se toca el número que ya está en espera (skipped). En un recordatorio de cobro, en lugar de fiarse de la tecla "ya pagué", úselo para volver a llamar según su propio registro.

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

POSTstart · pause · cancel

{ "campaign_id": 7 }

start pone la campaña en cola; la llamada empieza dentro de la ventana de día/hora. Si agrega números a una campaña completada, la campaña se reabre automáticamente.

GETresults

Resultado por número. limit (por defecto 200, máximo 1000), offset; filtros 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" }
  } ]
}

Estados: 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 de eventos de la campaña (originate, answered, amd, dtmf, cdr, error) — para diagnóstico.

Webhook

webhook_url si está definido, Buluthat le envía el resultado por POST. Eventos: call_finished (una vez por número), dtmf (en el momento en que se pulsa la tecla), campaign_finished. Encabezados X-Buluthat-Event, X-Buluthat-Delivery, X-Buluthat-Signature: sha256=… (webhook_secret si se indica). Cuerpo results lleva los mismos campos que. Para la verificación de firma y la política de reintentos, véase Webhooks.

Locución personalizada y costo

La plantilla se divide en fragmentos fijos y variables; la frase fija se locuta una sola vez en una lista de mil personas, el mismo {tutar} el valor no se genera por segunda vez (ahorro medido: %97,9). Envíe los valores de las variables en formato estándar ("1.000 TL" que siempre se escriba igual). La distinción Sr./Sra. se hace automáticamente según el nombre; en nombres unisex se deja el tratamiento en blanco.

Cliente PHP

Descargado desde Panel > Llamadas automáticas > pestaña 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 */ }