Webhooks
Direktang ipinapadala ng Webhooks ang mga event mula sa iyong s.id account patungo sa server mo. Magrehistro ng endpoint sa Dashboard > Developer > Webhooks, saka piliin ang mga event na kailangan mo.
Mga event at header
| Kaganapan | Ipinapadala kapag |
|---|---|
link.created | Nati-trigger kapag gumawa ng bagong link |
link.updated | Nati-trigger kapag binago ang URL o pamagat ng link |
link.archived | Nati-trigger kapag na-archive ang isang link |
link.clicked | Nati-trigger sa bawat redirect (event kada click) |
microsite.published | Nati-trigger kapag na-publish ang microsite |
qr.scanned | Nati-trigger kapag na-scan ang QR code |
| Header | Halaga |
|---|---|
X-SID-Event | Pangalan ng event, halimbawa link.created |
X-SID-Signature | sha256=<hmac-hex> |
X-SID-Delivery-ID | Natatanging ID ng bawat pagpapadala |
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"
}Pagpapadala
- Ipinapadala bilang POST na may Content-Type: application/json.
- Hanggang 3 pagsubok bawat event, na may pagitang 0, 5, at 30 segundo.
- Idi-disable ang webhook pagkatapos ng 5 magkakasunod na nabigong event.
- Ipinapadala ng Test button ang halimbawang payload, at makikita ang kasaysayan sa Deliveries.
I-verify ang signature
Bawat pagpapadala ay nilalagdaan ng HMAC-SHA256 sa raw body gamit ang webhook secret mo. Kalkulahin ulit ang signature bago iproseso ang 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);
}