Webhook olayları
Seçtiğiniz olaylar, belirlediğiniz HTTPS adresine imzalı bir POST isteğiyle iletilir.
Genel bakış
Uç noktaları panelde sahip ve yönetici rolündeki üyeler ekler ve her uç nokta için hangi olayların gönderileceğini seçer.
- 52 olay, 8 grup.
- Teslimat en az bir kez yapılır: aynı olay birden fazla gelebilir,
Speakline-Event-Idile tekilleştirin. - Adres
httpsolmalıdır; yönlendirmeler izlenmez.
İstek
Teslimatın başarılı sayılması için uç noktanın 5 saniye içinde 2xx yanıt vermesi gerekir.
| Başlık | İçerik |
|---|---|
Speakline-Signature | Zaman damgası ve imza: t=…,v1=… |
Speakline-Event-Type | Olayın adı |
Speakline-Event-Id | Olayın kimliği (UUID) |
Speakline-Delivery-Id | Teslimatın kimliği; yeniden denemelerde değişmez |
POST /speakline-webhook HTTP/1.1
Content-Type: application/json
User-Agent: Speakline-Webhooks/1.0
Speakline-Event-Type: lead.created
Speakline-Event-Id: 0f6a2c4e-8b1d-4e3f-9a5c-7d2e1b0f4c6a
Speakline-Delivery-Id: 3c9d2b7e-41f0-4a8e-b6d5-9e2c7a1f0b84
Speakline-Signature: t=1793572520,v1=5f2c…Olay zarfı
Gövde, her olayda aynı alanlara sahip bir JSON zarfıdır; olaya özgü alanlar payload içindedir.
| Alan | İçerik |
|---|---|
event_id | Olayın kimliği |
event_type | Olayın adı |
schema_version | Zarf sürümü (şu an 1) |
company_id | Çalışma alanının kimliği |
occurred_at | Olayın zamanı (ISO 8601) |
context | İlgili kayıtların kimlikleri: call_id, lead_id, appointment_id … |
payload | Olaya göre değişen alanlar |
{
"event_id": "0f6a2c4e-8b1d-4e3f-9a5c-7d2e1b0f4c6a",
"event_type": "lead.created",
"schema_version": 1,
"stream": "leads",
"company_id": "7a3e5c1b-9d2f-4b8a-a6e4-c0f2d8b6a4e2",
"occurred_at": "2026-10-23T14:02:11.482000+00:00",
"context": { "lead_id": "5e1d9a3c-7b2f-4c8e-9a61-3f0b2d4c6e81" },
"payload": {
"id": "5e1d9a3c-7b2f-4c8e-9a61-3f0b2d4c6e81",
"full_name": "Emma Clarke",
"phone": "+442079460344",
"email": "emma@example.com",
"source": "inbound_voice",
"status": "new",
"language": "en",
"created_at": "2026-10-23T14:02:11.482000+00:00"
}
}İmza doğrulama
Speakline-Signature başlığı t (Unix zaman damgası) ve v1 (imza) değerlerini taşır. İmza; t değeri, bir nokta ve isteğin ham gövdesi birleştirilerek uç noktanın gizli anahtarıyla HMAC-SHA256 ile hesaplanır ve onaltılık yazılır. Her denemede yeni bir zaman damgasıyla yeniden imzalanır.
- İmzayı JSON'u ayrıştırmadan önce, ham gövde üzerinden doğrulayın.
- Karşılaştırmayı sabit sürede yapın.
- 300 saniyeden eski istekleri reddetmenizi öneririz.
- Gizli anahtar
whsec_ile başlar ve yalnız oluşturulduğunda ya da yenilendiğinde bir kez gösterilir; yenilendiğinde eski anahtar hemen geçersiz olur.
import crypto from "node:crypto";
// rawBody: the request body exactly as received (string or Buffer), before JSON.parse.
export function verifySpeaklineSignature(rawBody, header, secret, toleranceSeconds = 300) {
const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
const timestamp = Number(parts.t);
if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > toleranceSeconds) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest();
const received = Buffer.from(parts.v1 ?? "", "hex");
return received.length === expected.length && crypto.timingSafeEqual(received, expected);
}Yeniden deneme
2xx dışındaki yanıtlar, zaman aşımı ve bağlantı hataları başarısız sayılır ve teslimat aşağıdaki aralıklarla yeniden denenir.
Altı denemenin tamamı başarısız olursa teslimat tükendi olarak işaretlenir. Uç nokta kapatılmaz; çalışma alanının sahip ve yöneticilerine bildirim gider (her uç nokta için günde en fazla bir kez). Panelde teslimat geçmişinden bir teslimatı yeniden gönderebilirsiniz.
| Deneme | Önceki denemeden sonra |
|---|---|
| 1 | Hemen |
| 2 | 1 dakika |
| 3 | 5 dakika |
| 4 | 30 dakika |
| 5 | 2 saat |
| 6 | 6 saat |
Olay filtresi
Her uç nokta için gönderilecek olaylar glob kalıplarıyla seçilir. Varsayılan * tüm olaylardır; boş liste hiçbir olay göndermez. Her kalıp en az bir olayla eşleşmelidir.
| Kalıp | Gönderilen olaylar |
|---|---|
* | Tüm olaylar |
lead.* | Müşteri adayı olayları |
callcenter.call_* | Çağrı merkezindeki çağrı olayları |
appointment.booked | Yalnız yeni randevular |
Olay kataloğu
Çağrı merkezi
| Olay | Açıklama |
|---|---|
callcenter.call_queued | Çağrı kuyruğa girdi · Arayan bir kuyrukta beklemeye başladığında. |
callcenter.call_offered | Operatörde çalıyor · Bekleyen çağrı bir operatöre sunulduğunda. |
callcenter.call_answered | Operatör yanıtladı · Bir operatör çağrıyı yanıtladığında; arayanın bekleme süresiyle. |
callcenter.call_abandoned | Kaçan çağrı · Arayan kuyrukta beklerken kapattığında. |
callcenter.offer_declined | Operatör reddetti · Operatör çalan çağrıyı reddettiğinde. |
callcenter.offer_missed | Operatör yanıtlamadı · Çalan çağrı operatörde yanıtsız kaldığında. |
callcenter.call_overflowed | Azami bekleme doldu · Kuyruğun azami bekleme süresi dolup çağrı yedek hedefe gittiğinde. |
callcenter.callback_requested | Geri arama istendi · Bekleyen arayan, beklemek yerine geri aranmayı seçtiğinde. |
callcenter.callback_closed | Geri arama kapandı · Geri arama tamamlandığında, ulaşılamadığında ya da iptal edildiğinde. |
callcenter.call_held | Arayan bekletildi · Operatör arayanı beklemeye aldığında. |
callcenter.call_resumed | Beklemeden dönüldü · Arayan beklemeden döndüğünde. |
callcenter.call_parked | Çağrı park edildi · Operatör çağrıyı park ettiğinde. |
callcenter.call_picked_up | Parktan alındı · Bir operatör park edilmiş çağrıyı aldığında. |
callcenter.call_transferred | Çağrı aktarıldı · Operatör çağrıyı bir kişiye, kuyruğa ya da numaraya aktardığında. |
callcenter.call_consulted | Danışma yapıldı · Operatör görüşme sırasında birine danıştığında. |
callcenter.call_taken_over | Asistanın çağrısı devralındı · Bir kişi, asistanın yürüttüğü çağrıyı devraldığında. |
callcenter.call_completed | Görüşme bitti · Operatörün yürüttüğü görüşme bittiğinde; konuşma ve bekletme süreleriyle. |
callcenter.wrap_up_saved | Çağrı sonu formu kaydedildi · Operatör sonuç, not ve etiketleri kaydettiğinde. |
callcenter.wrap_up_ended | Çağrı sonu çalışması bitti · Operatörün çağrı sonu çalışması bittiğinde. |
callcenter.call_dialed | Operatör dışarıyı aradı · Operatör tıkla-ara, geri arama ya da kampanyada arama başlattığında. |
callcenter.extension_dialed | Dahili numara arandı · Arayan çağrı akışında bir operatörün dahilisini tuşladığında. |
callcenter.internal_call | Operatörler arası arama · Bir operatör bir iş arkadaşını aradığında. |
callcenter.lead_skipped | Kampanya kartı atlandı · Operatör kampanyadaki bir müşteri adayını atladığında. |
callcenter.operator_status_changed | Operatör durumu değişti · Operatör müsait olduğunda, molaya çıktığında ya da çevrimdışı olduğunda. |
Aramalar
| Olay | Açıklama |
|---|---|
call.originated | Giden arama başladı · API, kampanya ya da operatör tarafından giden arama başlatıldığında. |
call.inbound_received | Gelen arama alındı · Bir numaraya gelen arama ulaştığında. |
call.status_changed | Arama durumu değişti · Arama çalıyor, sürüyor, tamamlandı ya da başarısız gibi yeni bir duruma geçtiğinde. |
call.transferred | Arama numaraya aktarıldı · Arama dış bir numaraya aktarılıp yanıtlandığında (asistan, yönlendirme kuralı, çağrı akışı, kuyruk taşması ya da operatör). |
call.insights_ready | Arama özeti hazır · Aramanın özeti, duygu analizi ve yapılacakları hazır olduğunda. |
Sesli mesajlar
| Olay | Açıklama |
|---|---|
voicemail.new | Sesli mesaj bırakıldı · Arayan sesli mesaj bıraktığında. |
voicemail.updated | Sesli mesaj işlendi · Sesli mesajın dökümü oluştuğunda ya da mesaj bir müşteri adayıyla eşleştiğinde. |
Mesajlaşma
| Olay | Açıklama |
|---|---|
messaging.inbound_received | Gelen mesaj alındı · Bir kanaldan müşteri mesajı geldiğinde. |
messaging.inbound_replied | Asistan yanıtladı · Asistan bir müşteri mesajını yanıtladığında. |
messaging.inbound_reply_skipped | Asistan yanıt vermedi · Asistan yanıt vermediğinde (ekibe devredildi, mesai dışı vb.). |
messaging.outbound_sent | Giden mesaj gönderildi · Bir mesaj gönderildiğinde. |
messaging.outbound_manual_sent | Elle mesaj gönderildi · Bir kişi gelen kutusundan mesaj gönderdiğinde. |
messaging.outbound_sent_voice_tool | Arama sırasında mesaj gönderildi · Ses asistanı görüşme sırasında mesaj gönderdiğinde. |
messaging.outbound_failed | Mesaj gönderilemedi · Bir mesaj iletilemediğinde. |
nurture.outbound_sent | Takip mesajı gönderildi · Takip (hatırlatma) mesajı gönderildiğinde. |
Müşteri adayları
| Olay | Açıklama |
|---|---|
lead.created | Müşteri adayı oluşturuldu · Elle, API, form, arama ya da mesajla yeni bir müşteri adayı eklendiğinde. CSV içe aktarma bu olayı göndermez. |
lead.status_changed | Müşteri adayının durumu değişti · Durum değiştiğinde (yeni → arandı → nitelikli …); önceki durum da iletilir. |
Kampanyalar
| Olay | Açıklama |
|---|---|
campaign.dispatched | Kampanya araması yapıldı · Kampanya bir müşteri adayını aradığında. |
campaign.text_sent | Kampanya mesajı gönderildi · Mesaj kampanyası bir müşteri adayına mesajını gönderdiğinde. |
campaign.fallback_sent | Kampanya yedek mesajı · Yanıtsız aramadan sonra yedek mesaj gönderildiğinde. |
campaign.lead_completed | Kampanyada müşteri adayı kapandı · Operatör kampanyasında bir müşteri adayı tamamlandığında. |
Randevular
| Olay | Açıklama |
|---|---|
appointment.booked | Randevu oluşturuldu · Bir randevu oluşturulduğunda. |
appointment.rescheduled | Randevu ertelendi · Randevu başka bir zamana taşındığında. |
appointment.cancelled | Randevu iptal edildi · Bir randevu iptal edildiğinde. |
appointment.completed | Randevu tamamlandı · Randevu tamamlandı olarak işaretlendiğinde. |
appointment.no_show | Randevuya gelinmedi · Müşteri adayı randevusuna gelmediğinde. |
appointment.deleted | Randevu silindi · Bir randevu silindiğinde. |
Etkinlik kaydı
| Olay | Açıklama |
|---|---|
audit.logged | Etkinlik kaydı yazıldı · Etkinlik kaydına yazılan her satırda (kim, neyi değiştirdi); güvenlik izleme sistemleri için. |