Skip to content

Start typing to search the documentation.

Webhooks: overview

On this page

Webhooks are the canonical way to learn that a verification finished. Polling works but it’s lossy under retries and expensive at scale.

How they work

  1. You register an HTTPS endpoint in the dashboard (Developer → Webhooks) and get the signing secret when you save it. (You can send a test request afterwards to confirm it’s reachable.)
  2. When an event fires, we POST a JSON payload to your endpoint, signed so you can verify it came from us.
  3. Your handler verifies the signature (via the SDK) and processes the event.
  4. You return 2xx to acknowledge. A 408, 429, 5xx, or timeout triggers a retry; any other 4xx is treated as a permanent rejection and not retried.

Webhook delivery: Self sends a signed POST to your endpoint, which verifies the signature and acks with 2xx; a 408, 429, 5xx, or timeout is retried with backoff

What we send

A single POST with a JSON body, typed as WebhookEvent. One event is delivered:

Event typeFires when
verification.completedOff-chain verification finishes (success or failure).

See Event catalog for the full payload.

Ordering and delivery guarantees

  • At-least-once. The same event can arrive more than once (a retry after a failed delivery, a network blip). Make your handler idempotent.
  • Bounded latency. Typically under a second from verification to delivery. Under retry backoff, latency can grow to minutes.

Idempotency

The event carries a stable ID derived from the verification, so retries of the same event share it:

  • verification.completed: <verification_id>-completed

Dedupe in your handler on verification_id. See Best practices.

Reliability

Failed deliveries (408, 429, 5xx, timeout, or connection error) are retried automatically on an exponential schedule over a span of days, so a brief outage on your side recovers on its own. Any other 4xx response is a permanent rejection and is not retried, so never return 400 for a transient failure like a database hiccup (see Best practices). Every delivery is signed, see Verify webhooks.

Was this page helpful?