POST /jobs, GET /jobs/{id}/results) with zenrows_params, and Fetch for small lists
Ask your AI agent
With the Zenrows MCP server connected to Claude, Cursor or any MCP client, paste this prompt. Your agent picks the right Zenrows tools and settings on its own.Submit the list as one Batch job
Send every URL intasks, with the scrape settings for all of them in zenrows_params. Give each task an external_id: Zenrows returns it on every result, so you can match results to your own records. Then wait for the run to finish and download each result from its result_url.
mode=auto), which picks the cheapest configuration that works for each page. The CLI and MCP send mode=auto by default. Any Fetch parameter fits in zenrows_params, and a task’s own zenrows_params override the job’s.
Example output
The Python run:GET /jobs/{job_id}/results, with the presigned link shortened:
Use the Python SDK
ZenRowsBatchClient submits the job, waits for it and downloads every result in a few lines:
Python (SDK)
Output
{"url": ..., "external_id": "abominable-hoodie"} to set per-task IDs, and use_external_id=True on download_to_dir to name files by them. More in the Python and Node.js SDK guides.
Small lists: send requests concurrently
For a few dozen URLs that you want back in seconds, call Fetch directly and let the SDK run requests in parallel. Setconcurrency to your plan’s concurrent request count, which every response reports in the Concurrency-Limit header.
Output
concurrency of them in flight. Move to Batch once the list grows, or when you’d rather not keep a process running while it works. More in Run many requests concurrently.
Customize it
Troubleshooting
- Some tasks failed: read them with
status=failedon the results endpoint; each row has anerrorwith acode. Rerun just those withPOST /jobs/{job_id}/rerun?status=failed,retry_failed()in Python, orzenrows batch retry-failed <id>. Successful results carry over. See Retry the tasks that failed. - A
result_urlreturns403: the presigned link is stale. List the results again for a fresh link. - The run ends
failedwith afailure_reason: the account or key needs credits or a raised credit cap. Fix it, then rerun the tasks that didn’t complete. 429when submitting: your account’s Crawl and Batch jobs are all running. Wait for one to finish, then submit.- Concurrent requests return
429: lowerconcurrencyto theConcurrency-Limitheader value, or move the list to Batch.
Related recipes
Get notified when a Batch job finishes
Receive a signed webhook instead of polling.
Run a Batch job on a schedule
Scrape the same list hourly, daily or weekly.
Map every URL on a website
Build the URL list with Crawl first.
Retry failed requests
Handle errors when you call Fetch directly.