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/jsonKimlik 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).
| Alan | Zorunlu | Açıklama |
|---|---|---|
phone | Evet | Aranacak numara. En az 10 hane içermeli (rakam dışı karakterler yok sayılır). |
assistant_id | Evet | Aramayı yapacak asistanın id’si. Bu hesaba ait ve aktif olmalı. Listeyi GET /assistants ile çek. |
phone_number_id | Hayır | Arayan numara (caller-ID). Verilmezse hesaptaki ilk aktif numara kullanılır. Verilirse hesaba ait ve aktif olmalı. |
first_name | Hayır | Kontak yoksa oluşturulurken kullanılır. Boşsa "Müşteri" yazılır. |
last_name | Hayır | Kontak yoksa oluşturulurken kullanılır. |
Numarayı elle vermek yerine
phone_number_idalanı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"
}| Alan | Açıklama |
|---|---|
call_id | Başlatılan aramanın id’si. Görüşme bitince call.completed webhook’unda bu değerle eşleşir. |
status | Her zaman "initiated" — arama kuyruğa alındı, henüz bağlanma sonucu değil. |
contact_id | Aranan kontağın id’si (bulunan veya yeni oluşturulan). |
assistant_id | İstekte gönderdiğin asistan id’si. |
from_number | Aramanın çıktığı numara (caller-ID). |
to | Kontağın kayıtlı telefon numarası. |
warning | Yalnı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çincall.completedwebhook’una abone ol — bkz. Webhook’lar.
Hata kodları
| Kod | Gövde (error) | Neden |
|---|---|---|
| 400 | invalid_json | Gövde geçerli JSON değil. |
| 400 | phone and assistant_id are required | Zorunlu alanlardan biri eksik. |
| 400 | Invalid phone — must contain at least 10 digits | Telefon 10 haneden az. |
| 401 | invalid_api_key | API anahtarı geçersiz/eksik. |
| 402 | Insufficient minute balance | Dakika bakiyesi 1’in altında. |
| 422 | outside_legal_call_window | Aranan ülkenin yasal arama saatleri dışında. Yanıttaki next_allowed_at ile tekrar dene. |
| 404 | assistant_id not found, not owned by this account, or inactive | Asistan yok, başka hesaba ait ya da pasif. |
| 404 | phone_number_id not found or inactive | Verilen numara yok/pasif. |
| 404 | No active phone number on this account | phone_number_id verilmedi ve hesapta aktif numara yok. |
| 409 | A call to this contact is already in progress | Aynı kontağa açık bir API araması mevcut. |
| 502 | Could not start the call — check your minute balance and phone number | Arama 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
| Belirti | Olası neden / çözüm |
|---|---|
| 402 dönüyor | Dakika 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üyor | Aynı 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. |