Lumaktaw sa pangunahing nilalaman
s.id Logo
Tingnan ang Markdown

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

KaganapanIpinapadala kapag
link.createdNati-trigger kapag gumawa ng bagong link
link.updatedNati-trigger kapag binago ang URL o pamagat ng link
link.archivedNati-trigger kapag na-archive ang isang link
link.clickedNati-trigger sa bawat redirect (event kada click)
microsite.publishedNati-trigger kapag na-publish ang microsite
qr.scannedNati-trigger kapag na-scan ang QR code
HeaderHalaga
X-SID-EventPangalan ng event, halimbawa link.created
X-SID-Signaturesha256=<hmac-hex>
X-SID-Delivery-IDNatatanging ID ng bawat pagpapadala
User-Agents.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);
}