Skip to main content
Glama
zenrows-mcp
by ZenRows

scrape

Read-only

Fetch any webpage’s full content as markdown, HTML, PDF, or screenshot, using automatic JavaScript rendering and proxies to handle protected or dynamic pages.

Instructions

Scrape any webpage and return its content using Zenrows (Fetch).

Returns full-page content (markdown/HTML/PDF/screenshot). For structured JSON fields (products, articles, listings), the extract tool returns parsed fields instead of a full page body.

By default the request uses automatic mode (mode=auto): Zenrows adds JS rendering or premium proxies per page only when a plain request does not return the page, and charges only for the configuration that succeeds. Pass just the URL.

Set js_render or premium_proxy only to force a fixed configuration. Doing so switches off automatic mode, and every request is billed at that configuration's cost (premium_proxy with js_render is 25x a basic request).

Examples: Default: { url: "https://example.com" } Geo: { url: "https://example.com", proxy_country: "US" } Forced: { url: "https://spa.com", js_render: true }

Input Schema

NameRequiredDescriptionDefault
urlYesThe webpage URL to scrape
waitNoMilliseconds to wait after page load before capturing content. Max 30000 (30s). Requires js_render=true; without it, including in automatic mode, it may be ignored.
outputsNoComma-separated list of data types to extract as structured JSON. Available: emails, headings, links, menus, images, videos, audios. Use '*' for all types. Returns JSON instead of full page content.
wait_forNoCSS selector to wait for before capturing. Use when key content loads after the initial page render. Requires js_render=true; without it, including in automatic mode, it may be ignored.
autoparseNoDeprecated: general-purpose structured JSON from the page. Prefer the extract tool (extract=auto on a prepared domain, or css_extractor).
js_renderNoForce JavaScript rendering on every request. Overrides automatic mode (mode=auto), which already renders JavaScript when a page needs it. Leave unset unless you need a fixed configuration.
screenshotNoCapture an above-the-fold screenshot of the page. Returns an image instead of text content. Useful for visual verification or debugging.
css_extractorNoExtract specific elements using CSS selectors. JSON object mapping names to selectors, e.g. '{"title":"h1","price":".price-tag"}'. Returns JSON instead of full page content.
premium_proxyNoForce premium residential proxies on every request (10x credit cost). Overrides automatic mode (mode=auto), which already uses premium proxies when a page needs them. Leave unset unless you need a fixed configuration.
proxy_countryNoCountry for geo-targeted scraping. ISO 3166-1 alpha-2 code (e.g. 'US', 'GB', 'DE'). Works in automatic mode (mode=auto); if you set js_render without premium_proxy, it requires premium_proxy=true.
response_typeNoOutput format. 'markdown' (default) preserves structure and is ideal for LLMs. 'plaintext' strips all formatting for pure text extraction. 'pdf' returns a PDF of the page. 'html' returns the raw HTML source (omits the response_type param; Zenrows default). Ignored when autoparse, css_extractor, outputs, or screenshot params are set.markdown
js_instructionsNoJSON array of browser interactions to run before scraping. Works in automatic mode (mode=auto), which then renders the page and bills it at the JS rendering rate, or with js_render=true. Example: [{"click":"#load-more"},{"wait":1000},{"wait_for":".results"}]
screenshot_fullpageNoCapture a full-page screenshot including content below the fold. Returns an image instead of text content.
screenshot_selectorNoCapture a screenshot of a specific element using a CSS selector. Example: ".product-card". Returns an image instead of text content.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv2.15.1
    • changedInput schema / properties / autoparse / description
      Previous value: -"Automatically extract structured data from the page into JSON. Best for product pages, articles, and listings."New value: +"Deprecated: general-purpose structured JSON from the page. Prefer the extract tool (extract=auto on a prepared domain, or css_extractor)."
  2. Changed27 schema fields changedv2.7.0
    • changedInput schema / properties / autoparse / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedInput schema / properties / css_extractor / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedInput schema / properties / js_instructions / description
      Previous value: -"JSON array of browser interactions to run before scraping. Requires js_render=true. Example: [{\"click\":\"#load-more\"},{\"wait\":1000},{\"wait_for\":\".results\"}]"New value: +"JSON array of browser interactions to run before scraping. Works in automatic mode (mode=auto), which then renders the page and bills it at the JS rendering rate, or with js_render=true. Example: [{\"click\":\"#load-more\"},{\"wait\":1000},{\"wait_for\":\".results\"}]"
    • changedInput schema / properties / js_instructions / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / js_render / default
      Removed value: -false
    • changedInput schema / properties / js_render / description
      Previous value: -"Enable JavaScript rendering via headless browser. Required for SPAs (React, Vue, Angular) and pages that load content dynamically."New value: +"Force JavaScript rendering on every request. Overrides automatic mode (mode=auto), which already renders JavaScript when a page needs it. Leave unset unless you need a fixed configuration."
    • changedInput schema / properties / js_render / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedInput schema / properties / outputs / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / premium_proxy / default
      Removed value: -false
    • changedInput schema / properties / premium_proxy / description
      Previous value: -"Use premium residential proxies to bypass anti-bot protection. Required for heavily protected sites. Implies higher credit cost."New value: +"Force premium residential proxies on every request (10x credit cost). Overrides automatic mode (mode=auto), which already uses premium proxies when a page needs them. Leave unset unless you need a fixed configuration."
    • changedInput schema / properties / premium_proxy / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedInput schema / properties / proxy_country / description
      Previous value: -"Country for geo-targeted scraping. ISO 3166-1 alpha-2 code (e.g. 'US', 'GB', 'DE'). Requires premium_proxy=true."New value: +"Country for geo-targeted scraping. ISO 3166-1 alpha-2 code (e.g. 'US', 'GB', 'DE'). Works in automatic mode (mode=auto); if you set js_render without premium_proxy, it requires premium_proxy=true."
    • changedInput schema / properties / proxy_country / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / response_type / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "markdown",
      +      "plaintext",
      +      "pdf",
      +      "html"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / response_type / description
      Previous value: -"Output format. 'markdown' (default) preserves structure and is ideal for LLMs. 'plaintext' strips all formatting for pure text extraction. 'pdf' returns a PDF of the page. 'html' returns the raw HTML source (omits the response_type param; ZenRows default). Ignored when autoparse, css_extractor, outputs, or screenshot params are set."New value: +"Output format. 'markdown' (default) preserves structure and is ideal for LLMs. 'plaintext' strips all formatting for pure text extraction. 'pdf' returns a PDF of the page. 'html' returns the raw HTML source (omits the response_type param; Zenrows default). Ignored when autoparse, css_extractor, outputs, or screenshot params are set."
    • removedInput schema / properties / response_type / enum
      Removed value: -[
      -  "markdown",
      -  "plaintext",
      -  "pdf",
      -  "html"
      -]
    • removedInput schema / properties / response_type / type
      Removed value: -"string"
    • changedInput schema / properties / screenshot / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedInput schema / properties / screenshot_fullpage / type
      Previous value: -"boolean"New value: +[
      +  "boolean",
      +  "null"
      +]
    • changedInput schema / properties / screenshot_selector / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / wait / anyOf
      Added value: +[
      +  {
      +    "maximum": 30000,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / wait / description
      Previous value: -"Milliseconds to wait after page load before capturing content. Max 30000 (30s). Requires js_render=true."New value: +"Milliseconds to wait after page load before capturing content. Max 30000 (30s). Requires js_render=true; without it, including in automatic mode, it may be ignored."
    • removedInput schema / properties / wait / maximum
      Removed value: -30000
    • removedInput schema / properties / wait / minimum
      Removed value: -0
    • removedInput schema / properties / wait / type
      Removed value: -"integer"
    • changedInput schema / properties / wait_for / description
      Previous value: -"CSS selector to wait for before capturing. Use when key content loads after the initial page render. Requires js_render=true."New value: +"CSS selector to wait for before capturing. Use when key content loads after the initial page render. Requires js_render=true; without it, including in automatic mode, it may be ignored."
    • changedInput schema / properties / wait_for / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  3. First observedv1.1.5

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and non-destructive behavior, but the description adds substantive context beyond them: automatic mode bills only the successful configuration, forcing a fixed configuration changes billing, and premium_proxy with js_render is 25x a basic request. It also warns that wait/wait_for may be ignored without js_render.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and return types, then moves to the extract alternative, default mode behavior, forced configurations, and examples. Every sentence supports correct invocation or cost awareness, and the length is justified by the 14-parameter surface.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 14 parameters, no output schema, and annotations covering safety, the description covers return formats, the sibling alternative, default vs forced behavior, and cost implications. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description still adds cross-parameter meaning and examples (URL-only default, geo proxy_country, forced js_render) plus the 25x combined premium_proxy+js_render cost, but most individual parameter semantics remain in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Scrape') and resource ('any webpage'), plus the return medium ('content using Zenrows (Fetch)'). It explicitly contrasts itself with the sibling extract tool for structured JSON fields, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly routes structured-field needs to extract and gives clear when-to-use guidance for default automatic mode versus forcing js_render/premium_proxy. The included examples cover default, geo, and forced configurations, making the selection conditions concrete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.