Skip to main content
One Batch job can mix very different pages. Set the common settings once at the job level, then give any task its own zenrows_params: markdown for a page you feed to an LLM, a few CSS-selected fields for a price page, a country for a localized page. Tag each task with external_id and metadata, and they come back on its result so your pipeline knows what to do with it. Uses: Batch zenrows_params at job and task level, response_type, css_extractor, proxy_country and Adaptive Stealth Mode (mode=auto)

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.
The same prompt works for thousands of URLs: describe the groups (“every product page as markdown, every category page as a list of links”) and the agent sets the right options per URL.

How job and task settings combine

  • zenrows_params on the job applies to every task.
  • zenrows_params on a task is merged on top of the job’s: the task adds keys and replaces keys with the same name. Other tasks keep the job settings.
  • external_id and metadata on a task are returned unchanged on that task’s result.
So a job with {"mode": "auto"} and a task with {"response_type": "markdown"} runs that task with both.

Submit a job with per-task settings

This job sets mode=auto for all tasks, then gives each task its own output:
css_extractor is a JSON object sent as a string, so encode it with json.dumps or JSON.stringify. The CLI encodes it for you and sends mode=auto on every task by default. In the CLI, any key on a line other than url, external_id and metadata becomes that task’s setting.

Example output

The Python run, trimmed, with the German IP address masked:
Each result’s type follows its own settings: markdown, json for the CSS fields, html for the default. The CLI run:
The CLI’s credit figure is an upper bound. With mode=auto each task is billed for the configuration that worked.

Mix Adaptive Stealth Mode with manual settings

To render one task with js_render and wait_for while the others use mode=auto, leave mode out of the job-level settings and set it on each task instead. A task’s settings merge with the job’s, so keep mode=auto and manual js_render or premium_proxy on separate tasks.
Python (Requests)
Output

Customize it

Troubleshooting

  • The job is rejected with invalid_argument and an invalid_tasks list: Batch checks every task’s settings before it starts. Each entry names the task index and the setting at fault: fix that setting and submit again.
  • A task fails with REQS004 about mode=auto: the task sets js_render or premium_proxy while the job sets mode=auto. Move mode from the job to the tasks that use it, as in Mix Adaptive Stealth Mode with manual settings.
  • A css_extractor field comes back empty: the selector doesn’t match the page Zenrows received. Check it against the HTML of a plain run of that URL, and add wait_for if the element loads late.
  • proxy_country is rejected on a task: use it with mode=auto or with "premium_proxy": "true" on the same task.

Scrape a list of URLs

Submit thousands of URLs as one Batch job.

Extract data with CSS selectors

Write and test the selectors for your fields.

Retry the tasks that failed

Rerun only the failures and keep the successes.

Download all results of a job at once

Save every page to a folder or one ZIP file.