Skip to main content
Webhooks push namespace events to your backend so you don’t have to poll. Create them in the console’s Developers tab: give a public HTTPS endpoint and pick the events you want. Endpoints resolving to private or internal hosts are rejected.

Event types

Delivery format

Each delivery is a POST with a JSON body:
and two headers:
Deliveries for the same on-chain event carry a deterministic 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:
Sign over the raw body bytes, not a re-serialized parse — JSON.parse followed by JSON.stringify can reorder or reformat and break the comparison.

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.
Respond fast: accept the payload, enqueue it, return 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.