Creating a webhook
url: your HTTPS endpointname: a label you’ll see in the dashboardevents: which events to deliver (see below)secret: optional but strongly recommended. Used to sign every payload. See verification.headers: optional custom headers Reader will include on every delivery (auth tokens, etc.)
id and echoes the secret back once. Store it now; you won’t see it again.
You can create up to 10 webhooks per workspace.
Supported events
| Event | Fires when |
|---|---|
job.started | An async job (batch or crawl) begins processing |
job.page | Each page finishes (one webhook delivery per page) |
job.completed | A job reaches completed state (may include failures in results) |
job.failed | A job reaches failed state (fatal, not per-URL failures) |
credit.low | Workspace balance drops below 10% of the monthly limit |
job.completed and job.failed. Subscribe to job.page only when you need streaming-style incremental delivery; it can be very chatty on large batches.
Headers Reader sends
Every delivery includes:Verifying signatures
Reader signs the delivery with HMAC-SHA256 over a payload of${timestamp}.${body}, matching Stripe’s pattern. You verify that:
- The timestamp is recent (within 5 minutes). This blocks replay attacks.
- The HMAC of
${timestamp}.${rawBody}matches the signature Reader sent. This proves integrity and authenticity.
rawBody. If you parse the JSON before hashing, the re-serialized form will almost certainly differ from the bytes Reader signed, and verification will fail. Most web frameworks expose raw body access as an option on the JSON middleware.
See Verifying webhooks for Express, FastAPI, and Next.js patterns.
Delivery and retries
- Timeout: Reader waits up to 10 seconds for your endpoint to respond.
- Success: any 2xx status.
- Retries: on non-2xx or timeout, Reader retries with exponential backoff (1s, 4s, 16s), then gives up after 3 total attempts.
- Dead letters: failed deliveries show up in the webhook’s
deliveryStatsand are visible in the dashboard.
X-Reader-Delivery to dedupe.
Disabling and updating
PATCH /v1/webhooks/{id}: update URL, events, or toggleactive: falseDELETE /v1/webhooks/{id}: remove it entirely
Next
- Verifying webhooks: code for common frameworks
- Webhook workflows: end-to-end patterns
- Webhook retries: handling delivery failures on your side

