Docs/API Reference/Webhooks

Webhooks

Receive callbacks from upstream APIs (Stripe events, Twilio messages, Google Drive changes) without exposing your own infrastructure.

Subscription model

You create a webhook subscription from the portal. We give you:

  • A unique ingest URL: /ingestWebhook/{subscriptionId}
  • An HMAC signing secret.

Configure the upstream provider to POST to that URL with their default signing scheme (Stripe-Signature, X-Twilio-Signature, etc.). We verify their signature against the provider's spec, then re-sign with our HMAC and forward to your destination URL.

Verifying our signature on YOUR side

Header: X-Connect-Signature: t=timestamp,v1=hex-hmac-sha256

import crypto from 'node:crypto'; function verifyConnectSignature( rawBody: string, header: string, secret: string, ): boolean { const parts = Object.fromEntries( header.split(',').map((p) => p.split('=')), ); const expected = crypto .createHmac('sha256', secret) .update(`${parts.t}.${rawBody}`) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(expected, 'hex'), Buffer.from(parts.v1, 'hex'), ); }

Reject mismatched timestamps

Replay attacks: discard webhooks where Math.abs(now - parts.t) > 300 (5 minute window).