Skip to main content
Glama

Scrape URL

alterlab_scrape
Read-onlyIdempotent

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
urlYesURL to scrape
bodyNoRequest body for POST requests.
modeNoScraping mode: auto (recommended), html, js (headless browser), pdf, or ocr Default: auto.auto
cacheNoAllow a cached result.
methodNoHTTP method. POST is for GraphQL, forms and REST APIs. Default: GET.GET
actionsNoBrowser actions run in order after the page loads, before content extraction and any screenshot or PDF capture. Requires a rendered page; render_js defaults to true when actions are given. Selectors are CSS, or XPath when prefixed with '//' or 'xpath='. Failed actions are skipped and the sequence continues. The response includes action_results, one entry per action with index, type, success, error, result (evaluate, extract, select) and screenshot_url (screenshot actions).
cookiesNo
formatsNoOutput formats. 'markdown' is best for LLM consumption. Default: ["markdown"].
timeoutNoTimeout. Default: 90.
evidenceNoReturn extraction evidence.
locationNo
templateNoExtraction template name.
wait_forNoCSS selector to wait for.
cache_ttlNo
fail_fastNo
render_jsNoRender JavaScript with a headless browser. 'auto' renders only when needed. Default: false.
use_proxyNoRoute through a premium proxy. Default: false.
screenshotNoCapture a full-page screenshot after any actions (adds a small fee, uses a rendered page). The response includes screenshot_url.
session_idNoStored session (cookies) to scrape with.
prefer_costNo
block_imagesNoBlock images. Default: false.
content_typeNoContent-Type of body. Requires body.
generate_pdfNoGenerate a PDF of the rendered page after any actions (adds a small fee, uses a rendered page). The response includes pdf_url.
prefer_speedNo
scroll_countNo
cost_controlsNoCap spending, pin a tier, or trade off cost vs speed.
force_refreshNo
proxy_countryNoProxy country code.
estimate_firstNoRun a free cost estimate before scraping. Default: false.
filter_contentNo
scroll_to_loadNoScroll to load. Default: false.
extraction_modelNoLLM model override.
include_raw_htmlNoInclude raw html. Default: false.
extraction_promptNoNatural language extraction instruction. LLM extraction needs your own LLM API key (OpenAI, Anthropic, OpenRouter, etc.) added in the dashboard BYOK settings; without one the request is rejected with byok_key_required and not charged.
extraction_schemaNoJSON schema for structured extraction. Fields matching this schema are extracted from the page. Example: { "title": "string", "price": "number" }. LLM extraction needs your own LLM API key (OpenAI, Anthropic, OpenRouter, etc.) added in the dashboard BYOK settings; without one the request is rejected with byok_key_required and not charged.
extraction_profileNoBuilt-in extraction profile (product, article, job_posting, ...).
max_response_bytesNo
promote_schema_orgNo
extraction_providerNo
remove_cookie_bannersNoRemove cookie banners. Default: true.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / actions / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "milliseconds": {
      -        "description": "Fixed delay in ms; with selector, the wait timeout",
      -        "maximum": 30000,
      -        "minimum": 100,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for visibility",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "state": {
      -        "default": "visible",
      -        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      -        "enum": [
      -          "visible",
      -          "hidden",
      -          "attached",
      -          "detached"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_for"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the input",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Value to fill in",
      -        "maxLength": 5000,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "key": {
      -        "description": "Key to press, e.g. Enter, Tab, Escape",
      -        "maxLength": 50,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "press"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "default": 1,
      -        "description": "Viewport heights to scroll",
      -        "maximum": 20,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "direction": {
      -        "default": "down",
      -        "enum": [
      -          "down",
      -          "up"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "delay": {
      -        "default": 1000,
      -        "description": "Delay between scrolls in ms",
      -        "maximum": 5000,
      -        "minimum": 200,
      -        "type": "integer"
      -      },
      -      "end_selector": {
      -        "description": "CSS selector that marks the end of content",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "max_scrolls": {
      -        "default": 10,
      -        "description": "Maximum scroll iterations",
      -        "maximum": 50,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "infinite_scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture a screenshot at this point in the sequence.",
      -    "properties": {
      -      "full_page": {
      -        "default": true,
      -        "description": "Capture the full page or just the viewport",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "enum": [
      -          "screenshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "script": {
      -        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      -        "maxLength": 5120,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "evaluate"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "script"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "mode": {
      -        "default": "hide",
      -        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      -        "enum": [
      -          "hide",
      -          "accept",
      -          "reject"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "dismiss_consent"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "label": {
      -        "description": "Option visible label to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "select"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Option value attribute to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "hover"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      -    "properties": {
      -      "block": {
      -        "default": "center",
      -        "description": "Vertical alignment of the element in the viewport",
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "nearest"
      -        ],
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll_into_view"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Click the first element whose visible text matches.",
      -    "properties": {
      -      "exact": {
      -        "default": false,
      -        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      -        "type": "boolean"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "text": {
      -        "description": "Visible text of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click_text"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      -    "properties": {
      -      "attribute": {
      -        "description": "Attribute to return, e.g. href; omit for the visible text",
      -        "maxLength": 100,
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "extract"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Check a checkbox or radio button.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "check"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Uncheck a checkbox.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "uncheck"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Wait until the page reaches a load state; fails on timeout.",
      -    "properties": {
      -      "event": {
      -        "default": "load",
      -        "description": "Load state to wait for",
      -        "enum": [
      -          "load",
      -          "domcontentloaded",
      -          "networkidle"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_event"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      -    "properties": {
      -      "format": {
      -        "default": "html",
      -        "description": "Capture the rendered HTML or its markdown conversion",
      -        "enum": [
      -          "html",
      -          "markdown"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "snapshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      -    "properties": {
      -      "frame": {
      -        "description": "Selector of the iframe containing the selector target",
      -        "oneOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ]
      -      },
      -      "max_bytes": {
      -        "description": "Reject files larger than this",
      -        "maximum": 104857600,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "timeout_ms": {
      -        "default": 15000,
      -        "description": "Time to wait for the download, in ms",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "download"
      -        ],
      -        "type": "string"
      -      },
      -      "url": {
      -        "description": "http(s) URL of a download link to open in a new tab",
      -        "maxLength": 2048,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "milliseconds": {
      +        "description": "Fixed delay in ms; with selector, the wait timeout",
      +        "maximum": 30000,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for visibility",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "state": {
      +        "default": "visible",
      +        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      +        "enum": [
      +          "visible",
      +          "hidden",
      +          "attached",
      +          "detached"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_for"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the input",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Value to fill in",
      +        "maxLength": 5000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "key": {
      +        "description": "Key to press, e.g. Enter, Tab, Escape",
      +        "maxLength": 50,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "press"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "default": 1,
      +        "description": "Viewport heights to scroll",
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "direction": {
      +        "default": "down",
      +        "enum": [
      +          "down",
      +          "up"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "delay": {
      +        "default": 1000,
      +        "description": "Delay between scrolls in ms",
      +        "maximum": 5000,
      +        "minimum": 200,
      +        "type": "integer"
      +      },
      +      "end_selector": {
      +        "description": "CSS selector that marks the end of content",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "max_scrolls": {
      +        "default": 10,
      +        "description": "Maximum scroll iterations",
      +        "maximum": 50,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "infinite_scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture a screenshot at this point in the sequence.",
      +    "properties": {
      +      "full_page": {
      +        "default": true,
      +        "description": "Capture the full page or just the viewport",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "screenshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "script": {
      +        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      +        "maxLength": 5120,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "evaluate"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "mode": {
      +        "default": "hide",
      +        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      +        "enum": [
      +          "hide",
      +          "accept",
      +          "reject"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "dismiss_consent"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "label": {
      +        "description": "Option visible label to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "select"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Option value attribute to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "hover"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      +    "properties": {
      +      "block": {
      +        "default": "center",
      +        "description": "Vertical alignment of the element in the viewport",
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "nearest"
      +        ],
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll_into_view"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Click the first element whose visible text matches.",
      +    "properties": {
      +      "exact": {
      +        "default": false,
      +        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      +        "type": "boolean"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "text": {
      +        "description": "Visible text of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click_text"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      +    "properties": {
      +      "attribute": {
      +        "description": "Attribute to return, e.g. href; omit for the visible text",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "extract"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Check a checkbox or radio button.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "check"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Uncheck a checkbox.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "uncheck"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Wait until the page reaches a load state; fails on timeout.",
      +    "properties": {
      +      "event": {
      +        "default": "load",
      +        "description": "Load state to wait for",
      +        "enum": [
      +          "load",
      +          "domcontentloaded",
      +          "networkidle"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_event"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      +    "properties": {
      +      "format": {
      +        "default": "html",
      +        "description": "Capture the rendered HTML or its markdown conversion",
      +        "enum": [
      +          "html",
      +          "markdown"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "snapshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Return a capped map of the visible page elements; delivered as action_results[i].element_map (viewport, page size, elements with bounding box, tag, text and candidate CSS/XPath selectors)",
      +    "properties": {
      +      "max_elements": {
      +        "default": 200,
      +        "description": "Maximum number of elements returned (1-500)",
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "inspect"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      +    "properties": {
      +      "frame": {
      +        "description": "Selector of the iframe containing the selector target",
      +        "oneOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "max_bytes": {
      +        "description": "Reject files larger than this",
      +        "maximum": 104857600,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "default": 15000,
      +        "description": "Time to wait for the download, in ms",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "download"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "http(s) URL of a download link to open in a new tab",
      +        "maxLength": 2048,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / actions / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "milliseconds": {
      -        "description": "Fixed delay in ms; with selector, the wait timeout",
      -        "maximum": 30000,
      -        "minimum": 100,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for visibility",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "state": {
      -        "default": "visible",
      -        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      -        "enum": [
      -          "visible",
      -          "hidden",
      -          "attached",
      -          "detached"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_for"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the input",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Value to fill in",
      -        "maxLength": 5000,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "key": {
      -        "description": "Key to press, e.g. Enter, Tab, Escape",
      -        "maxLength": 50,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "press"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "default": 1,
      -        "description": "Viewport heights to scroll",
      -        "maximum": 20,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "direction": {
      -        "default": "down",
      -        "enum": [
      -          "down",
      -          "up"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "delay": {
      -        "default": 1000,
      -        "description": "Delay between scrolls in ms",
      -        "maximum": 5000,
      -        "minimum": 200,
      -        "type": "integer"
      -      },
      -      "end_selector": {
      -        "description": "CSS selector that marks the end of content",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "max_scrolls": {
      -        "default": 10,
      -        "description": "Maximum scroll iterations",
      -        "maximum": 50,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "infinite_scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture a screenshot at this point in the sequence.",
      -    "properties": {
      -      "full_page": {
      -        "default": true,
      -        "description": "Capture the full page or just the viewport",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "enum": [
      -          "screenshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "script": {
      -        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      -        "maxLength": 5120,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "evaluate"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "script"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "mode": {
      -        "default": "hide",
      -        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      -        "enum": [
      -          "hide",
      -          "accept",
      -          "reject"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "dismiss_consent"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "label": {
      -        "description": "Option visible label to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "select"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Option value attribute to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "hover"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Click the first element whose visible text matches.",
      -    "properties": {
      -      "exact": {
      -        "default": false,
      -        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      -        "type": "boolean"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "text": {
      -        "description": "Visible text of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click_text"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      -    "properties": {
      -      "attribute": {
      -        "description": "Attribute to return, e.g. href; omit for the visible text",
      -        "maxLength": 100,
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "extract"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Check a checkbox or radio button.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "check"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Uncheck a checkbox.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "uncheck"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Wait until the page reaches a load state; fails on timeout.",
      -    "properties": {
      -      "event": {
      -        "default": "load",
      -        "description": "Load state to wait for",
      -        "enum": [
      -          "load",
      -          "domcontentloaded",
      -          "networkidle"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_event"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      -    "properties": {
      -      "format": {
      -        "default": "html",
      -        "description": "Capture the rendered HTML or its markdown conversion",
      -        "enum": [
      -          "html",
      -          "markdown"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "snapshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "milliseconds": {
      +        "description": "Fixed delay in ms; with selector, the wait timeout",
      +        "maximum": 30000,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for visibility",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "state": {
      +        "default": "visible",
      +        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      +        "enum": [
      +          "visible",
      +          "hidden",
      +          "attached",
      +          "detached"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_for"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the input",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Value to fill in",
      +        "maxLength": 5000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "key": {
      +        "description": "Key to press, e.g. Enter, Tab, Escape",
      +        "maxLength": 50,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "press"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "default": 1,
      +        "description": "Viewport heights to scroll",
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "direction": {
      +        "default": "down",
      +        "enum": [
      +          "down",
      +          "up"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "delay": {
      +        "default": 1000,
      +        "description": "Delay between scrolls in ms",
      +        "maximum": 5000,
      +        "minimum": 200,
      +        "type": "integer"
      +      },
      +      "end_selector": {
      +        "description": "CSS selector that marks the end of content",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "max_scrolls": {
      +        "default": 10,
      +        "description": "Maximum scroll iterations",
      +        "maximum": 50,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "infinite_scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture a screenshot at this point in the sequence.",
      +    "properties": {
      +      "full_page": {
      +        "default": true,
      +        "description": "Capture the full page or just the viewport",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "screenshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "script": {
      +        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      +        "maxLength": 5120,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "evaluate"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "mode": {
      +        "default": "hide",
      +        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      +        "enum": [
      +          "hide",
      +          "accept",
      +          "reject"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "dismiss_consent"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "label": {
      +        "description": "Option visible label to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "select"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Option value attribute to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "hover"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      +    "properties": {
      +      "block": {
      +        "default": "center",
      +        "description": "Vertical alignment of the element in the viewport",
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "nearest"
      +        ],
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll_into_view"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Click the first element whose visible text matches.",
      +    "properties": {
      +      "exact": {
      +        "default": false,
      +        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      +        "type": "boolean"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "text": {
      +        "description": "Visible text of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click_text"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      +    "properties": {
      +      "attribute": {
      +        "description": "Attribute to return, e.g. href; omit for the visible text",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "extract"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Check a checkbox or radio button.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "check"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Uncheck a checkbox.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "uncheck"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Wait until the page reaches a load state; fails on timeout.",
      +    "properties": {
      +      "event": {
      +        "default": "load",
      +        "description": "Load state to wait for",
      +        "enum": [
      +          "load",
      +          "domcontentloaded",
      +          "networkidle"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_event"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      +    "properties": {
      +      "format": {
      +        "default": "html",
      +        "description": "Capture the rendered HTML or its markdown conversion",
      +        "enum": [
      +          "html",
      +          "markdown"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "snapshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      +    "properties": {
      +      "frame": {
      +        "description": "Selector of the iframe containing the selector target",
      +        "oneOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "max_bytes": {
      +        "description": "Reject files larger than this",
      +        "maximum": 104857600,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "default": 15000,
      +        "description": "Time to wait for the download, in ms",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "download"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "http(s) URL of a download link to open in a new tab",
      +        "maxLength": 2048,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations: it discloses the pricing model ($0.0002 to $0.02, cheapest-tier-first, cache hits at half price), automatic escalation/retry on 403/429/challenge pages/empty JS shells, the attribution string the caller must preserve, and the next_action install_hands failure path. It also maps response keys (screenshot_url, pdf_url, action_results) despite there being no output schema.

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 correctly: purpose and tool routing come first, then cost, retry behavior, feature flags, and output conventions. It is dense — long semicolon-chained sentences — but essentially every clause carries information an agent would otherwise have to guess.

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?

For a tool with 40 parameters, nested action objects, and no output schema, the description supplies the missing output contract, cost/retry semantics, and failure handling. The only notable omission is the interaction between the stated automatic rendering and the render_js default of false, which is a minor ambiguity rather than a blocker.

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?

With 40 params at 70% schema coverage, the description adds real cross-parameter meaning: method for GET/POST, extraction via extraction_schema or extraction_prompt, cost capping via cost_controls, and the action_results entry shape (index, type, success, error, result, screenshot_url). Several parameters (fail_fast, prefer_speed, filter_content, max_response_bytes, force_tier/max_tier semantics) remain unexplained in either place, so it stops short of full coverage.

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 and resource — "Get one web page as clean, LLM-ready markdown (or text, HTML, JSON) in a single call" — and immediately names the sibling tools it is not (alterlab_screenshot, alterlab_batch_scrape, alterlab_crawl). An agent can distinguish it from every related tool without opening a 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 routing rules: use when you have one URL; image → screenshot; 2-20 URLs → batch_scrape; whole site → crawl. Both the when-to-use and the when-not-to-use cases are stated with the correct alternative named.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.