Olaylar: canlı döküm ve arama akışı
WebSocket üzerinden canlı döküm ve arama durumu: yazıyor göstergesi, anlık duygu analizi, çoklu arama izleme ve yeniden bağlanma deseni.
Güncellendi: 17 Ağustos 2026
Olaylar, webhook’ların canlı karşılığıdır. Webhook olay bittikten sonra düşer ("arama sona erdi, özeti burada"); olaylar arama sürerken akar ("şu an şu söylendi").
Hangi kanalı seçmeli
| İhtiyaç | Kanal |
|---|---|
| Dökümü kaydetmek, CRM akışı tetiklemek | Webhook (arama sonrası) |
| Panelde canlı döküm göstermek | Olaylar (arama sırasında) |
| Arama sonrası kalite/duygu puanlaması | Webhook |
| Canlı dinleme / izleme arayüzü | Olaylar |
| Arama bitince otomasyon başlatmak | Webhook |
İki kanal büyük ölçüde aynı veriyi taşır. Seçim tek soruya iner: veriye o an mı ihtiyacınız var, yoksa sonradan mı?
Bağlanmak
const url = `wss://api.call2me.app/v1/events?token=${token}`;
const ws = new WebSocket(url);
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'subscribe', call_id: 'call_xyz789' }));
};
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
console.log(msg.type, msg.data);
};Sorgu dizesindeki token sunucu tarafında API anahtarı olabilir; tarayıcıda ASLA sk_ anahtarı kullanmayın. Tarayıcı istemcileri için arka ucunuzdan kısa ömürlü bir token üretin.
Olay tipleri
| Tip | Ne zaman | Yük |
|---|---|---|
| subscribed | Abonelik onaylandığında | { call_id } |
| transcript.partial | Cümle duyulurken | { speaker, text, is_final: false } |
| transcript.final | Cümle tamamlandığında | { speaker, text, is_final: true } |
| agent.state | Asistan durumu değiştiğinde | { state: 'listening' | 'thinking' | 'speaking' } |
| function.call | Asistan bir fonksiyon çağırdığında | { name, args } |
| function.result | Fonksiyon sonuç döndüğünde | { name, result } |
| call.ended | Arama bittiğinde | { status, duration_ms } |
| error | Akış düzeyinde hata | { code, message } |
transcript.partial olayları konuşma tanıyıcı ilerledikçe gelir; "yazıyor" tarzı canlı arayüz için kullanın. O cümlenin kesin hali transcript.final olayıdır — kalıcı olarak saklayacağınız metin bu olmalı.
Çoklu aramaya abone olmak
Tek bağlantı üzerinden birden fazla aramayı izleyebilirsiniz. Mesajlar call_id alanıyla ayrışır; kampanya izleme ekranı için doğru desen budur.
ws.send(JSON.stringify({ type: 'subscribe', call_id: 'call_a' }));
ws.send(JSON.stringify({ type: 'subscribe', call_id: 'call_b' }));
// izlemeyi bırakmak
ws.send(JSON.stringify({ type: 'unsubscribe', call_id: 'call_a' }));Yeniden bağlanma
Mobil uygulamanın arka plana düşmesi veya ağın anlık kopması normaldir. Bağlantı kapandığında artan aralıklarla yeniden bağlanın ve aboneliklerinizi tekrar bildirin.
let gecikme = 1000;
const abonelikler = new Set();
function baglan() {
const ws = new WebSocket(url);
ws.onopen = () => {
gecikme = 1000;
abonelikler.forEach((id) =>
ws.send(JSON.stringify({ type: 'subscribe', call_id: id }))
);
};
ws.onclose = () => setTimeout(baglan, Math.min((gecikme *= 2), 30000));
}
baglan();Bağlantı kopukken tetiklenen olaylar tekrar gönderilmez. Eksiksiz geçmiş için arama bittikten sonra GET /v1/calls/{id} ile dökümü çekin — canlı akış tamamlayıcıdır, kayıt kaynağı değildir.
İstemci tarafı olay girişi
Ters yön de var: kendi arayüzünüzdeki kullanıcı olaylarını (tıklama, dönüşüm) platforma gönderebilirsiniz. Bu uç kimlik doğrulaması istemez ve hız sınırlıdır.
curl -X POST https://api.call2me.app/v1/events \
-H "Content-Type: application/json" \
-d '{"event": "web_test_started", "properties": {"page": "/fiyatlandirma"}}'LiveKit veri kanalı
Tarayıcı üzerinden sesli görüşme yapıyorsanız (LiveKit WebRTC), döküm mesajları LiveKit veri kanalından da gelir; ayrı bir WebSocket açmanız gerekmez. Telefon aramaları ve dışarıdan izleme için yukarıdaki WebSocket doğru yoldur.
Sık sorulanlar
Olaylar ile webhook arasındaki fark ne?
Webhook, ayrık bir olay gerçekleştikten sonra tetiklenir (arama bitti, döküm hazır). Olaylar arama sürerken gerçek zamanlı akar. Arka plan iş akışları için webhook, canlı arayüz için olaylar.
WebSocket kullanmak zorunda mıyım?
Hayır. Yalnızca canlı arayüz istiyorsanız gerekir. Çoğu entegrasyon webhook veya yoklama ile sorunsuz çalışır; olaylar isteğe bağlı bir kanaldır.
Tek bağlantıdan birden çok aramayı izleyebilir miyim?
Evet. Bağlandıktan sonra her arama için subscribe mesajı gönderin. Mesajlar call_id alanıyla ayrışır; aynı soket üzerinden abone olup çıkabilirsiniz.
Bağlantı koparsa kaçırdığım olaylar gelir mi?
Hayır, kopukluk süresindeki olaylar tekrar gönderilmez. Yeniden bağlandığınızda o andan sonraki olayları alırsınız. Eksiksiz geçmiş için arama bitince dökümü REST üzerinden çekin.
Tarayıcıda API anahtarımı kullanabilir miyim?
Kullanmayın. Anahtar hesabınızın tamamına erişir. Tarayıcı istemcileri için arka ucunuzdan kısa ömürlü token üretip onu kullanın.