Olayları dinleyin
Mesaj teslim durumları, gelen mesajlar, Apsilo AI analizleri, kişi değişiklikleri, kampanya ve anket olaylarını kendi sunucunuzda anında alın — yoklamaya (polling) gerek kalmaz.
Kurulum
Panelde Ayarlar → API ve Webhook’lar → Webhook’lar bölümünden bir uç nokta ekleyin: HTTPS adresi ve
dinlemek istediğiniz olaylar. Gizli anahtar (whsec_…) yalnızca oluşturma anında gösterilir. Firma
başına en fazla 20 uç nokta tanımlanabilir; uç noktayı
webhooks:manage kapsamıyla API üzerinden de yönetebilirsiniz.
Uç noktanız isteği 10 saniye içinde 2xx ile yanıtlamalıdır. Ağır
işleri kuyruğa alıp hemen yanıt dönün.
Olaylar
Toplam 23 olay türü. Yalnızca ihtiyacınız olanlara abone olun; yeni türler zamanla eklenir.
Mesajlar
message.receivedGelen mesajmessage.sentMesaj gönderildi (sağlayıcı kabul etti)message.deliveredMesaj teslim edildimessage.readMesaj okundumessage.failedMesaj başarısız
Gelen kutusu
conversation.assignedSohbet atandıconversation.closedSohbet kapatıldıcomment.receivedGönderiye yorum / mention
Apsilo AI
message.analyzedMesaj analiz edildi (Apsilo AI)
Kişiler
contact.createdKişi oluşturulducontact.updatedKişi güncellendicontact.opted_outKişi abonelikten çıktı / izni kaldırıldıcontact.deletedKişi silindi
Kampanyalar
campaign.startedKampanya başladıcampaign.completedKampanya tamamlandı
Anketler
survey.responseAnket yanıtı
Süreç takibi
record.createdBaşvuru / fırsat kaydı oluşturuldurecord.stage_changedKaydın aşaması değişti
Sesli arama
call.completedSesli arama tamamlandıcall.missedGelen arama yanıtlanmadı
Şablonlar
template.status_changedŞablon onay durumu değişti
Sosyal medya
social.post.publishedSosyal medya gönderisi yayınlandısocial.post.failedSosyal medya gönderisi başarısız
Apsilo AI: message.analyzed
Apsilo AI gelen bir mesajı, yorumu veya şikayeti analiz ettiğinde gönderilir. Mesajın kendisi
message.received / comment.received ile ayrıca bildirilir; analiz arka planda üretildiği için bu
olay onlardan kısa süre sonra gelir. data.analysis, mesaj nesnesindeki
analysis alanıyla aynı yapıdadır.
{
"type": "message.analyzed",
"data": {
"messageId": "3c9a7f42-6c7d-4a5e-9d11-0c2f4b8a77e1",
"conversationId": "b71e…",
"contactId": "4d20…",
"channel": "instagram",
"type": "comment",
"analysis": {
"kind": "inbound",
"sentiment": "negative",
"intent": "complaint",
"urgency": 4,
"flags": ["profanity"],
"categories": {},
"autoHidden": false,
"analyzedAt": "2026-09-17T09:15:02.000Z"
},
"messageCreatedAt": "2026-09-17T09:15:00.000Z",
"at": "2026-09-17T09:15:02.000Z"
}
}Olay gövdesi
Tüm olaylar aynı zarfla gelir. id olayın benzersiz kimliğidir: tekrar teslimlerde aynı kalır, bu
yüzden tekilleştirmeyi onunla yapın.
apiVersion (2026-09-14) yük şeması değiştiğinde artar; data alanının içeriği olay türüne
göre değişir.
Olayların birbirini izleyen sırada geleceğini varsaymayın; sıralama için createdAt alanını kullanın.
Gövde
{
"id": "01J9Z5K2F3R7QW8N",
"type": "message.delivered",
"apiVersion": "2026-09-14",
"createdAt": "2026-09-17T09:15:00.000Z",
"tenantId": "8f1c…",
"data": {
"messageId": "3c9a…",
"channel": "whatsapp",
"conversationId": "b71e…",
"contactId": "4d20…",
"status": "delivered",
"occurredAt": "2026-09-17T09:14:59.000Z"
}
}İmza doğrulama
İmza ham gövde üzerinden hesaplanır: HMAC-SHA256(secret, "<t>.<ham gövde>"). Gövdeyi JSON’a
çevirmeden önce doğrulayın.
Zaman damgası toleransı 5 dakikadır; daha eski istekleri reddedin (tekrar oynatma koruması). Karşılaştırmayı sabit zamanlı bir fonksiyonla yapın.
Node.js
import crypto from "node:crypto";
// Ham gövde gerekir: express.raw({ type: "application/json" })
app.post("/apsilo/webhook", express.raw({ type: "application/json" }), (req, res) => {
const header = req.get("Apsilo-Signature") ?? "";
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
const fresh = Number.isFinite(t) && Math.abs(Date.now() / 1000 - t) <= 300;
if (!fresh) return res.sendStatus(400);
const expected = crypto
.createHmac("sha256", process.env.APSILO_WEBHOOK_SECRET)
.update(t + "." + req.body)
.digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
if (!ok) return res.sendStatus(401);
const event = JSON.parse(req.body.toString("utf8"));
enqueue(event); // event.id ile tekilleştirin
res.sendStatus(200);
});Gizli anahtarı döndürdüğünüzde eski anahtarla üretilen imzalar geçersiz olur; yeni anahtarı uç noktanıza yaymadan döndürmeyin.
Yeniden deneme ve otomatik devre dışı bırakma
2xx dışındaki yanıtlar ve zaman aşımları başarısız sayılır. Teslim artan aralıklarla tekrarlanır:
Art arda 50 başarısız teslimde uç nokta otomatik devre dışı kalır ve firma yöneticisine bildirim gider; panelden yeniden etkinleştirdiğinizde bekleyen teslimler gönderilir. Panelde her teslimin isteği, yanıtı ve süresi görünür, tek tek yeniden gönderebilirsiniz.
İyi uygulamalar
| Öneri | Neden |
|---|---|
| Olayı kuyruğa alıp hemen 200 dönün | İşlem 10 sn’yi aşarsa teslim başarısız sayılır |
Tekilleştirmeyi event.id ile yapın | Yeniden denemelerde aynı olay tekrar gelebilir |
| Sıra garantisi varsaymayın | Olaylar farklı sırayla ulaşabilir; createdAt alanını kullanın |
| Bilinmeyen olay türlerini yok sayın | Yeni olay türleri zamanla eklenir; uç noktanız kırılmamalı |
| Yalnızca gereken olaylara abone olun | Gereksiz trafiği ve işlem yükünü azaltır |