Events
Signals created without a
notify block use your account’s default webhook.
Poll any delivery with GET /v1/webhook-deliveries/{delivery_id}.
Delivery
Every delivery is aPOST with two headers:
Verifying signatures
Signatures are HMAC-SHA256 over{timestamp}.{raw_body} using the webhook_secret you set on the Signal (or your account-level secret for batch events).
Retries & idempotency
- We expect a
2xxwithin 10 seconds. Anything else is retried 5 times with exponential backoff (1m → 5m → 30m → 2h → 6h). - Retries carry the same
trigger_id/job_id— dedupe on it and deliveries are safely idempotent. - Ordering is not guaranteed across deliveries. Each Trigger carries a per-Signal monotonic
check_number— order by it (orchecked_at), never by arrival. - If your URL returns
404/410repeatedly (or exhausts retries on consecutive events), the Signal is auto-paused and asignal.pausedevent is sent to your account’s fallback endpoint.
external_id and metadata when set. Trigger history and terminal webhook delivery records are retained for 90 days (all plans today).
Don’t want webhooks?
Everything delivered by webhook is also queryable:GET /v1/triggers for Signal matches, GET /v1/batch/{job_id} for batch results. Polling those endpoints is free.