Webhooks

HTTPS callbacks for delivery & consent. Retries on 5xx / 429 / timeout (exponential backoff).

Events

sms.deliverySMS status: submitted, delivered, failed
sms.inboundInbound SMS (MO)
whatsapp.statusWhatsApp delivery receipts
whatsapp.inboundUser replies (incl. Yes/No consent)
whatsapp.consent24h consent opened / declined / failed
otp.statusOTP status (challenge_id, sent, delivered, failed)

otp.status

1{
2  "event": "otp.status",
3  "timestamp": "2026-07-05T10:30:00Z",
4  "data": {
5    "challenge_id": "otp_123",
6    "to": "+22890000000",
7    "status": "delivered",
8    "provider_message_id": "wamid.HBg..."
9  }
10}

sms.delivery

1{
2  "event": "sms.delivery",
3  "timestamp": "2026-07-05T10:30:00Z",
4  "data": {
5    "id": "msg_123",
6    "to": "+22890000000",
7    "status": "delivered",
8    "delivered_at": "2026-07-05T10:30:02Z"
9  }
10}

Security

Optional secret → HMAC-SHA256 in X-Seed-Signature. Verify before trusting.

1import crypto from "node:crypto";
2
3function verifyWebhook(payload, signature, secret) {
4  const expected = crypto
5    .createHmac("sha256", secret)
6    .update(payload, "utf8")
7    .digest("hex");
8  return crypto.timingSafeEqual(
9    Buffer.from(signature),
10    Buffer.from(expected)
11  );
12}