POST (JSON) tới endpoint bạn đăng ký trong dashboard. Giao hàng at-least-once: có thể nhận trùng, hãy khử trùng theo event_id.
- Tối đa 10 endpoint mỗi workspace. Mỗi endpoint chọn
eventsvàaccount_ids(null= mọi nick; dùng id công khai dạngacc_..., uuid thô cũ vẫn được nhận; phản hồi luôn trảacc_...; thay đổi so với bản trước: phản hồi từng trả uuid thô). - Server gọi trực tiếp tới URL của bạn, không theo redirect. URL phải là https công khai.
- Phiên bản schema hiện tại:
schema_version = "2026-11-01". Thay đổi phá vỡ sẽ đi kèm phiên bản mới, field mới chỉ được thêm.
Event
Tin lịch sử (đồng bộ lại) không bao giờ tạo webhook.
Envelope
attachments[].status có thể là pending ngay khi tin đến; một event message.updated sẽ theo sau khi media đã stored. url là đường dẫn có xác thực, trả 302 tới link ký sẵn hiệu lực 1 giờ. Quá 30 ngày: 410 GONE.
Header
Xác minh chữ ký
Chữ ký làHMAC-SHA256(secret, "<t>.<raw body>") dạng hex. Quy tắc:
- Dùng raw body (chuỗi byte nhận được), không parse rồi stringify lại.
- Từ chối nếu
tlệch giờ hiện tại hơn 5 phút (chống replay). - So sánh constant-time.
- Chấp nhận nếu bất kỳ
v1=nào khớp. Trong 24 giờ sau khi xoay secret, header mang haiv1=(secret mới và secret cũ) để bạn đổi secret không mất event.
Xoay secret hai lần trong vòng 24 giờ làm secret gốc không còn được ký nữa. Chờ đủ 24 giờ giữa hai lần xoay.
docs-site/snippets/verify-webhook-signature.js và .py, và được test đối chiếu với code ký của server.
Retry
Phản hồi2xx = thành công. Mọi trường hợp khác (hoặc timeout) bị retry theo lịch:
- Endpoint thất bại liên tiếp 100 lần bị tự vô hiệu hoá. Bật lại trong dashboard.
- Lịch sử giao hàng giữ 30 ngày, có thể replay thủ công.
- Trả
200nhanh rồi xử lý bất đồng bộ. Đừng làm việc nặng trước khi trả lời.
Khử trùng
Lưuevent_id đã xử lý (Redis, bảng DB có unique) và bỏ qua lần đến sau. Mã mẫu ở docs-site/examples/webhook-receiver-node.