Webhook
Webhook gửi sự kiện từ tài khoản s.id trực tiếp đến máy chủ của bạn. Đăng ký endpoint tại Dashboard > Developer > Webhooks, rồi chọn các sự kiện cần thiết.
Sự kiện và header
| Sự kiện | Gửi khi |
|---|---|
link.created | Kích hoạt khi liên kết mới được tạo |
link.updated | Kích hoạt khi URL hoặc tiêu đề liên kết thay đổi |
link.archived | Kích hoạt khi một liên kết được lưu trữ |
link.clicked | Kích hoạt ở mỗi lần chuyển hướng (một sự kiện cho mỗi lượt nhấp) |
microsite.published | Kích hoạt khi microsite được xuất bản |
qr.scanned | Kích hoạt khi mã QR được quét |
| Header | Giá trị |
|---|---|
X-SID-Event | Tên sự kiện, ví dụ link.created |
X-SID-Signature | sha256=<hmac-hex> |
X-SID-Delivery-ID | ID duy nhất cho mỗi lần gửi |
User-Agent | s.id-Webhooks/1.0 |
json
{
"event": "link.created",
"link": {
"id": 123,
"short": "[your-alias]",
"short_url": "https://s.id/[your-alias]",
"long_url": "https://example.com/long-url",
"title": "My Link",
"created": "2026-06-22T10:00:00Z"
},
"timestamp": "2026-06-22T10:00:00Z"
}Gửi
- Gửi bằng POST với Content-Type: application/json.
- Tối đa 3 lần thử cho mỗi sự kiện, cách nhau 0, 5 và 30 giây.
- Webhook bị tắt sau 5 sự kiện thất bại liên tiếp.
- Nút Test gửi payload mẫu, và lịch sử nằm trong mục Deliveries.
Xác minh chữ ký
Mỗi lần gửi được ký bằng HMAC-SHA256 trên raw body với webhook secret của bạn. Tính lại chữ ký trước khi xử lý payload.
javascript
const crypto = require('node:crypto');
function verifySignature(secret, rawBody, sigHeader) {
if (typeof sigHeader !== 'string' || !sigHeader.startsWith('sha256=')) {
return false;
}
const expected = 'sha256=' +
crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const receivedBuffer = Buffer.from(sigHeader, 'utf8');
const expectedBuffer = Buffer.from(expected, 'utf8');
return receivedBuffer.length === expectedBuffer.length &&
crypto.timingSafeEqual(receivedBuffer, expectedBuffer);
}