Skip to main content
Glama
ZenRows
by ZenRows

scrape

Read-only

Fetch any webpage as clean markdown, HTML, PDF, screenshot, or structured JSON, bypassing anti-bot checks and rendering JavaScript when needed.

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

TableJSON 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.
autoparseNoAutomatically extract structured data from the page into JSON. Best for product pages, articles, and listings.
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. 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"
      +]
  2. First observedv1.1.5

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, but the description adds substantial behavioral context: automatic mode only charges for the configuration that succeeds, forcing premium_proxy with js_render costs 25x a basic request, wait/wait_for require js_render, and response_type is ignored when structured extractors are set. This goes well beyond the annotation safety profile.

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?

The description front-loads the core purpose and default mode, then uses short paragraphs and examples to cover forced configurations, alternatives, and costs. Despite its length for a 14-parameter tool, every sentence adds actionable information and there is no filler.

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

Completeness4/5

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

With no output schema and rich annotations, the description supplies return types, default mode, the extract alternative, and important cost caveats. It still omits failure/timeout behavior and does not distinguish this stateless fetch tool from browser_* session tools or crawl_* multi-page tools, leaving minor gaps for a complex 14-parameter tool.

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 adds useful parameter meaning: the cost interaction of premium_proxy plus js_render, the default automatic mode, and example payloads that show how parameters combine. Most individual parameter semantics are already in the schema, so it does not reach a 5.

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?

The description states a specific verb and resource ('Scrape any webpage and return its content using Zenrows (Fetch)') and explicitly distinguishes the tool from the extract sibling for structured JSON fields. An agent can tell what this does and when the extract tool is more appropriate without opening the schema.

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

Usage Guidelines4/5

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

It gives concrete usage guidance: name the alternative for structured data ('the extract tool returns parsed fields'), state the default behavior ('Pass just the URL'), and explain when to force js_render or premium_proxy. However, it does not address when to choose this tool over the many browser_* or crawl_* siblings, so tool-level exclusions are incomplete.

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