Event types
Delivery format
Each delivery is aPOST with a JSON body:
id, so if you ever see a repeat (e.g. after an indexer replay), dedupe on id.
Verify the signature
Your signing secret (whsec_…) is shown exactly once when the webhook is created — store it then, because it is never retrievable afterwards. Compute the HMAC over the raw request body and compare in constant time:
Rotating the secret
If the secret leaks — or you never copied it — rotate it from the Developers tab. Rotation mints a fresh secret (again shown once) and the old one stops validating. Rotation is always available, even when a deployment’s billing would otherwise gate console extras: replacing a possibly-compromised key is a security action, never held hostage.Retries and timeouts
- Your endpoint must respond with a 2xx within 8 seconds; anything else counts as a failure.
- Failed deliveries retry with exponential backoff — starting at ~2 seconds and doubling (2s, 4s, 8s, 16s, 32s) — for up to 6 attempts total, all within roughly the first minute, after which the delivery is marked failed. Webhooks are a live signal: if your endpoint may be down longer than that, reconcile against the public API rather than relying on redelivery.
- Delivery is asynchronous and concurrent: one slow endpoint of yours never delays your other events, and retrying deliveries never starve fresh ones.
- Delivery records are pruned after about two weeks; treat webhooks as a live signal, not an archive. If you need a full replay, the on-chain history and the public API are the source of truth.
200. Do your real work off the request path.
On billing-enabled deployments, creating a new webhook requires an active subscription — but existing webhooks keep delivering regardless (they carry the billing notifications themselves), and rotation stays open.