speakline

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-Id ile tekilleştirin.
  • Adres https olmalı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-SignatureZaman damgası ve imza: t=…,v1=…
Speakline-Event-TypeOlayın adı
Speakline-Event-IdOlayın kimliği (UUID)
Speakline-Delivery-IdTeslimatın kimliği; yeniden denemelerde değişmez
HTTP
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_idOlayın kimliği
event_typeOlayın adı
schema_versionZarf sürümü (şu an 1)
company_idÇalışma alanının kimliği
occurred_atOlayın zamanı (ISO 8601)
contextİlgili kayıtların kimlikleri: call_id, lead_id, appointment_id …
payloadOlaya göre değişen alanlar
JSON
{
  "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
1Hemen
21 dakika
35 dakika
430 dakika
52 saat
66 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ıpGönderilen olaylar
*Tüm olaylar
lead.*Müşteri adayı olayları
callcenter.call_*Çağrı merkezindeki çağrı olayları
appointment.bookedYalnız yeni randevular

Olay kataloğu

Çağrı merkezi

OlayAçıklama
callcenter.call_queuedÇağrı kuyruğa girdi · Arayan bir kuyrukta beklemeye başladığında.
callcenter.call_offeredOperatörde çalıyor · Bekleyen çağrı bir operatöre sunulduğunda.
callcenter.call_answeredOperatör yanıtladı · Bir operatör çağrıyı yanıtladığında; arayanın bekleme süresiyle.
callcenter.call_abandonedKaçan çağrı · Arayan kuyrukta beklerken kapattığında.
callcenter.offer_declinedOperatör reddetti · Operatör çalan çağrıyı reddettiğinde.
callcenter.offer_missedOperatör yanıtlamadı · Çalan çağrı operatörde yanıtsız kaldığında.
callcenter.call_overflowedAzami bekleme doldu · Kuyruğun azami bekleme süresi dolup çağrı yedek hedefe gittiğinde.
callcenter.callback_requestedGeri arama istendi · Bekleyen arayan, beklemek yerine geri aranmayı seçtiğinde.
callcenter.callback_closedGeri arama kapandı · Geri arama tamamlandığında, ulaşılamadığında ya da iptal edildiğinde.
callcenter.call_heldArayan bekletildi · Operatör arayanı beklemeye aldığında.
callcenter.call_resumedBeklemeden 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_upParktan 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_consultedDanışma yapıldı · Operatör görüşme sırasında birine danıştığında.
callcenter.call_taken_overAsistanın çağrısı devralındı · Bir kişi, asistanın yürüttüğü çağrıyı devraldığında.
callcenter.call_completedGö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_dialedOperatör dışarıyı aradı · Operatör tıkla-ara, geri arama ya da kampanyada arama başlattığında.
callcenter.extension_dialedDahili numara arandı · Arayan çağrı akışında bir operatörün dahilisini tuşladığında.
callcenter.internal_callOperatörler arası arama · Bir operatör bir iş arkadaşını aradığında.
callcenter.lead_skippedKampanya kartı atlandı · Operatör kampanyadaki bir müşteri adayını atladığında.
callcenter.operator_status_changedOperatör durumu değişti · Operatör müsait olduğunda, molaya çıktığında ya da çevrimdışı olduğunda.

Aramalar

OlayAçıklama
call.originatedGiden arama başladı · API, kampanya ya da operatör tarafından giden arama başlatıldığında.
call.inbound_receivedGelen arama alındı · Bir numaraya gelen arama ulaştığında.
call.status_changedArama 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.transferredArama 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_readyArama özeti hazır · Aramanın özeti, duygu analizi ve yapılacakları hazır olduğunda.

Sesli mesajlar

OlayAçıklama
voicemail.newSesli mesaj bırakıldı · Arayan sesli mesaj bıraktığında.
voicemail.updatedSesli 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

OlayAçıklama
messaging.inbound_receivedGelen mesaj alındı · Bir kanaldan müşteri mesajı geldiğinde.
messaging.inbound_repliedAsistan yanıtladı · Asistan bir müşteri mesajını yanıtladığında.
messaging.inbound_reply_skippedAsistan yanıt vermedi · Asistan yanıt vermediğinde (ekibe devredildi, mesai dışı vb.).
messaging.outbound_sentGiden mesaj gönderildi · Bir mesaj gönderildiğinde.
messaging.outbound_manual_sentElle mesaj gönderildi · Bir kişi gelen kutusundan mesaj gönderdiğinde.
messaging.outbound_sent_voice_toolArama sırasında mesaj gönderildi · Ses asistanı görüşme sırasında mesaj gönderdiğinde.
messaging.outbound_failedMesaj gönderilemedi · Bir mesaj iletilemediğinde.
nurture.outbound_sentTakip mesajı gönderildi · Takip (hatırlatma) mesajı gönderildiğinde.

Müşteri adayları

OlayAçıklama
lead.createdMüş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_changedMüşteri adayının durumu değişti · Durum değiştiğinde (yeni → arandı → nitelikli …); önceki durum da iletilir.

Kampanyalar

OlayAçıklama
campaign.dispatchedKampanya araması yapıldı · Kampanya bir müşteri adayını aradığında.
campaign.text_sentKampanya mesajı gönderildi · Mesaj kampanyası bir müşteri adayına mesajını gönderdiğinde.
campaign.fallback_sentKampanya yedek mesajı · Yanıtsız aramadan sonra yedek mesaj gönderildiğinde.
campaign.lead_completedKampanyada müşteri adayı kapandı · Operatör kampanyasında bir müşteri adayı tamamlandığında.

Randevular

OlayAçıklama
appointment.bookedRandevu oluşturuldu · Bir randevu oluşturulduğunda.
appointment.rescheduledRandevu ertelendi · Randevu başka bir zamana taşındığında.
appointment.cancelledRandevu iptal edildi · Bir randevu iptal edildiğinde.
appointment.completedRandevu tamamlandı · Randevu tamamlandı olarak işaretlendiğinde.
appointment.no_showRandevuya gelinmedi · Müşteri adayı randevusuna gelmediğinde.
appointment.deletedRandevu silindi · Bir randevu silindiğinde.

Etkinlik kaydı

OlayAçıklama
audit.loggedEtkinlik kaydı yazıldı · Etkinlik kaydına yazılan her satırda (kim, neyi değiştirdi); güvenlik izleme sistemleri için.

Bu sayfada