Event Types
Every event payload includes atype field that identifies what occurred. The current event catalog:
Subscribe only to the event types your integration needs. Unnecessary subscriptions increase processing overhead and
expose more surface area to errors.
Delivery Model
At-least-once delivery
Every event is guaranteed to be delivered — but may arrive more than once. Your handler must be idempotent. Use
the event
id field to deduplicate.Automatic retries
If your endpoint does not return a
2xx status within the timeout window, delivery is retried with exponential
backoff across multiple attempts before the event is marked failed.Ordering is not guaranteed. An
order.ticketed event may arrive before its corresponding order.created event
under retry conditions. Always design handlers to tolerate out-of-order delivery.Request Format
Every webhook is aPOST request with the following structure:
Delivery Flow
Respond with
200 OK immediately after verification — before any business logic runs. If processing takes
longer than the timeout window, the delivery is considered failed and retried.Signature Verification
Every webhook request includes anX-Signature header. Verifying it proves the request originated from the API and was not tampered with in transit.
Signature format
t— Unix timestamp of when the request was sentv1— HMAC-SHA256 of the signed payload using your webhook secret
Signed payload construction
The string that is signed is formed by concatenating the timestamp, a literal period, and the raw request body:Verification implementation
Never use string equality (
===) to compare HMACs. Use timingSafeEqual to prevent timing attacks that could allow
an attacker to forge valid signatures.Handling Duplicates
Because delivery is at-least-once, your handler will receive the same event more than once. Guard against this by tracking processed event IDs:Store processed event IDs with a TTL that matches the maximum retry window of the delivery system (typically 72
hours). There is no need to retain them indefinitely.
Retry Schedule
When delivery fails, the system retries with exponential backoff:
After the final attempt, the event is marked as
failed and no further delivery is attempted. You can manually replay failed events from the dashboard or via the API.
Implementation Checklist
1
Register your endpoint
Provide a publicly accessible HTTPS URL. HTTP endpoints are rejected.
2
Store your webhook secret securely
Retrieve your signing secret from the dashboard and store it in an environment variable — never hardcode it.
3
Verify the signature on every request
Reject any request that fails HMAC verification before touching the payload.
4
Respond 200 before processing
Acknowledge receipt immediately. Offload business logic to a background queue.
5
Deduplicate using event ID
Check the event
id against your store before processing. Return 200 for duplicates without reprocessing.6
Handle out-of-order events
Use
created_at timestamps and idempotent state transitions to safely handle events that arrive out of
sequence.Best Practices
Verify every signature
Treat any request that fails signature verification as hostile. Log and discard it immediately.
Respond fast, process async
Acknowledge within the timeout window. Push processing to a queue — never block the HTTP response on business
logic.
Idempotent handlers
Design every handler to produce the same outcome when called multiple times with the same event.

