Beta status (2026-05-04): webhooks are flag-gated behind
AUTOUSERS_WEBHOOKS_ENABLED=1. While the flag is off, every /v1/webhooks/*
route returns 503 Service Unavailable. Watch the Changelog for
the public flip.When to use webhooks
¹ Use
/v1/evaluations/{id}/autouser-stream (server-sent events) for
in-page live progress instead.
² Webhooks fan out to your backend; surface that to the UI via your own
WebSocket / SSE.
Polling autouser status burns RPM budget — a 50-comparison eval × 4
personas = 200 jobs, each taking minutes. Webhooks fire once per
state change.
How it works
- An event happens (e.g.
evaluation.completed). - We insert a
WebhookEventrow — the immutable record. - For every endpoint subscribed to that type, we enqueue a
WebhookDelivery. - A worker POSTs the payload, signed with your endpoint’s secret.
- Your endpoint returns 2xx. We mark
delivered. Done. - On non-2xx or timeout, we retry — see Retry & replay.
What we POST
Every request includes:Setting up an endpoint
Tier gating
Webhooks are restricted to Pro and Enterprise plans. Free and Team callers get403 plan_upgrade_required on /v1/webhooks/* routes.
This matches the pricing card — the
“webhooks + REST API” line item.
Required scopes
Next
Event reference
All seven v1 events with example payloads.
Signature verification
Production-ready snippets in TypeScript, Python, Go, Ruby.
Retry & replay
The backoff schedule. The receiver contract. The auto-disable rules.
Testing webhooks
Send synthetic events. Use ngrok locally.