Skip to main content
Glama
alterlab-mcp-server

alterlab-mcp-server

Scrape URL

alterlab_scrape
Read-onlyIdempotent

Scrape one URL into clean, LLM-ready markdown, text, HTML, or JSON, with rendering and tier escalation handled automatically for JavaScript-heavy or blocked pages.

Instructions

Get one web page as clean, LLM-ready markdown (or text, HTML, JSON) in a single call; rendering and tier escalation are handled for you. Use when you have one URL and want its content; for an image use alterlab_screenshot, for 2-20 URLs alterlab_batch_scrape, for a whole site alterlab_crawl. Cost: from $0.0002 per page, up to $0.02 on the hardest pages; it starts at the cheapest tier that works and cache hits cost half. A 403/429, challenge page or empty JavaScript shell is retried on higher tiers automatically. Supports GET and POST via method, extraction via extraction_schema or extraction_prompt, cost caps via cost_controls, and browser actions via actions plus screenshot and generate_pdf; action_results has one entry per action with index, type, success, error, result (evaluate) and screenshot_url (screenshot actions). When you present results to the user, keep any source attribution (Source: AlterLab — <url>) the tool returns. A failure may carry next_action install_hands: reason, what Hands unlocks, install link, resume ref.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "alterlab_scrape"
  }
}

Input Schema

NameRequiredDescriptionDefault
ocrNoExtract text from images using OCR (+$0.001)
urlYesURL to scrape
bodyNoRequest body for POST requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{"query": "{ user { id name } }"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET requests.
modeNoScraping mode: auto (recommended), html, js (headless browser), pdf, or ocrauto
cacheNoEnable caching for this request. When true, repeat requests with identical parameters may return cached results. Only use for idempotent requests (GET pages, read-only POSTs).
methodNoHTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, and REST API calls. When using POST, provide body with the request payload. POST costs 1.5x base tier price.GET
actionsNoBrowser automation actions run in order after page load (max 20, requires render_js=true). Failed actions are skipped without aborting the sequence. Results are returned in action_results. Each action has a 'type': wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate.
cookiesNoInline cookies as key-value pairs for authenticated scraping (e.g., {"session_token": "abc123"}). Use this for one-off requests; use session_id for reusable sessions.
formatsNoOutput formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines.
headersNoCustom HTTP headers to send to the target URL. Hop-by-hop headers (Connection, Transfer-Encoding, Host, etc.) are not allowed.
timeoutNoRequest timeout in seconds (1-300)
evidenceNoInclude provenance/evidence snippets alongside extracted fields. Each extracted value will include the source text passage it was derived from. Requires extraction_schema or extraction_prompt.
locationNoGeo-targeting parameters for localized content scraping. Controls proxy country routing, Accept-Language header, and browser locale.
templateNoDEPRECATED alias for extraction_template, kept for backward compatibility. Sent to the API as extraction_template; prefer extraction_template.
wait_forNoCSS selector to wait for before extracting content (e.g., '#main-content')
cache_ttlNoCache TTL in seconds (60–86400). Defaults to 3600 (60 min) when cache=true. Requires cache=true.
fail_fastNoFail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Shorthand for cost_controls.fail_fast. Returns an error with the required tier instead of upgrading.
render_jsNoRender JavaScript using a headless browser (forces Tier 4 minimum, $0.004/req — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with a browser — saves 30-60% on mixed sites).
use_proxyNoRoute through AlterLab's premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot
embeddingsNoChunk the scraped text and embed it with OpenAI models (+$0.001 per page). Set enabled=true; model, chunk_size (64-8191) and chunk_overlap (0-2048) are optional.
pdf_formatNoOutput format for mode='pdf' extraction (API default 'markdown')
screenshotNoCapture a full-page screenshot (+$0.0002, requires render_js). The URL is returned as screenshot_url. Use alterlab_screenshot to get the image inline.
session_idNoUUID of a stored session for authenticated scraping. Use alterlab_list_sessions to find available sessions. The session's cookies will be injected into the request.
wait_untilNoPage load event to wait for before extracting (networkidle, domcontentloaded or load; API default networkidle)
prefer_costNoOptimize for lowest cost — try cheaper tiers first before escalating. Shorthand for cost_controls.prefer_cost. Mutually exclusive intent with prefer_speed.
sync_policyNoSynchronous wait policy. 'auto' (default) may return an early 202 with a job_id for predicted T3/T4 jobs; 'wait_until_deadline' keeps the connection open until the terminal result or the safe sync deadline (~85s).
block_imagesNoBlock image downloads during browser rendering. Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true.
content_typeNoContent-Type header for the request body. Defaults to 'application/json' when body is provided. Use 'application/graphql' for raw GraphQL queries. Use 'application/x-www-form-urlencoded' for HTML form submissions. Requires body to be set.
generate_pdfNoGenerate a PDF of the rendered page (+$0.0004, requires render_js)
ocr_languageNoTesseract language code for OCR (API default 'eng')
prefer_speedNoOptimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Shorthand for cost_controls.prefer_speed. Mutually exclusive intent with prefer_cost.
scroll_countNoNumber of scroll iterations when scroll_to_load is enabled (1-10, API default 3)
cost_controlsNoFine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed.
enable_scrollNoForce scrolling for lazy-load images. true: always scroll (+5-10s), false: never scroll, omit: auto (scroll unless social media site).
force_refreshNoBypass the cache and always fetch a fresh copy of the page. Use when you need real-time content and a cached result would be stale.
proxy_countryNoISO country code for proxy geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true
use_own_proxyNoUse your own proxy integration (bring-your-own-proxy) instead of the system proxy. BYOP requests get a 20% discount on the tier price.
estimate_firstNoRun a cost estimate before scraping and include it in the response. Adds one lightweight API call (~50ms) with no credit charge. The estimated tier, cost, and confidence are prepended to the scrape result. Useful for unfamiliar or potentially expensive sites — see cost before committing.
filter_contentNoApply quality filtering to extracted content. When false (default), returns all parsed content without quality thresholds (lossless mode). When true, filters low-quality boilerplate.
scroll_to_loadNoScroll page to trigger lazy-loaded content (requires render_js). Performs explicit viewport-height scrolls to load dynamic content. Adds ~2-3s latency.
section_filterNoFilter for the json_v2 section tree. Only applies when 'json_v2' is in formats.
sticky_sessionNoSticky-session handle. Scrapes that pass the same value reuse the cookie jar captured on the first call and, best-effort, the same exit IP (~10 min). Alphanumeric, '-' and '_' only. Requires a paid plan (growth tier or above).
wait_conditionNoWait condition for JS rendering: domcontentloaded, networkidle or load
include_iframesNoInline iframe content into the main document (free, requires render_js). Same-origin iframes are read directly; cross-origin iframes are marked but not fetched.
session_headersNoInline auth headers sent to the target (e.g. Authorization: Bearer ...). Merged with the stored session's headers when session_id is also set.
extraction_modelNoPer-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only.
include_raw_htmlNoInclude raw HTML in the response alongside formatted content
use_system_proxyNoOverride your default proxy integration and use AlterLab's system proxy for this request.
extraction_promptNoNatural language extraction instruction. Describes what fields to extract from the page. Mutually exclusive with extraction_schema. Example: "Extract the product name, price, and availability".
extraction_schemaNoJSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM (+$0.001). Result is returned in extraction_result. Example: { "title": "string", "price": "number", "in_stock": "boolean" }
extraction_profileNoPre-built extraction schema template. auto: detect best template (API default). product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries. Mutually exclusive with extraction_template.
flatten_shadow_domNoFlatten Shadow DOM roots into regular DOM for extraction (free, requires render_js).
max_response_bytesNoSoft cap on raw response body size in bytes. When the downloaded HTML exceeds this value it is truncated before extraction. Default: 5 MB (5242880). Set to 0 for no limit. Maximum: 50 MB (52428800). Useful for very large pages where you only need the beginning of the content.
promote_schema_orgNoUse Schema.org JSON-LD/Microdata as the primary structured-data source when present (API default true). Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages.
sticky_session_ttlNoSticky-session cookie-jar lifetime in seconds (300-7200, API default 1800). Ignored unless sticky_session is set.
extraction_providerNoLLM provider to use for extraction. Selects the matching BYOK key registered at /dashboard/settings/llm-keys. When omitted, the most recently used registered key is used automatically. Requires extraction_schema or extraction_prompt.
extraction_templateNoShorthand alias for extraction_profile — selects the same pre-built template. Mutually exclusive with extraction_profile.
proxy_integration_idNoSpecific proxy integration ID to use (requires use_own_proxy=true)
remove_cookie_bannersNoRemove cookie consent banners from HTML before content extraction (free; the API default is true)
skip_tls_verificationNoTLS certificate verification for the target. Omit (recommended): certificates are verified, and if the site's own certificate is invalid (expired, self-signed, wrong hostname, incomplete chain) the page is still fetched without verification. true skips verification from the start. false always requires a valid certificate, so sites with an invalid certificate fail.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed50 schema fields changedv1.9.0
    • addedInput schema / properties / actions
      Added value: +{
      +  "description": "Browser automation actions run in order after page load (max 20, requires render_js=true). Failed actions are skipped without aborting the sequence. Results are returned in action_results. Each action has a 'type': wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "milliseconds": {
      +            "maximum": 30000,
      +            "minimum": 100,
      +            "type": "integer"
      +          },
      +          "selector": {
      +            "description": "CSS selector to wait for visibility",
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "wait",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "selector": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "timeout": {
      +            "description": "Timeout in ms (default 10000)",
      +            "maximum": 30000,
      +            "minimum": 1000,
      +            "type": "integer"
      +          },
      +          "type": {
      +            "const": "wait_for",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "selector"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "selector": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "click",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "selector"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "selector": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "fill",
      +            "type": "string"
      +          },
      +          "value": {
      +            "maxLength": 5000,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "selector",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "key": {
      +            "description": "Key to press, e.g. 'Enter', 'Tab', 'Escape'",
      +            "maxLength": 50,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "press",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "key"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "amount": {
      +            "description": "Viewport heights to scroll",
      +            "maximum": 20,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "direction": {
      +            "enum": [
      +              "down",
      +              "up"
      +            ],
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "scroll",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "delay": {
      +            "description": "Delay between scrolls in ms",
      +            "maximum": 5000,
      +            "minimum": 200,
      +            "type": "integer"
      +          },
      +          "end_selector": {
      +            "description": "Stop scrolling when this selector appears",
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "max_scrolls": {
      +            "maximum": 50,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "type": {
      +            "const": "infinite_scroll",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "full_page": {
      +            "type": "boolean"
      +          },
      +          "type": {
      +            "const": "screenshot",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "script": {
      +            "description": "JavaScript to run in the page (max 5120 chars). Network APIs (fetch, XMLHttpRequest, WebSocket) and dynamic code execution (eval, Function) are blocked.",
      +            "maxLength": 5120,
      +            "type": "string"
      +          },
      +          "type": {
      +            "const": "evaluate",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "script"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • removedInput schema / properties / block_images / default
      Removed value: -false
    • changedInput schema / properties / cache_ttl / type
      Previous value: -"number"New value: +"integer"
    • changedInput schema / properties / cost_controls / description
      Previous value: -"Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. Prefer these over the top-level prefer_cost/prefer_speed/fail_fast fields for full control."New value: +"Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed."
    • changedInput schema / properties / cost_controls / properties / max_tier / description
      Previous value: -"Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set."New value: +"Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set. Combining render_js=true with a max_tier below 4 is rejected (render_js forces tier 4)."
    • addedInput schema / properties / embeddings
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Chunk the scraped text and embed it with OpenAI models (+$0.001 per page). Set enabled=true; model, chunk_size (64-8191) and chunk_overlap (0-2048) are optional.",
      +  "properties": {
      +    "chunk_overlap": {
      +      "maximum": 2048,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "chunk_size": {
      +      "maximum": 8191,
      +      "minimum": 64,
      +      "type": "integer"
      +    },
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "model": {
      +      "enum": [
      +        "text-embedding-3-small",
      +        "text-embedding-3-large"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / enable_scroll
      Added value: +{
      +  "description": "Force scrolling for lazy-load images. true: always scroll (+5-10s), false: never scroll, omit: auto (scroll unless social media site).",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / extraction_model / anyOf
      Added value: +[
      +  {
      +    "maxLength": 256,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / extraction_model / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • changedInput schema / properties / extraction_profile / description
      Previous value: -"Pre-built extraction schema template. auto: detect best template. product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries."New value: +"Pre-built extraction schema template. auto: detect best template (API default). product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries. Mutually exclusive with extraction_template."
    • changedInput schema / properties / extraction_schema / description
      Previous value: -"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"New value: +"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM (+$0.001). Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"
    • addedInput schema / properties / extraction_template
      Added value: +{
      +  "$ref": "#/properties/extraction_profile",
      +  "description": "Shorthand alias for extraction_profile — selects the same pre-built template. Mutually exclusive with extraction_profile."
      +}
    • changedInput schema / properties / fail_fast / description
      Previous value: -"Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Use this to protect against unexpected credit spend on protected pages. Returns an error with the required tier instead of automatically upgrading."New value: +"Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Shorthand for cost_controls.fail_fast. Returns an error with the required tier instead of upgrading."
    • addedInput schema / properties / flatten_shadow_dom
      Added value: +{
      +  "description": "Flatten Shadow DOM roots into regular DOM for extraction (free, requires render_js).",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / formats / items / enum
      Previous value: -[
      -  "text",
      -  "json",
      -  "json_v2",
      -  "html",
      -  "markdown",
      -  "rag",
      -  "raw",
      -  "content"
      -]New value: +[
      +  "text",
      +  "json",
      +  "json_v2",
      +  "html",
      +  "markdown",
      +  "rag",
      +  "content",
      +  "raw"
      +]
    • addedInput schema / properties / generate_pdf
      Added value: +{
      +  "description": "Generate a PDF of the rendered page (+$0.0004, requires render_js)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / headers
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "Custom HTTP headers to send to the target URL. Hop-by-hop headers (Connection, Transfer-Encoding, Host, etc.) are not allowed.",
      +  "type": "object"
      +}
    • addedInput schema / properties / include_iframes
      Added value: +{
      +  "description": "Inline iframe content into the main document (free, requires render_js). Same-origin iframes are read directly; cross-origin iframes are marked but not fetched.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / max_response_bytes / default
      Removed value: -5242880
    • addedInput schema / properties / ocr
      Added value: +{
      +  "description": "Extract text from images using OCR (+$0.001)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / ocr_language
      Added value: +{
      +  "description": "Tesseract language code for OCR (API default 'eng')",
      +  "type": "string"
      +}
    • addedInput schema / properties / pdf_format
      Added value: +{
      +  "description": "Output format for mode='pdf' extraction (API default 'markdown')",
      +  "type": "string"
      +}
    • changedInput schema / properties / prefer_cost / description
      Previous value: -"Optimize for lowest cost — try cheaper tiers first before escalating. Best for non-time-sensitive scrapes where minimizing credit spend matters. Mutually exclusive intent with prefer_speed."New value: +"Optimize for lowest cost — try cheaper tiers first before escalating. Shorthand for cost_controls.prefer_cost. Mutually exclusive intent with prefer_speed."
    • changedInput schema / properties / prefer_speed / description
      Previous value: -"Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Best for time-sensitive scrapes where latency matters more than cost. Mutually exclusive intent with prefer_cost."New value: +"Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Shorthand for cost_controls.prefer_speed. Mutually exclusive intent with prefer_cost."
    • changedInput schema / properties / promote_schema_org / description
      Previous value: -"Use Schema.org JSON-LD/Microdata as the primary structured-data source when present. Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages."New value: +"Use Schema.org JSON-LD/Microdata as the primary structured-data source when present (API default true). Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages."
    • changedInput schema / properties / proxy_country / description
      Previous value: -"ISO country code for geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true"New value: +"ISO country code for proxy geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true"
    • addedInput schema / properties / proxy_integration_id
      Added value: +{
      +  "description": "Specific proxy integration ID to use (requires use_own_proxy=true)",
      +  "type": "string"
      +}
    • removedInput schema / properties / remove_cookie_banners / default
      Removed value: -true
    • changedInput schema / properties / remove_cookie_banners / description
      Previous value: -"Remove cookie consent banners from HTML before content extraction (free, enabled by default)"New value: +"Remove cookie consent banners from HTML before content extraction (free; the API default is true)"
    • removedInput schema / properties / render_js / default
      Removed value: -false
    • changedInput schema / properties / render_js / description
      Previous value: -"Render JavaScript using headless browser (forces Tier 4 minimum — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with browser — saves 30-60% on mixed sites)."New value: +"Render JavaScript using a headless browser (forces Tier 4 minimum, $0.004/req — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with a browser — saves 30-60% on mixed sites)."
    • addedInput schema / properties / screenshot
      Added value: +{
      +  "description": "Capture a full-page screenshot (+$0.0002, requires render_js). The URL is returned as screenshot_url. Use alterlab_screenshot to get the image inline.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / scroll_count / default
      Removed value: -3
    • changedInput schema / properties / scroll_count / description
      Previous value: -"Number of scroll iterations when scroll_to_load is enabled (1-10, default 3)"New value: +"Number of scroll iterations when scroll_to_load is enabled (1-10, API default 3)"
    • removedInput schema / properties / scroll_to_load / default
      Removed value: -false
    • addedInput schema / properties / section_filter
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Filter for the json_v2 section tree. Only applies when 'json_v2' is in formats.",
      +  "properties": {
      +    "content_only": {
      +      "type": "boolean"
      +    },
      +    "exclude_content_types": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "min_content_blocks": {
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / session_headers
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "Inline auth headers sent to the target (e.g. Authorization: Bearer ...). Merged with the stored session's headers when session_id is also set.",
      +  "type": "object"
      +}
    • addedInput schema / properties / skip_tls_verification
      Added value: +{
      +  "description": "TLS certificate verification for the target. Omit (recommended): certificates are verified, and if the site's own certificate is invalid (expired, self-signed, wrong hostname, incomplete chain) the page is still fetched without verification. true skips verification from the start. false always requires a valid certificate, so sites with an invalid certificate fail.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / sticky_session
      Added value: +{
      +  "description": "Sticky-session handle. Scrapes that pass the same value reuse the cookie jar captured on the first call and, best-effort, the same exit IP (~10 min). Alphanumeric, '-' and '_' only. Requires a paid plan (growth tier or above).",
      +  "maxLength": 128,
      +  "type": "string"
      +}
    • addedInput schema / properties / sticky_session_ttl
      Added value: +{
      +  "description": "Sticky-session cookie-jar lifetime in seconds (300-7200, API default 1800). Ignored unless sticky_session is set.",
      +  "maximum": 7200,
      +  "minimum": 300,
      +  "type": "integer"
      +}
    • addedInput schema / properties / sync_policy
      Added value: +{
      +  "description": "Synchronous wait policy. 'auto' (default) may return an early 202 with a job_id for predicted T3/T4 jobs; 'wait_until_deadline' keeps the connection open until the terminal result or the safe sync deadline (~85s).",
      +  "enum": [
      +    "auto",
      +    "wait_until_deadline"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / template / description
      Previous value: -"Named extraction template to apply to the scrape result. Accepts standard template names (e.g. 'product', 'article', 'job_posting') or a custom template name registered in your account. When provided, routes the request through template-based extraction."New value: +"DEPRECATED alias for extraction_template, kept for backward compatibility. Sent to the API as extraction_template; prefer extraction_template."
    • changedInput schema / properties / timeout / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / url / maxLength
      Added value: +2083
    • addedInput schema / properties / use_own_proxy
      Added value: +{
      +  "description": "Use your own proxy integration (bring-your-own-proxy) instead of the system proxy. BYOP requests get a 20% discount on the tier price.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / use_proxy / default
      Removed value: -false
    • changedInput schema / properties / use_proxy / description
      Previous value: -"Route through premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot"New value: +"Route through AlterLab's premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot"
    • addedInput schema / properties / use_system_proxy
      Added value: +{
      +  "description": "Override your default proxy integration and use AlterLab's system proxy for this request.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / wait_condition
      Added value: +{
      +  "description": "Wait condition for JS rendering: domcontentloaded, networkidle or load",
      +  "type": "string"
      +}
    • addedInput schema / properties / wait_until
      Added value: +{
      +  "description": "Page load event to wait for before extracting (networkidle, domcontentloaded or load; API default networkidle)",
      +  "type": "string"
      +}
  2. Changed19 schema fields changedv1.8.0
    • changedInput schema / properties / body / description
      Previous value: -"Request body for POST/PUT/PATCH requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{\"query\": \"{ user { id name } }\"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET/HEAD/DELETE requests."New value: +"Request body for POST requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{\"query\": \"{ user { id name } }\"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET requests."
    • addedInput schema / properties / cache
      Added value: +{
      +  "description": "Enable caching for this request. When true, repeat requests with identical parameters may return cached results. Only use for idempotent requests (GET pages, read-only POSTs).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / cache_ttl
      Added value: +{
      +  "description": "Cache TTL in seconds (60–86400). Defaults to 3600 (60 min) when cache=true. Requires cache=true.",
      +  "maximum": 86400,
      +  "minimum": 60,
      +  "type": "number"
      +}
    • addedInput schema / properties / content_type
      Added value: +{
      +  "description": "Content-Type header for the request body. Defaults to 'application/json' when body is provided. Use 'application/graphql' for raw GraphQL queries. Use 'application/x-www-form-urlencoded' for HTML form submissions. Requires body to be set.",
      +  "enum": [
      +    "application/json",
      +    "application/x-www-form-urlencoded",
      +    "text/plain",
      +    "application/graphql"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / cost_controls
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. Prefer these over the top-level prefer_cost/prefer_speed/fail_fast fields for full control.",
      +  "properties": {
      +    "fail_fast": {
      +      "description": "Return error instead of escalating to more expensive tiers on failure.",
      +      "type": "boolean"
      +    },
      +    "force_tier": {
      +      "description": "Pin execution to this exact tier, bypassing escalation (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). Use to guarantee a specific engine is used regardless of site difficulty.",
      +      "enum": [
      +        "1",
      +        "2",
      +        "3",
      +        "3.5",
      +        "4"
      +      ],
      +      "type": "string"
      +    },
      +    "max_credits": {
      +      "description": "Hard spending cap for this request in credits. Request fails if cost would exceed this.",
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    },
      +    "max_tier": {
      +      "$ref": "#/properties/cost_controls/properties/force_tier",
      +      "description": "Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set."
      +    },
      +    "prefer_cost": {
      +      "description": "Optimize for cost — try cheaper tiers first, accept lower success probability.",
      +      "type": "boolean"
      +    },
      +    "prefer_speed": {
      +      "description": "Optimize for speed — skip to the most reliable tier for this domain.",
      +      "type": "boolean"
      +    },
      +    "time_budget": {
      +      "description": "Total wall-clock budget in seconds for the entire tier escalation sequence (5–300s). Escalation stops when remaining budget is insufficient for the next tier attempt.",
      +      "maximum": 300,
      +      "minimum": 5,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / estimate_first
      Added value: +{
      +  "default": false,
      +  "description": "Run a cost estimate before scraping and include it in the response. Adds one lightweight API call (~50ms) with no credit charge. The estimated tier, cost, and confidence are prepended to the scrape result. Useful for unfamiliar or potentially expensive sites — see cost before committing.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / evidence
      Added value: +{
      +  "description": "Include provenance/evidence snippets alongside extracted fields. Each extracted value will include the source text passage it was derived from. Requires extraction_schema or extraction_prompt.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / extraction_schema / description
      Previous value: -"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in content.json (add 'json' to formats) and in the top-level filtered_content field. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"New value: +"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"
    • addedInput schema / properties / fail_fast
      Added value: +{
      +  "description": "Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Use this to protect against unexpected credit spend on protected pages. Returns an error with the required tier instead of automatically upgrading.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / filter_content
      Added value: +{
      +  "description": "Apply quality filtering to extracted content. When false (default), returns all parsed content without quality thresholds (lossless mode). When true, filters low-quality boilerplate.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / force_refresh
      Added value: +{
      +  "description": "Bypass the cache and always fetch a fresh copy of the page. Use when you need real-time content and a cached result would be stale.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / formats / description
      Previous value: -"Output formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines."New value: +"Output formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines."
    • changedInput schema / properties / formats / items / enum
      Previous value: -[
      -  "text",
      -  "json",
      -  "json_v2",
      -  "html",
      -  "markdown",
      -  "rag",
      -  "content"
      -]New value: +[
      +  "text",
      +  "json",
      +  "json_v2",
      +  "html",
      +  "markdown",
      +  "rag",
      +  "raw",
      +  "content"
      +]
    • changedInput schema / properties / method / description
      Previous value: -"HTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, REST API calls. Use PUT/PATCH for REST API updates. When using POST/PUT/PATCH, provide body with the request payload."New value: +"HTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, and REST API calls. When using POST, provide body with the request payload. POST costs 1.5x base tier price."
    • changedInput schema / properties / method / enum
      Previous value: -[
      -  "GET",
      -  "POST",
      -  "PUT",
      -  "PATCH",
      -  "DELETE",
      -  "HEAD"
      -]New value: +[
      +  "GET",
      +  "POST"
      +]
    • addedInput schema / properties / prefer_cost
      Added value: +{
      +  "description": "Optimize for lowest cost — try cheaper tiers first before escalating. Best for non-time-sensitive scrapes where minimizing credit spend matters. Mutually exclusive intent with prefer_speed.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / prefer_speed
      Added value: +{
      +  "description": "Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Best for time-sensitive scrapes where latency matters more than cost. Mutually exclusive intent with prefer_cost.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / promote_schema_org
      Added value: +{
      +  "description": "Use Schema.org JSON-LD/Microdata as the primary structured-data source when present. Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / template
      Added value: +{
      +  "description": "Named extraction template to apply to the scrape result. Accepts standard template names (e.g. 'product', 'article', 'job_posting') or a custom template name registered in your account. When provided, routes the request through template-based extraction.",
      +  "type": "string"
      +}
  3. Changed1 schema field changedv1.7.0
    • addedInput schema / properties / block_images
      Added value: +{
      +  "default": false,
      +  "description": "Block image downloads during browser rendering. Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true.",
      +  "type": "boolean"
      +}
  4. First observedv1.5.0

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only, non-destructive, open-world, idempotent, so the bar is lower, yet the description still adds cost range ($0.0002 to $0.02), cheapest-tier-first escalation, half-price cache hits, automatic retry on 403/429/challenge/empty JS shells, and the attribution string it emits. It also flags the install_hands next_action payload on failure, which is behavior no structured field conveys.

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

Conciseness4/5

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

Front-loaded with purpose and routing before cost and mechanics, and most sentences carry load. The density suffers slightly in the middle run of parameter round-up and the action_results field enumeration, which reads like a partial schema restatement.

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?

For a 60-parameter tool with no output schema, the description covers purpose, alternatives, cost profile, escalation/retry behavior, and attribution expectations, which is substantial. Gaps remain around the async path implied by sync_policy (early 202 with job_id) and which parameters govern the returned job vs. inline result, so an agent could be surprised by a non-terminal response.

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 coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning by grouping method/body, extraction_schema or extraction_prompt, cost_controls, and actions with screenshot/generate_pdf, plus the shape of action_results (index, type, success, error, result, screenshot_url). It stops short of explaining high-impact parameters like sync_policy, fail_fast, or render_js trade-offs, which remain schema-only.

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?

"Get one web page as clean, LLM-ready markdown (or text, HTML, JSON) in a single call" names a specific verb, resource, and output shape, and immediately contrasts with alterlab_screenshot, alterlab_batch_scrape, and alterlab_crawl. An agent can route correctly without inspecting 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 Guidelines5/5

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

Explicit when-to-use ("one URL and want its content") plus explicit alternatives keyed to cardinality and media type: image -> screenshot, 2-20 URLs -> batch_scrape, whole site -> crawl. This is the exact routing information an agent needs against these siblings.

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