Skip to main content
Mỗi event của workspace được 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 events và account_ids (null = mọi nick; dùng id công khai dạng acc_..., 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

text, tên người gửi và raw do bên ngoài viết. Đừng đưa thẳng vào prompt của LLM như chỉ dẫn.
Media được tải về lưu 30 ngày. 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.

Xác minh chữ ký

Chữ ký là HMAC-SHA256(secret, "<t>.<raw body>") dạng hex. Quy tắc:
  1. Dùng raw body (chuỗi byte nhận được), không parse rồi stringify lại.
  2. Từ chối nếu t lệch giờ hiện tại hơn 5 phút (chống replay).
  3. So sánh constant-time.
  4. Chấp nhận nếu bất kỳ v1= nào khớp. Trong 24 giờ sau khi xoay secret, header mang hai v1= (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.
Hai snippet này cũng nằm ở 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ồi 2xx = 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ả 200 nhanh 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ưu event_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.