POST /v1/read. What you pass in the body determines whether Reader runs a synchronous scrape, a batch job, or a crawl.
Three shapes of input
Everything else (formats, selectors, proxy mode, caching, webhooks) is a modifier on top of one of those three shapes.
Why one endpoint
You learn one contract instead of four. Your code branches on what it sent, not on which URL it called. When you want to swap a batch for a crawl, you change the body; the endpoint, auth, error handling, retry logic, and response envelope all stay the same.Synchronous scrape
Async batch or crawl
id to poll GET /v1/jobs/{id}, stream progress with SSE, or subscribe a webhook for completion. See Async jobs.
What Reader decides for you
You tell Reader what to fetch. Reader decides how:- How to render the page (full browser with JavaScript execution and stealth evasion).
- Which proxy mode to use based on your
proxyModesetting (see Proxy modes). - Whether to serve from cache.
- How to parallelize a batch.
Response envelope
Every JSON response from/v1/read follows the same envelope:
Next
- Scrape vs crawl: when to pick which mode
- Proxy modes:
standardandpremium - Async jobs: poll, stream, or webhook-notify

