SendrinSendrin Docsv1.0 (Current)
Channels

Outbound Webhooks

Receive real-time HTTP delivery receipts, bounce notifications, and HMAC cryptographic signature verification.

Outbound Webhooks

Configure webhook endpoints in the Sendrin Console to receive immediate delivery receipts, delivery failures, and open tracking events.


1. Webhook Payload Structure

When an event occurs, GNS sends an HTTP POST to your configured webhook URL:

Response
200 Event Payload
{
  "event": "notification.delivered",
  "id": "evt_01J7K3X9AB0C1D2E3F4G",
  "timestamp": "2026-09-13T13:00:00Z",
  "data": {
    "notification_id": "notif_01J7K3X9AB0C1D2E3F4G5H6J7K",
    "channel": "email",
    "recipient": "[email protected]",
    "status": "delivered",
    "attempts": 1,
    "smtp_response": "250 2.0.0 Ok: queued as 4N8Z9q"
  }
}

2. Signature Verification (X-Sendrin-Signature & X-Sendrin-Timestamp)

Every webhook request includes an X-Sendrin-Timestamp header (Unix epoch seconds) and an X-Sendrin-Signature header containing an HMAC-SHA256 signature (v1=<hex>) computed over <timestamp>.<body_json> using your webhook signing secret:

X-Sendrin-Timestamp: 1789314000
X-Sendrin-Signature: v1=9a8b7c6d5e4f3a2b1c0d...

Verification Example (Node.js / TypeScript)

import crypto from 'crypto';

function verifySendrinWebhook(
payloadRaw: string,
timestampHeader: string,
signatureHeader: string,
secret: string
): boolean {
if (!timestampHeader || !signatureHeader.startsWith('v1=')) return false;
const signature = signatureHeader.slice(3);

const signedPayload = `${timestampHeader}.${payloadRaw}`;
const expectedSignature = crypto
  .createHmac('sha256', secret)
  .update(signedPayload)
  .digest('hex');

return crypto.timingSafeEqual(
  Buffer.from(signature),
  Buffer.from(expectedSignature)
);
}

On this page