Public APIArama Başlatma

Arama Başlatma — POST /calls

Bir CRM’e yeni lead düştüğünde tek bir POST isteğiyle yapay zeka asistanın o numarayı saniyeler içinde arayabilir — kontak yoksa otomatik açılır, asistan konuşur, görüşme faturalandırılır. Bu uç, Purvisor AI Public API’nin çekirdek yazma aksiyonudur; Zapier ve Make’teki “Arama Başlat” adımı da tam olarak bunu çağırır. Bir düşün: reklamdan gelen lead’i elle aramak yerine, form gönderilir gönderilmez asistanın devreye girer.

Bu uç anında arama yapar; kadans/kampanya zamanlaması uygulamaz. Zamana yayılmış çok adımlı takip için Kadans Nedir? veya Kampanya Oluşturma tarafını kullan.

İstek

POST /api/v1/calls
X-API-Key: pk_live_...
Content-Type: application/json

Kimlik doğrulama tüm /api/v1/* uçlarında olduğu gibi API anahtarıyla yapılır. Anahtarı nasıl alacağın ve gönderme biçimleri için Kimlik Doğrulama sayfasına bak.

Gövde alanları

İstek gövdesi hem snake_case hem camelCase kabul eder (örn. assistant_id veya assistantId).

AlanZorunluAçıklama
phoneEvetAranacak numara. En az 10 hane içermeli (rakam dışı karakterler yok sayılır).
assistant_idEvetAramayı yapacak asistanın id’si. Bu hesaba ait ve aktif olmalı. Listeyi GET /assistants ile çek.
phone_number_idHayırArayan numara (caller-ID). Verilmezse hesaptaki ilk aktif numara kullanılır. Verilirse hesaba ait ve aktif olmalı.
first_nameHayırKontak yoksa oluşturulurken kullanılır. Boşsa "Müşteri" yazılır.
last_nameHayırKontak yoksa oluşturulurken kullanılır.

Numarayı elle vermek yerine phone_number_id alanını GET /phone-numbers çıktısındaki bir id ile besle — böylece hangi hattan çıktığını kontrol edersin.

curl örneği

curl -X POST https://app.purvisor.ai/api/v1/calls \
  -H "X-API-Key: pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+905321234567",
    "assistant_id": "asst_abc123",
    "phone_number_id": "42",
    "first_name": "Ayşe",
    "last_name": "Yılmaz"
  }'

İşleyiş ve kapılar

Uç, kanıtlanmış kampanya makinesini (oda metadata + SIP + agent dispatch + faturalama) yeniden kullanır. Arama gerçekleşmeden önce sırayla şu kapılardan geçilir:

POST /calls

Gövde doğrulama (phone + assistant_id, ≥10 hane)   → 400

Asistan sahipliği (bu hesaba ait + aktif mi?)       → 404

Arayan numara (verilen ait+aktif mi / ilk aktif)    → 404

Aranan ülkenin YASAL arama penceresi açık mı?       → 422

Dakika bakiyesi ≥ 1                                 → 402

Kontağı bul (telefonla dedupe) — yoksa oluştur

Gizli "zapier-auto" kampanyası (asistan+numara başına)

Devam eden arama var mı? (çift arama koruması)       → 409

makeCall → arama başlar                              → 502 (başarısızsa)

201 { call_id, status: "initiated", ... }

Gizli kampanya mekaniği. Arama, (asistan, numara) çifti başına oluşturulan gizli bir kampanya altında yürür — description="zapier-auto", status="completed", isActive=false. Bu bayraklar sayesinde zamanlayıcılar ve kampanya worker’ı bu kampanyaya dokunmaz; panelindeki normal kampanya raporlarını kirletmez. Sen bir şey yapmana gerek yok, otomatik yönetilir.

Kontak eşleştirmesi POST /contacts ile aynı mantıkla çalışır: tam numara veya son 10 hane eşleşmesi. Eşleşen kontak yoksa yenisi leadSource="zapier", status="new" ile açılır.

⚠️

Aynı kişiye devam eden bir API araması varken ikinci istek atarsan HTTP 409 dönersin — çift arama böyle engellenir. Bir Zap’i yanlışlıkla iki kez tetiklersen ikinci çağrı sessizce yeni arama başlatmaz.

Başarılı yanıt

Arama başlatıldığında HTTP 201 ve şu gövde döner:

{
  "call_id": "1287",
  "status": "initiated",
  "contact_id": "9043",
  "assistant_id": "asst_abc123",
  "from_number": "+904440000",
  "to": "+905321234567"
}
AlanAçıklama
call_idBaşlatılan aramanın id’si. Görüşme bitince call.completed webhook’unda bu değerle eşleşir.
statusHer zaman "initiated" — arama kuyruğa alındı, henüz bağlanma sonucu değil.
contact_idAranan kontağın id’si (bulunan veya yeni oluşturulan).
assistant_idİstekte gönderdiğin asistan id’si.
from_numberAramanın çıktığı numara (caller-ID).
toKontağın kayıtlı telefon numarası.
warningYalnızca arama senin kendi çalışma saatlerinin dışında başlatıldıysa: "outside_your_business_hours". Arama yine yapılır — ama yanlışlıkla gece çalışan bir Zap’i ancak böyle fark edersin.

Arama saatleri

Arama, aranan kişinin ülkesindeki yasal arama penceresi dışındaysa başlatılmaz: HTTP 422 ve code: "outside_legal_call_window" döner. Yanıttaki next_allowed_at (ISO-8601), pencerenin yeniden açılacağı ilk anı verir — Zap’ini o zamana kadar geciktirmek için doğrudan kullanabilirsin.

{
  "error": "Calling is outside the legally permitted hours for the destination country. Retry after next_allowed_at.",
  "code": "outside_legal_call_window",
  "country_code": "TR",
  "next_allowed_at": "2026-08-19T06:00:00.000Z"
}

Senin çalışma saatlerin aramayı engellemez. Ayarlardaki çalışma saati penceresi kampanya zamanlamasını yönetir; API’yi çağırdığında bilinçli olarak “şimdi ara” demiş olursun, o yüzden arama yapılır ve yanıta yalnızca warning: "outside_your_business_hours" eklenir. Sert kapı yalnızca aranan ülkenin yasal penceresidir (TR için 09:00–19:00).

status: "initiated" “telefon çaldı/açıldı” demek değildir; sadece aramanın başarıyla kuyruğa alındığını bildirir. Görüşmenin sonucunu (süre, özet, duygu) öğrenmek için call.completed webhook’una abone ol — bkz. Webhook’lar.

Hata kodları

KodGövde (error)Neden
400invalid_jsonGövde geçerli JSON değil.
400phone and assistant_id are requiredZorunlu alanlardan biri eksik.
400Invalid phone — must contain at least 10 digitsTelefon 10 haneden az.
401invalid_api_keyAPI anahtarı geçersiz/eksik.
402Insufficient minute balanceDakika bakiyesi 1’in altında.
422outside_legal_call_windowAranan ülkenin yasal arama saatleri dışında. Yanıttaki next_allowed_at ile tekrar dene.
404assistant_id not found, not owned by this account, or inactiveAsistan yok, başka hesaba ait ya da pasif.
404phone_number_id not found or inactiveVerilen numara yok/pasif.
404No active phone number on this accountphone_number_id verilmedi ve hesapta aktif numara yok.
409A call to this contact is already in progressAynı kontağa açık bir API araması mevcut.
502Could not start the call — check your minute balance and phone numberArama başlatılamadı. Mesaj tek bir nedeni göstermez; en sık sebepler: yasal arama penceresi kapalı (TR 09:00–19:00 Pzt–Cmt dışında her çağrı buraya düşer), kişi DNC listesinde, eşzamanlı arama tavanı dolu, ya da SIP/santral sorunu.

Hata metinlerine göre dallanma yapma — bu dizeler uyarı yapılmadan değişir (v1 mesajları bir kez toptan Türkçe’den İngilizce’ye çevrildi). Zap/senaryo koşullarını HTTP durum koduna göre kur.

Tüm hata kodlarının ortak referansı için Limitler ve Hatalar sayfasına bak.

⚠️

KVKK notu. Bu uç gerçek bir telefon araması başlatır. Aradığın numaranın açık rızası otomatik arama kapsamını da içermeli; asistanının açılışında kim olduğunu ve neden aradığını net söylediğinden emin ol. Rıza yönetimi için KVKK ve Veri Yönetimi.

Sorun giderme

BelirtiOlası neden / çözüm
402 dönüyorDakika bakiyesi bitmiş → Dakika Paketleri ile yükle.
404 (asistan)Yanlış assistant_id veya asistan pasif → GET /assistants ile doğru id’yi çek.
404 (numara)Hesapta aktif SIP numarası yok → Telefon Numarası (SIP) ile bağla.
409 dönüyorAynı kişiye zaten açık bir arama var; Zap’in çift tetiklenmediğinden emin ol.
502 dönüyorÖnce saate bak: yasal arama penceresi dışındaysan (TR 09:00–19:00, Pzt–Cmt) her istek 502 döner ve tekrar denemek işe yaramaz. Sonra kişinin DNC listesinde olup olmadığını, numaranın aktif ve SIP trunk’lı olduğunu, bakiyeni ve eşzamanlı arama sayını kontrol et.
201 aldım ama telefon çalmadıinitiated yalnızca kuyruğa alındığını gösterir; sonucu call.completed webhook’undan izle.

İlgili