1. Register an endpoint
POST /api/webhooks with your target_url and the events[] you want:
target_urlmust behttps://and publicly reachable (no private-network addresses).- Each
events[]value is validated against the event-type enum; the reference lists the valid values. - The same
target_urlcannot be registered twice in one team.
secret, a 32-character hex string, exactly once. Store it: every later read masks it, and it is what you verify signatures with.
2. Verify deliveries
Every delivery is an HTTPSPOST with a JSON body and these headers:
The signature is
HMAC-SHA256(secret, "{t}.{raw_body}") over the raw request body, with the timestamp mixed in to block replays. Verify before parsing, and reject signatures older than about 5 minutes:
3. Test before relying on it
POST /api/webhooks/{sid}/test fires a synthetic delivery at your endpoint, so you can confirm reachability, signature handling and parsing without waiting for a real event.
4. Use the delivery log
Every attempt is a row you can query:POST /api/webhook-logs/searchlists deliveries with status, response code and timing; filter by webhook or event type.POST /api/webhook-logs/{sid}/retryre-sends a failed delivery.POST /api/webhook-logs/{sid}/canceldrops a pending one.POST /api/webhook-logs/metricsaggregates delivery outcomes over a period, useful for an endpoint health dashboard.