Overview & Purpose
Durable jobs (Crawl, Batch scrape) run in the background instead of returning a result immediately. Delivery is how their output actually reaches you — there are up to three mechanisms, and they aren’t mutually exclusive. Use this page to decide which delivery mechanism (or combination) fits your integration, rather than defaulting to polling everywhere. Prerequisites: for webhooks, a publicly reachable HTTPS endpoint you control. For email delivery, a valid address. No special API scope is required.The three mechanisms
All three originate from the same job lifecycle — they differ only in how completion reaches you, and they aren’t mutually exclusive:- Download links (pull) — always available, no configuration. You poll the job’s status
endpoint; once
completed, the response includes presigned URLs for the result artifacts. - Webhook (push) — currently on Crawl only. pline
POSTs an event payload to a URL you provide as the job progresses and finishes. - Email (push) — currently on Crawl only. A one-time notification sent to an address you provide once the job completes.
Best practices
Download links- Pull model — nothing is sent to you; fetch results when you’re ready. Best default for simple integrations with no server to receive callbacks.
urlmust be HTTPS, point to a public host (nolocalhost/private IPs), and must not contain credentials.headerslets you attach your own auth token to every call;metadatais arbitrary JSON echoed back unchanged, for correlating the callback with your own job/request.eventsfilters which lifecycle events you receive:started,page,completed,failed. Leave empty for all of them.pagefires per completed page — the closest thing to a live progress feed.- Delivery is retried a few times on failure, but isn’t guaranteed — don’t rely on it exclusively for critical workflows.
- Sent once, after the job completes. A low-effort notification for jobs where you’d rather not poll or run a webhook receiver.
Practical Implementation Example
Scenario: run a crawl with both a webhook (for real-time completion) and email (as a backup notification), then fetch the results once notified.Python
