Getting Started
Is the Batch Scraper API generally available?
Is the Batch Scraper API generally available?
Do I need a separate API key?
Do I need a separate API key?
What's the base URL?
What's the base URL?
https://async.api.zenrows.com/v1. Send your key in the X-API-Key header on every request.How do I integrate?
How do I integrate?
fetch that translates directly to Python, Go, PHP, Java, and more.How It Works
What's the difference between a job, a run, and a task?
What's the difference between a job, a run, and a task?
What's the difference between a rerun and retrying failures?
What's the difference between a rerun and retrying failures?
How do I know when a job is done?
How do I know when a job is done?
run.completed event when the run finishes, or poll the job and watch the stats counters (completed === successful + failed). Webhooks are a convenience; the run state remains the source of truth.My submit returned 202 instead of 201. Is that an error?
My submit returned 202 instead of 201. Is that an error?
POST /jobs returns 201 Created for submissions under 10,000 tasks and 202 Accepted for larger ones (10,000+ tasks or a CSV input). The response body is identical and you track completion the same way, so treat both the same. For a large 202, GET /jobs/{id}/results may return partial pages for a few seconds while the task list finishes writing, but stats.total is correct from the start.Can I submit URLs as I go, instead of all at once?
Can I submit URLs as I go, instead of all at once?
last_batch: true. See open jobs. Note that open (queue-mode) jobs are still being finalized during the private beta.How many jobs can I run at the same time?
How many jobs can I run at the same time?
429 quota_exceeded. Wait for a job to finish before submitting the next, or contact ZenRows if you need a higher limit.Scraping Options
What scraping options can I use?
What scraping options can I use?
zenrows_params as the Universal Scraper API, including js_render, premium_proxy, proxy_country, wait_for, wait, css_extractor, autoparse, json_response, custom_headers, and more. Set them once on the job, and override any of them per URL.Can I use different options for different URLs in the same job?
Can I use different options for different URLs in the same job?
proxy_country for a handful of URLs).Can one job include URLs from different websites?
Can one job include URLs from different websites?
What output formats are available?
What output formats are available?
response_type: markdown) and records it on each result.Results and Limits
How long are result download links valid?
How long are result download links valid?
result_url is a presigned link valid for 2 hours. If it expires, re-list the results to get a fresh one rather than storing it. You can also stream a task’s content directly, or export an entire run as a ZIP.How many URLs can a job handle?
How many URLs can a job handle?
How do I match results back to my own records?
How do I match results back to my own records?
external_id to each URL. The API returns it unchanged on every result, so you can correlate results to your records without tracking the API’s task IDs. It doesn’t need to be unique.Can I download all results at once?
Can I download all results at once?
Scheduling
Can I run a job on a recurring schedule?
Can I run a job on a recurring schedule?
Why was my scheduled time rejected?
Why was my scheduled time rejected?
"09:00", not "09:30". Also provide exactly one schedule type (at, rate, or calendar) and a valid IANA timezone for at and calendar.Pricing
How is the Batch Scraper API priced?
How is the Batch Scraper API priced?
| Configuration | Usage per successful request |
|---|---|
| Base (no special options) | 1 |
| JavaScript rendering | 5 |
| Premium proxy | 10 |
| JavaScript rendering + premium proxy | 25 |
Adaptive Stealth Mode (mode=auto) | Dynamic, 1–25 |
Am I charged for failed requests?
Am I charged for failed requests?
Can I estimate the cost before running a job?
Can I estimate the cost before running a job?
How can I keep costs as low as possible?
How can I keep costs as low as possible?
mode=auto). It starts each request with the cheapest viable setup and escalates to JavaScript rendering or premium proxies only when a site actually needs them, so you pay for the lightest configuration that succeeds.Reliability and Security
What does the idempotency key do, and is it safe to retry a submit?
What does the idempotency key do, and is it safe to retry a submit?
409 idempotency_key_conflict, whether or not the body is identical. The API does not replay the original response. Because of this, an idempotency key is not a safe-retry token. If a submit fails midway, don’t resend with the same key. First check whether the job was created (list your recent jobs), then reuse its job_id or submit again with a new key.How do I verify that a webhook really came from ZenRows?
How do I verify that a webhook really came from ZenRows?
signature: true when you attach the webhook. The API then HMAC-signs each delivery, and your receiver verifies the X-Signature header against the raw request body using your organization’s active key. See Manage HMAC keys.Didn’t Find Your Answer?
Check the Troubleshooting page for error-specific guidance, or reach out to support with yourjob_id, the request body (API key redacted), and the exact error code and detail.