alterlab-mcp-server
You can scrape, extract, screenshot, crawl, search, map, batch-scrape, and manage authenticated sessions for web data with automatic anti-bot bypass and cost controls.
Scrape any URL to markdown, text, HTML, or JSON with tiered anti-bot bypass, JS rendering, proxies, actions, and structured extraction.
Extract structured data from HTML, text, or markdown using pre-built profiles (product, article, job posting, etc.) or custom JSON schemas.
Capture full-page screenshots of any URL, including pages behind a login.
Batch scrape up to 20 URLs synchronously or up to 100 URLs asynchronously with per-URL options.
Crawl entire websites with sitemap/link discovery, pattern filtering, per-page extraction, and change tracking.
Search the web via Google, Bing, or DuckDuckGo and optionally scrape each result page.
Map/discover all URLs on a site for planning scrapes or crawls.
Manage authenticated sessions: create, list, get, update, refresh, validate, and delete stored cookies/headers.
Estimate scraping costs, check balance/usage, and fetch async job results.
List, enable, or disable beta features on your account.
Provides automatic anti-bot bypass for Akamai-protected websites, enabling reliable scraping of sites behind Akamai.
Allows scraping of Amazon product pages, extraction of product details (name, price, rating, etc.), and session management for authenticated scraping.
Provides automatic anti-bot bypass for Cloudflare-protected websites, enabling reliable scraping of sites behind Cloudflare.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@alterlab-mcp-serverScrape the HTML content of https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
One-Line Install
Claude Code
claude mcp add alterlab -- npx -y alterlab-mcp-server@latestThen set your API key: export ALTERLAB_API_KEY=sk_live_... or add it to .claude.json (see full setup below).
Cursor
# Add to .cursor/mcp.json — see full config belowSmithery
npx -y @smithery/cli install alterlab-mcp-server --client claudeRelated MCP server: Decodo MCP Server
Why AlterLab Instead of WebFetch or Browser MCP?
Claude's built-in WebFetch tool and open-source browser MCP servers fail on most real-world websites. They cannot bypass Cloudflare, render JavaScript SPAs, or extract structured data.
AlterLab replaces broken fetch tools with one MCP server that actually works:
Capability | WebFetch / fetch() | Browser MCP | AlterLab MCP |
Anti-bot bypass (Cloudflare, DataDome, Akamai) | No | Partial | Yes — automatic |
JavaScript rendering (React, Angular, Vue SPAs) | No | Yes (slow) | Yes — headless Chromium |
Structured data extraction (JSON, Schema.org) | No | No | Yes — built-in profiles |
Smart tier escalation (cheapest method first) | N/A | N/A | Yes — saves 60-80% |
Residential proxy rotation (195+ countries) | No | No | Yes |
Screenshot and PDF capture | No | Screenshot only | Yes — both |
OCR text extraction from images | No | No | Yes |
Cost per request | Free (but fails) | Free (but slow) | From $0.0002 |
How Does AlterLab Web Scraping Work?
AlterLab uses a multi-tier scraping architecture. It automatically selects the cheapest method capable of fetching each URL:
Curl ($0.0002/req) — Direct HTTP for static pages, RSS feeds, public APIs
HTTP ($0.0003/req) — TLS fingerprint rotation for moderately protected sites
Stealth ($0.002/req) — Browser impersonation for Cloudflare/DataDome-protected sites
Light JS ($0.0025/req) — Lightweight JS extraction from server-rendered HTML
Browser ($0.004/req) — Full headless Chromium for JavaScript-heavy SPAs
Auto mode starts at Tier 1 and escalates only when blocked. Most websites resolve at Tiers 1-2, so $1 gets you 1,000 to 5,000 scrapes depending on the sites you target.
Installation
Install in Claude Desktop / Claude Code
Add to your Claude config file (~/.claude.json for Claude Code, or Settings for Claude Desktop):
{
"mcpServers": {
"alterlab": {
"command": "npx",
"args": ["-y", "alterlab-mcp-server@latest"],
"env": {
"ALTERLAB_API_KEY": "sk_live_your_key_here"
}
}
}
}Install in Cursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"alterlab": {
"command": "npx",
"args": ["-y", "alterlab-mcp-server@latest"],
"env": {
"ALTERLAB_API_KEY": "sk_live_your_key_here"
}
}
}
}Install in Windsurf
Add to Windsurf MCP settings (~/.codeium/windsurf/mcp_config.json):
{
"mcpServers": {
"alterlab": {
"command": "npx",
"args": ["-y", "alterlab-mcp-server@latest"],
"env": {
"ALTERLAB_API_KEY": "sk_live_your_key_here"
}
}
}
}Install via Smithery
npx -y @smithery/cli install alterlab-mcp-server --client claudeGet Your API Key
Sign up free — $1 free balance on signup
Go to Dashboard → API Keys and copy your key
Paste it into the
ALTERLAB_API_KEYfield in your MCP config
Tools
alterlab_scrape — Scrape Any Webpage
Scrape a URL and return its content as markdown, text, HTML, or JSON. Automatically handles anti-bot protection with tier escalation. Returns markdown by default — optimized for LLM context windows.
"Scrape https://www.amazon.com/dp/B0BSHF7WHW and summarize the product"Parameter | Type | Default | Description |
| string | required | URL to scrape |
|
|
| Scraping mode |
| enum / string / enum / object |
| POST support (1.5x cost) and custom target headers |
|
|
| Output formats |
| object / string | — | LLM extraction (+$0.001) |
| enum | — |
|
| enum / string | — | BYOK LLM selection |
| boolean | — | Extraction behaviour |
| boolean / number / boolean | — | Response caching ( |
| boolean | | API default | Headless browser (forces Browser tier, $0.004) |
| boolean, string | — | Premium proxy (+$0.0002) and geo-targeting |
| boolean, boolean, string | — | Bring-your-own-proxy selection |
| boolean | — | Omit (recommended) = verify, fall back on invalid certs; |
| string | — | Selector / load-event waits |
| object[] (max 20) | — | Browser actions: |
| boolean | — | Add-ons (+$0.0002 / +$0.0004 / +$0.001) |
| boolean / 1-10 / boolean | — | Lazy-load handling |
| boolean | — | Rendering options |
| object | — | Filter for |
| UUID, object, object | — | Authenticated scraping |
| string, 300-7200 | — | Reuse cookies and exit IP across calls (paid plans) |
|
| — | Geo-targeting |
| object | — |
|
| object | — |
|
|
|
| Wait behaviour for long scrapes |
| number, number, boolean |
| Limits and raw output |
| boolean |
| Run a free cost estimate first |
Not exposed: source (dashboard tracking tag), sync (the tool is always synchronous), webhook_url (use alterlab_batch/alterlab_crawl webhooks). If a scrape outlives the ~85s synchronous window the tool returns a job_id; fetch it with alterlab_get_job.
alterlab_extract — Extract Structured Data
Extract structured fields from HTML, text or markdown content using pre-built profiles or custom JSON Schema. Returns clean JSON — ready for databases, spreadsheets, or downstream processing.
"Extract the product name, price, and rating from this Amazon page"Parameter | Type | Default | Description |
| string (max 500,000) | required | HTML, text or markdown you already have (this tool does not fetch a URL) |
|
|
| Type of |
| enum | — | Profile: |
| object | — | Custom JSON Schema for structured output |
| string | — | Natural language extraction instructions |
| enum / string | — | BYOK LLM selection |
| enum[] |
| Output formats |
| string, boolean | — | Context URL and provenance |
|
|
| Extraction result cache |
To scrape and extract in one step, use alterlab_scrape with extraction_schema.
Extraction profiles:
Product — name, price, currency, rating, reviews, availability, images, description
Article — title, author, published date, body text, featured image
Job Posting — title, company, location, salary, description, requirements
FAQ — question-answer pairs
Recipe — ingredients, instructions, prep time, servings
Event — name, date, location, description, organizer
alterlab_screenshot — Screenshot Any Page
Take a full-page screenshot of any URL. Returns a PNG image directly in the conversation — no URLs to copy, no files to download.
"Take a screenshot of our landing page at https://alterlab.io"Parameter | Type | Default | Description |
| string | required | URL to screenshot |
| string | — | CSS selector to wait for before capture |
| enum |
|
|
| number |
| Timeout in seconds (1-300) |
| boolean, string | — | Premium proxy and geo-targeting |
| UUID, object | — | Screenshot pages behind a login |
|
| — | Geo-targeting |
alterlab_estimate_cost — Estimate Before You Scrape
Check how much a scrape will cost before running it. Returns the predicted tier, cost per request, and confidence level.
"How much would it cost to scrape linkedin.com?"Parameter | Type | Default | Description |
| string | required | URL to estimate |
| enum |
| Scraping mode |
|
|
| POST costs 1.5x |
| boolean | |
| Include JS rendering cost |
| boolean |
| Include proxy cost / BYOP discount |
| boolean | — | Include add-on cost |
alterlab_get_job — Fetch an Async Job
Fetch the status and result of a scrape that returned a job_id (a scrape that outlived the synchronous wait window). Parameter: job_id (string, required).
alterlab_check_balance — Check Your Credits
Check your account balance, total deposited, and total spent. No parameters needed.
"Check my AlterLab balance"alterlab_list_sessions — List Stored Sessions
List all stored sessions for authenticated scraping. Sessions contain cookies for specific domains, allowing you to scrape content behind login walls.
"List my stored sessions"alterlab_create_session — Create a Session
Create a new stored session with cookies from a logged-in browser. The session is stored securely and can be reused across multiple scrape requests.
"Create an Amazon session with these cookies: session-id=abc123, session-token=xyz789"Parameter | Type | Default | Description |
| string | required | Human-readable name (e.g., "My Amazon Account") |
| string | required | Domain (e.g., "amazon.com") |
| boolean | required | Must be |
|
| — | Cookies as key-value pairs or |
|
| — | Custom headers (e.g. a User-Agent) |
| string | — | Expiry (ISO 8601) and notes |
| boolean |
| Health checks and notifications |
| UUID, boolean | — | Organization sharing |
alterlab_validate_session — Validate a Session
Check whether a stored session is still active and its cookies are valid.
"Is my Amazon session still valid?"Parameter | Type | Default | Description |
| string (UUID) | required | Session ID to validate |
alterlab_delete_session — Delete a Session
Permanently delete a stored session and its cookies.
"Delete session abc-123-def"Parameter | Type | Default | Description |
| string (UUID) | required | Session ID to delete |
Authenticated Scraping
AlterLab MCP supports scraping pages that require authentication. This enables AI agents to access user-specific content like order histories, account dashboards, and member-only pricing.
How It Works
Create a session with cookies from a logged-in browser using
alterlab_create_sessionScrape authenticated pages by passing the
session_idtoalterlab_scrapeManage sessions with list, validate, and delete tools
Example: Check Amazon Prime Pricing
User: "What's my Prime member price for this product?"
Claude: [calls alterlab_list_sessions → finds Amazon session]
Claude: [calls alterlab_scrape with session_id for authenticated pricing]
Claude: "The Prime member price is $24.99 (public price: $34.99)"Inline Cookies vs Stored Sessions
Stored sessions (
session_id): Best for repeated access to the same domain. Create once, reuse across requests.Inline cookies (
cookies): Best for one-off authenticated requests where you don't need to save the session.
What Can You Do with AlterLab MCP?
Research and Analysis
Ask Claude to scrape and analyze websites in real-time:
"Scrape the top 5 results from this Google search and summarize them"
"Extract all product prices from this Amazon category page"
"Compare the pricing pages of these 3 competitors"
Code Generation with Real Data
Let Cursor or Windsurf fetch live data while building:
"Scrape this API documentation page and generate TypeScript types from it"
"Extract the color palette from this website and create a Tailwind config"
"Screenshot this design and recreate it in React"
Content and SEO
Use Claude to analyze content at scale:
"Scrape this blog post and suggest improvements for SEO"
"Extract all FAQ entries from this help center and create a structured dataset"
"Compare our landing page to the competitor's and identify gaps"
Monitoring and Alerts
Build agentic workflows that watch the web:
"Check if this product is back in stock"
"Scrape this page daily and alert me when the price drops below $50"
"Monitor this job board for new senior engineering positions"
Pricing — Pay-As-You-Go Web Scraping
No subscriptions. No monthly minimums. Add balance and use it whenever you need it.
Base Scraping Costs
Tier | Method | Cost per Request | Use Case |
Curl | Direct HTTP | $0.0002 | Static pages, RSS feeds, public APIs |
HTTP | TLS fingerprinting | $0.0003 | Sites with basic bot detection |
Stealth | Browser impersonation | $0.002 | Cloudflare, DataDome, PerimeterX protected sites |
Light JS | JSON extraction | $0.0025 | Server-rendered pages needing structured data |
Browser | Headless Chromium | $0.004 | Full JavaScript SPAs (React, Angular, Vue) |
Optional Add-Ons
Add-On | Extra Cost | Description |
JavaScript Rendering | forces Browser tier | No separate add-on: |
PDF Generation | +$0.0004 | PDF of the rendered page |
LLM Extraction / Embeddings | +$0.001 |
|
POST requests | x1.5 |
|
Own proxy (BYOP) | -20% |
|
Search | $0.001 / $0.004 | duckduckgo / google and bing engines |
Screenshot Capture | +$0.0002 | Full-page PNG screenshot |
Premium Proxy | +$0.0002 | Geo-targeted residential proxy (195+ countries) |
OCR Text Extraction | +$0.001 | Extract text from images on the page |
$1 = 5,000 light scrapes. New accounts get $1 free balance on signup.
Environment Variables
Variable | Required | Default | Description |
| Yes | — | Your API key (get one free) |
| No |
| API base URL (for self-hosted or development) |
Frequently Asked Questions
How do I add web scraping to Claude, Cursor, or Windsurf?
Install the AlterLab MCP server. For Claude Code, run claude mcp add alterlab -- npx -y alterlab-mcp-server@latest and set your ALTERLAB_API_KEY. For Claude Desktop, Cursor, or Windsurf, add the JSON config block to your MCP settings file. Once configured, your AI assistant can scrape any URL, extract structured data, and take screenshots directly in conversation.
Can Claude scrape websites that are behind Cloudflare or anti-bot protection?
Yes. AlterLab automatically handles Cloudflare, DataDome, PerimeterX, Akamai, and other anti-bot systems. It uses a multi-tier approach that starts with the cheapest method and escalates only when blocked. You don't need to configure anything — anti-bot bypass is fully automatic.
What is an MCP server and how does it work with Claude?
MCP (Model Context Protocol) is Anthropic's open standard for connecting AI assistants to external tools and data sources. An MCP server is a small program that exposes tools — like web scraping — that Claude, Cursor, or Windsurf can call during a conversation. The AlterLab MCP server gives your AI assistant 23 tools: scrape, extract, screenshot, crawl, search, map, batch scraping, session management, beta features, and more.
How is AlterLab different from Firecrawl, ScrapingBee, or Apify MCP servers?
AlterLab starts at $0.0002 per request — 5-20x cheaper than most scraping APIs — because it only uses expensive browser rendering when a site actually requires it. Smart tier escalation means you pay for what each site needs, not the maximum. AlterLab also includes built-in structured data extraction with pre-built profiles (product, article, job posting, etc.).
Can I scrape Amazon, Walmart, and other e-commerce sites from Claude?
Yes. AlterLab handles all major e-commerce anti-bot protection. Use the alterlab_extract tool with extraction_profile: "product" to get structured JSON: product name, price, currency, rating, review count, availability, and images — ready for analysis, comparison, or data pipelines.
Can Cursor scrape documentation and generate code from it?
Yes. With AlterLab MCP installed in Cursor, you can ask it to scrape API documentation, library docs, or any reference page and generate TypeScript types, API clients, or component code from the live content. This is more reliable than relying on the LLM's training data, which may be outdated.
Does AlterLab MCP work with JavaScript-heavy sites (React, Angular, Vue)?
Yes. Use render_js: true or set mode: "js" to enable full headless Chromium rendering. AlterLab renders the complete page including all JavaScript, waits for dynamic content to load, then extracts content from the fully rendered DOM. This works for React, Angular, Vue, Next.js, and any other JavaScript framework.
What output format is best for AI and LLM context windows?
Use markdown (the default). It preserves document structure — headings, tables, lists, links — while being 60-80% smaller than raw HTML. Claude, GPT-4, and other LLMs process markdown significantly better than HTML. AlterLab's markdown output is specifically optimized for LLM context windows.
Is there rate limiting?
Free-tier accounts have rate limits. Adding any balance removes rate limits. The MCP server includes automatic retry with exponential backoff for transient rate limit errors (429).
Can I use this MCP server for large-scale scraping?
Yes. For parallel scraping, use alterlab_batch to scrape up to 100 URLs in a single request — much faster than sequential calls. For crawling entire domains, use alterlab_crawl. You can also build agentic workflows that scrape many URLs sequentially, or use the n8n integration for workflow automation.
Error Handling
The MCP server returns helpful error messages with suggested next actions:
Error | What Happens | Suggested Action |
401 Unauthorized | Invalid API key | Check |
402 Insufficient Credits | Balance too low | Run |
403 Forbidden | Site blocked the request | Try |
429 Rate Limited | Too many requests | Automatic retry with backoff |
504 Gateway Timeout | Scrape took too long | Increase |
Agentic Workflows — AI Agents That Scrape the Web
AlterLab MCP turns any AI agent into a web-capable agent. Instead of relying on stale training data, your agent can fetch live information from any website during execution.
Use Cases for AI Agents
Research agents — scrape multiple sources, cross-reference facts, generate reports with citations
Data pipeline agents — extract structured product/pricing/job data on a schedule
Competitive intelligence — monitor competitor pages, track pricing changes, detect new features
Content generation — scrape real data to ground LLM output in facts, not hallucinations
Lead enrichment — scrape company websites to enrich CRM records with live data
Compliance monitoring — check regulatory pages, terms of service, and policy updates
Compatible AI Frameworks and Clients
Works with any tool that supports MCP (Model Context Protocol):
Claude Desktop / Claude Code — Anthropic's AI assistant
Cursor — AI-powered code editor
Windsurf — Codeium's AI IDE
Cline — VS Code AI assistant
GitHub Copilot — via MCP configuration
Custom agents — any framework using the MCP SDK (Python, TypeScript, Go)
n8n — workflow automation via n8n-nodes-alterlab
Contributing
git clone https://github.com/RapierCraft/alterlab-mcp-server.git
cd alterlab-mcp-server
npm install
npm run buildSupport
License
Available Tools
26 toolsalterlab_batchA
Scrape up to 100 URLs in parallel with a single request — much faster and more efficient than sequential alterlab_scrape calls. Each URL automatically gets anti-bot bypass protection (Cloudflare, DataDome, etc.) at its own tier level (tier 1 $0.0002 ... tier 4 $0.004 per URL). Returns a batch_id immediately — use alterlab_batch_status to poll results. Each URL can have its own mode, method/body, formats, extraction options, advanced options, location and cost_controls. Batch-level session_id, extraction_* and export apply to the whole batch. Credits are pre-debited based on estimated cost; unused credits are refunded on completion. Use this whenever you need to scrape more than 2-3 URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | List of URLs to scrape (max 100) | |
| export | No | Export batch results to a storage integration when the batch finishes | |
| session_id | No | UUID of a stored session applied to every URL in the batch (see alterlab_list_sessions) | |
| webhook_url | No | Webhook URL to receive batch.completed event when all jobs finish | |
| extraction_prompt | No | Batch-level natural language extraction instruction | |
| extraction_schema | No | Batch-level JSON schema for structured extraction applied to every URL | |
| extraction_profile | No | Batch-level pre-built extraction profile applied to every URL | |
| extraction_provider | No | Batch-level BYOK LLM provider for extraction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the call is asynchronous (returns batch_id immediately, poll later), the tiered per-URL pricing model, automatic anti-bot bypass, and the credit pre-debit/refund lifecycle. That is a rich, non-obvious behavioral profile an agent needs to plan the workflow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling comparison are front-loaded, then cost, async behavior, and scoping follow in a logical order. It is dense but every sentence carries operational information; about seven sentences is on the heavier side for a description whose schema already documents everything.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with deep nested objects, no annotations and no output schema, the description covers purpose, triggering condition, async return, cost mechanics and result retrieval path. It does not detail failure/partial-success handling of the batch, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine scoping semantics the schema does not state in one place: which settings are per-URL (mode, method/body, formats, extraction, advanced, location, cost_controls) vs batch-level (session_id, extraction_*, export). This prevents mis-nesting of options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Scrape up to 100 URLs in parallel with a single request.' It explicitly distinguishes itself from the sequential sibling alterlab_scrape, so an agent can choose between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete decision threshold ('use this whenever you need to scrape more than 2-3 URLs') and names the exact follow-up tool (alterlab_batch_status) for polling. It does not, however, disambiguate itself from the other similarly-named sibling alterlab_batch_scrape, which is a real selection risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_batch_scrapeA
Scrape multiple URLs simultaneously and get all results back in one call — no polling required. Unlike alterlab_batch (async with batch_id polling), this returns all results inline when complete. Best for 2-20 URLs where you need results immediately. For 20+ URLs, use alterlab_batch instead. Uses concurrent scraping (controlled by max_concurrent) for speed. Shows per-URL status, content preview, and a total cost summary at the end. Handles partial failures gracefully — failed URLs show error details, successful ones show content.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | List of URLs to scrape (max 20). All results are returned synchronously. | |
| formats | No | Output formats applied to every URL. 'markdown' is best for LLM consumption. | |
| timeout | No | Request timeout in seconds per URL (1-300). | |
| render_js | No | Render JavaScript using headless browser for all URLs. Required for JS-heavy sites. Forces tier 4 ($0.004/req). | |
| use_proxy | No | Route all requests through premium proxy (+$0.0002/req). | |
| max_concurrent | No | Maximum number of URLs to scrape in parallel (1-10, default 3). Higher values finish faster but consume more concurrent connections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses synchronous no-polling behavior, concurrent scraping via max_concurrent, graceful partial-failure handling, and what a call returns (per-URL status, preview, cost summary). It omits permission/auth requirements and any rate-limit behavior, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key differentiator (synchronous, no polling) in the first sentence and keeps each subsequent sentence purposeful. Slightly longer than necessary — the cost-summary and preview details could be trimmed — but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must cover return values, and it does: per-URL status, content preview, error details on failure, and a total cost summary. Auth/permission prerequisites are the main remaining gap for a paid scraping endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, including defaults and ranges. The description adds only a light gloss on max_concurrent ('controlled by max_concurrent') and return behavior, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scrape) and resource (multiple URLs) and immediately distinguishes itself from the sibling alterlab_batch by contrasting synchronous inline return vs async batch_id polling. An agent can tell these two tools apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: best for 2-20 URLs needing immediate results, and 'For 20+ URLs, use alterlab_batch instead.' Both the when and the when-not, with a named alternative, are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_batch_statusA
Poll the status and results of a submitted batch. Call this after alterlab_batch to check progress and retrieve scraped content. Status values: processing, completed, failed, partially_failed. When completed, results contains the content for each URL.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | Yes | Batch ID returned by alterlab_batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return behavior with status values and when results are returned. No annotations are provided, so the description carries the burden; it covers the key behaviors for a polling tool, though it doesn't explicitly state non-destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences that are well-structured, front-loading the purpose and then providing status values and results. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers usage, status values, and result content. No output schema, but the description explains what to expect. For a simple polling tool with one parameter, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (batch_id) with 100% schema description coverage. The tool description reinforces that the batch_id comes from alterlab_batch, but adds no new semantic detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (poll) and resource (status and results of a submitted batch), and it distinguishes from siblings by specifying that this is to be used after alterlab_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call after alterlab_batch, providing clear usage context. Does not mention when not to use or alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_check_balanceA
Check your AlterLab account balance, status, and credit usage. Call this before expensive operations (batch scrapes, large crawls) to verify sufficient funds. Returns current balance in dollars, balance status (healthy/low/critical/exhausted), total deposited, and total spent. For a full spending breakdown by time window and top domains, use alterlab_get_usage instead. No parameters required — uses your API key for identification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes exactly what is returned (balance, status, deposited, spent) and notes that no parameters are required, using API key for identification. No annotations exist, so description fully covers behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words, front-loaded with purpose, and includes a tip and an alternative reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains return values and provides context about when to use and alternative tools, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, and the description explicitly states 'No parameters required — uses your API key for identification,' adding value beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks account balance, status, and credit usage. It distinguishes from sibling alterlab_get_usage by noting that tool provides a full spending breakdown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises calling before expensive operations like batch scrapes or large crawls. Also provides an alternative tool (alterlab_get_usage) for detailed breakdown, giving both when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_crawlA
Crawl an entire website for RAG, index all pages on a site, or build a knowledge base from a domain. Automatically bypasses anti-bot protection on every page — works on Cloudflare-protected sites. Discovers URLs via sitemap parsing and link extraction, then scrapes each page asynchronously. Each page is billed at the tier that succeeds (tier 1 $0.0002 ... tier 4 $0.004). Returns content as clean markdown, text, or structured data. Returns a crawl_id immediately — use alterlab_crawl_status to poll results. Use include_patterns/exclude_patterns to scope the crawl to specific sections; budget to allocate pages per path. Use render_js='auto' for mixed sites to save 30-60% vs always rendering. Supports extraction_schema, extraction_profile or extraction='auto' to extract structured data from every page. Use cost_controls to cap total credits or pin the scraping tier for all pages. Use sitemap_path to specify a non-standard sitemap location. Use headers to inject custom HTTP headers (e.g., Authorization) into every page request. Use change_tracking to detect page changes between runs; webhook/webhook_url for completion events.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Start URL for the crawl | |
| cache | No | Serve pages from the response cache when available | |
| delay | No | Politeness delay between page requests, in seconds (0-30) | |
| budget | No | Per-path page budget: glob pattern -> max pages, most specific pattern wins, '*' is the catch-all (e.g., {"/products/*": 100, "/blog/*": 50, "*": 5}). max_pages stays the hard cap. | |
| formats | No | Output formats for each scraped page. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines. | |
| headers | No | Custom HTTP headers injected into every page request during the crawl (e.g., {"Authorization": "Bearer token"}). Maximum 50 headers. | |
| sitemap | No | Sitemap mode: include (default), skip (link extraction only), only (sitemap URLs only) | include |
| storage | No | Where crawl results are stored (API default 'redis') | |
| timeout | No | Per-page request timeout in seconds (1-300) | |
| webhook | No | Detailed webhook config (events, signing secret, headers); use instead of webhook_url | |
| priority | No | Crawl prioritisation hints (keywords, boost_patterns, demote_patterns) | |
| wait_for | No | CSS selector to wait for before extracting each page (e.g., '#main-content'). Applied to all pages in the crawl. | |
| cache_ttl | No | Cache TTL in seconds (60-86400). Requires cache=true | |
| max_depth | No | Maximum link-following depth from start URL (0 = start page only) | |
| max_pages | No | Maximum number of pages to scrape | |
| render_js | No | Render JavaScript on crawled pages. true=always (Tier 4, $0.004/page), false=never, auto=smart detection per page | |
| use_proxy | No | Route all crawl requests through premium proxy (+$0.0002/page) | |
| extraction | No | Set to 'auto' for automatic page-type detection and extraction without a user-defined schema. Mutually exclusive with extraction_schema. | |
| screenshot | No | Capture a screenshot of each crawled page (requires render_js) | |
| webhook_url | No | Webhook URL to notify on crawl completion | |
| sitemap_path | No | Explicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location. | |
| cost_controls | No | Cost controls for the entire crawl — cap total spend or pin the scraping tier | |
| force_refresh | No | Bypass the cache and fetch every page fresh | |
| depth_strategy | No | Link-discovery strategy (API default 'sequential') | |
| respect_robots | No | Respect robots.txt rules for the target domain | |
| change_tracking | No | Track page changes between crawls | |
| max_concurrency | No | Maximum concurrent pages to scrape simultaneously | |
| exclude_patterns | No | Glob patterns — skip URLs whose path matches any (e.g., ['/tag/*', '/author/*']) | |
| extraction_model | No | Per-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only. | |
| include_patterns | No | Glob patterns — only scrape URLs whose path matches at least one (e.g., ['/blog/*', '/docs/*']) | |
| extraction_schema | No | JSON schema for structured extraction on each page | |
| extraction_profile | No | Pre-defined extraction profile applied to every crawled page. 'auto' detects the page type automatically. | |
| include_subdomains | No | Include links to subdomains during discovery | |
| extraction_provider | No | BYOK LLM provider used for extraction on each page | |
| extraction_template | No | Alias for extraction_profile (mutually exclusive with it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers substantial behavioral context: anti-bot/Cloudflare bypass, asynchronous per-page scraping, immediate crawl_id return with polling requirement, tiered per-page billing with an actual price ladder, and cost-control semantics. It omits auth/permission requirements and what happens on partial failure, so it falls short of fully self-describing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence, then a tight sequence of feature-specific sentences, each covering a distinct capability. It is necessarily long for 35 parameters and every sentence earns its place, though the single dense paragraph with many repeated 'Use X' clauses is harder to scan than a structured list would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers returns: markdown/text/structured content and an immediate crawl_id for polling. It also documents billing and major option groups, so the agent has what it needs to call the tool. Minor gaps remain around auth requirements and the exact shape of change-tracking/webhook outputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3, but the description adds genuine usage meaning beyond it: budget as per-path allocation, render_js='auto' saving 30-60%, cost_controls tiers, headers injection (e.g. Authorization), sitemap_path for non-standard locations, and change_tracking/webhook behaviors. It stops short of documenting most parameters' syntax, so it is additive rather than exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('crawl') and scope ('an entire website'/'all pages on a site'), plus the concrete goals (RAG, indexing, knowledge base). The 'entire website' framing implicitly distinguishes it from the single-page alterlab_scrape sibling, so an agent can tell the two apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear use-case context and explicitly routes the agent to alterlab_crawl_status for polling, and repeatedly says when to use individual features (render_js='auto' for mixed sites, include/exclude_patterns to scope, cost_controls to cap spend). It does not, however, state when NOT to use this tool versus alterlab_scrape / alterlab_map / alterlab_batch_scrape, which is the main missing routing guidance for a 35-param primitive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_crawl_cancelA
Cancel an ongoing crawl and refund unused pre-debited credits. Already-scraped pages are kept and available via alterlab_crawl_status. Cancelled crawls cannot be resumed.
| Name | Required | Description | Default |
|---|---|---|---|
| crawl_id | Yes | Crawl ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It discloses key behaviors: cancellation stops crawling, refunds credits, keeps already-scraped pages (via alterlab_crawl_status), and prohibits resumption. Sufficiently transparent for a simple cancellation tool, though auth or rate limits are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. First sentence captures primary action and refund. Second sentence adds important details about persistence and non-resumability. Efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema or annotations, the description fully covers what the tool does, what happens to scraped pages, and what cannot be done afterwards. No significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'crawl_id' with schema coverage 100%. Description adds no extra meaning beyond the schema's 'Crawl ID to cancel'. Baseline 3 is appropriate as schema already documents the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'cancel', resource 'ongoing crawl', and additional action 'refund unused pre-debited credits'. Distinguishes from sibling tools like alterlab_crawl and alterlab_crawl_status by specifying cancellation and refund behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies when to use (to stop a crawl) and notes that cancelled crawls cannot be resumed, but does not explicitly state when not to use or mention alternative tools. Provides context about already-scraped pages but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_crawl_statusA
Poll the status and results of an ongoing or completed crawl. Call this after alterlab_crawl to check progress and retrieve scraped pages. Status values: queued, running, completed, failed, cancelled. When completed, results contains the scraped page content.
| Name | Required | Description | Default |
|---|---|---|---|
| crawl_id | Yes | Crawl ID returned by alterlab_crawl |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains polling behavior and that results are present when completed, but does not specify idempotency, whether results persist after first read, or any side effects. Adequate but not deep.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Front-loaded with purpose, then adds details on status values and output. Excellent conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description explains that 'results contains the scraped page content' when completed. Lists status values. Could mention if results are paginated or size limits, but complete enough for a simple status poll tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds context by noting crawl_id is returned by alterlab_crawl, helping the agent understand the parameter source. Slight improvement over bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it polls status and results of a crawl, explicitly naming the action and resource. It distinguishes itself from siblings like alterlab_crawl and alterlab_crawl_cancel by specifying it is the follow-up call for progress checking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this after alterlab_crawl' and lists status values, providing clear context. Does not include explicit when-not-to-use or alternative tools, but given sibling set, this is the only status poll for crawls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_create_sessionA
Create a new stored session for authenticated scraping. Provide cookies from a logged-in browser session to enable scraping behind login walls. The session is stored securely and can be reused across multiple scrape requests via session_id. Requires consent=true (explicit GDPR consent to store the cookies); optional headers, expires_at, notes, auto_refresh/notification flags and organization sharing are supported.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name for this session (e.g., 'My Amazon Account') | |
| notes | No | Free-text notes about this session | |
| domain | Yes | Domain this session is for (e.g., 'amazon.com') | |
| shared | No | Share the session with organization members immediately (API default false) | |
| consent | Yes | Explicit GDPR consent from the account owner to store these session cookies. Must be true — the API rejects session creation with CONSENT_REQUIRED otherwise. Only set true after the user has agreed to AlterLab storing their cookies. | |
| cookies | No | Cookies for authentication. Cookies as a {name: value} object (e.g. {"session-id": "abc123"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}. | |
| headers | No | Custom headers sent with this session (e.g., a User-Agent or Authorization header) | |
| expires_at | No | Session expiry in ISO 8601 format (e.g., '2026-12-31T23:59:59Z') | |
| organization_id | No | Organization to assign the session to (org admins only) | |
| notify_on_failure | No | Notify when session validation fails (API default true) | |
| auto_refresh_enabled | No | Enable proactive expiry detection and health checks (API default true) | |
| notify_before_expiry | No | Notify when the session is about to expire (API default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does it well: it discloses that cookies are stored securely, that the session is reusable via session_id, that consent=true is mandatory (API rejects with CONSENT_REQUIRED), and that org sharing and auto-refresh/notification flags exist. It doesn't cover what happens on failed validation beyond the notify flag, but this is solid behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and the login-wall use case before prerequisites. The final sentence is a somewhat dense enumeration of optional parameters, but nothing is wasted and it remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no annotations and no output schema, the description covers purpose, prerequisites, consent semantics, and reusability. It implies the returned session_id but doesn't explicitly state what the caller gets back or any failure modes beyond consent — a minor gap, though no output schema exists to fill it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters (including nested cookie metadata and the important consent semantics) are already documented in the schema. The description echoes the consent requirement and enumerates optional features, adding orientation but no syntax or meaning beyond the schema — the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create a new stored session') and immediately scopes it to authenticated scraping, which cleanly separates it from the session-management siblings (list/get/validate/update/refresh/delete). The purpose and the persistence model are unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the trigger condition clearly: use this when you need to scrape behind login walls and can supply cookies from a logged-in browser session. It also surfaces the consent prerequisite. It stops short of naming explicit alternatives or when-not-to-use cases (e.g. using a one-off cookie header on alterlab_scrape instead), so it's strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_delete_sessionA
Delete a stored session. This permanently removes the session and its cookies. Use this when a session is no longer needed or has been compromised.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | UUID of the session to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full weight. It discloses that the deletion is permanent and removes cookies, which are critical behavioral traits. No contradictory or missing safety cues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main action, and contains no superfluous words. Every sentence adds value: purpose and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, no output schema, and no annotations, the description is complete. It covers action, effect, and appropriate use case, leaving no obvious gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the single parameter (session_id as a UUID). The description does not add new semantic information beyond the schema; it simply references the session. With 100% schema coverage, the baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Delete a stored session' and emphasizes permanence, distinguishing it from sibling session tools like create, get, update, or refresh. The verb 'delete' and resource 'session' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use guidance: 'Use this when a session is no longer needed or has been compromised.' This is explicit context, though it does not formally exclude alternatives. However, the purpose is sufficiently distinct from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_disable_beta_featureA
Opt out of a beta feature on your AlterLab account. This operation is idempotent — calling it when not opted in returns success. GA (generally available) features cannot be disabled.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | URL-safe slug of the beta feature to opt out of (e.g., 'v2-extraction', 'stealth-v3'). Use alterlab_list_my_beta_features to see your currently active slugs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses idempotency ('calling it when not opted in returns success') and the limitation on GA features. It does not mention side effects, auth needs, or error behavior, but the operation is simple enough that this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the purpose, then adding idempotency and constraint. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, idempotency, and a constraint. It also references a sibling tool for listing slugs. Minor gaps: no mention of return values or error states, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% since the parameter 'slug' already has a description. The tool description adds no new semantic detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Opt out of a beta feature on your AlterLab account.' It uses a specific verb-resource pair and distinguishes from sibling tools like 'alterlab_enable_beta_feature' by noting that GA features cannot be disabled.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context by mentioning idempotency and the constraint that GA features cannot be disabled. It also directs users to 'alterlab_list_my_beta_features' to find valid slugs. However, it does not explicitly contrast with enabling or list all alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_enable_beta_featureA
Opt in to a beta feature on your AlterLab account. Beta features are experimental capabilities available before general release. This operation is idempotent — calling it when already opted in returns success. Use alterlab_list_beta_features to discover available feature slugs.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | URL-safe slug of the beta feature to opt in to (e.g., 'v2-extraction', 'stealth-v3'). Use alterlab_list_beta_features to see available slugs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description mentions idempotency and experimental nature, but does not disclose potential side effects, permissions required, or reversibility (e.g., via 'alterlab_disable_beta_feature'). More behavioral context would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two concise sentences with no wasted words. It front-loads the action and efficiently adds necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description adequately covers purpose, parameter guidance, and a related sibling. It could mention the response format, but it's not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds value by providing an example slug format and referencing the list endpoint for discovery, going beyond the schema's minimal description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Opt in to a beta feature'), the resource ('AlterLab account'), and distinguishes it from siblings like 'disable_beta_feature' and 'list_beta_features'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to use 'alterlab_list_beta_features' to discover available slugs, guiding when to use the tool. It does not explicitly state when not to use it, but the context is sufficient for a simple opt-in tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_estimate_costA
Preview the cost of scraping a URL before committing — no credits charged. Returns the predicted anti-bot tier, estimated cost per request, and confidence level. Call this before scraping protected or unfamiliar sites to avoid surprises. Tier 1 (curl): $0.0002. Tier 2 (http): $0.0003. Tier 3 (stealth): $0.002. Tier 3.5 (lightjs): $0.0025. Tier 4 (full browser): $0.004. Tier 5 (captcha solver): $0.02. Use render_js, use_proxy, screenshot, generate_pdf, ocr and method to see how options affect cost.
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | Include the OCR add-on (+$0.001) | |
| url | Yes | URL to estimate scraping cost for | |
| mode | No | Scraping mode | auto |
| method | No | HTTP method. POST requests cost 1.5x the base tier price. | |
| formats | No | Output formats to include in the estimate. Passed to the API but does not currently affect the cost estimate — the endpoint uses URL-pattern heuristics only. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines. | |
| render_js | No | Enable JS rendering (forces Tier 4 minimum, $0.004 — no separate add-on charge) | |
| use_proxy | No | Include premium proxy cost (+$0.0002) | |
| screenshot | No | Include the screenshot add-on (+$0.0002) | |
| generate_pdf | No | Include the PDF add-on (+$0.0004) | |
| use_own_proxy | No | Price the request with your own proxy integration (20% BYOP discount) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that no credits are charged, that it returns a predicted anti-bot tier, cost, and confidence, and it enumerates the exact per-tier pricing and add-on effects on cost — the key behavior an agent needs to interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and every subsequent sentence (the tier price table, the options hint) is cost-relevant reference material, not padding. The price enumeration is dense but each line maps directly to behavior the caller must interpret.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-param tool with no output schema and no annotations, the description compensates fully by naming the return fields (tier, cost, confidence) and the zero-charge guarantee, so an agent can invoke and interpret it without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value beyond the schema by listing tier prices referenced by the option params and by instructing which params to use to see cost effects (render_js, use_proxy, screenshot, generate_pdf, ocr, method). It stops short of explaining each param's syntax, hence 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Preview the cost of scraping a URL before committing — no credits charged.' It is immediately distinguishable from the many action siblings (alterlab_scrape, alterlab_batch_scrape, etc.) because it is explicitly a non-executing preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rule: 'Call this before scraping protected or unfamiliar sites to avoid surprises.' It does not state a when-not condition (e.g. no need for already-known cheap sites), but no competing estimate sibling exists, so the routing guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_extractA
Extract product data, scrape prices, get structured data from any page content, or pull specific fields like names, emails, and ratings from HTML. Runs AlterLab's extraction pipeline on raw HTML, text, or markdown you already have — does NOT scrape a URL. For scraping + extraction in one step, use alterlab_scrape with extraction_schema instead. Profiles: 'product' (price, title, reviews), 'article' (title, author, body), 'job_posting', 'faq', 'recipe', 'event', 'ecommerce_homepage', 'directory_listing'. Returns JSON data. Use extraction_prompt for natural language extraction (LLM-powered). Use cache='only' to retrieve a previously cached result without calling the LLM.
| Name | Required | Description | Default |
|---|---|---|---|
| cache | No | Cache control for LLM extraction results. 'auto': return cached result if available (default). 'skip': bypass cache lookup, always call LLM (result is still stored). 'only': return cached result or 404 if not cached — never calls the LLM. | auto |
| content | Yes | Raw content to extract from — HTML, text, or markdown. Bring your own pre-fetched content; this endpoint does NOT scrape a URL. | |
| formats | No | Output formats for content transformation. 'json' is best for structured extraction. 'content' returns filtered/cleaned content. 'raw' returns the unprocessed response body. | |
| evidence | No | Include field provenance/evidence for extracted fields (which part of the content each field came from) | |
| cache_ttl | No | TTL for caching this extraction result, in seconds. Defaults to server setting (3600s). Max 86400s (24 hours). | |
| source_url | No | Original URL of the content (for context only — not fetched). Helps the extractor understand the content's domain. | |
| content_type | No | Type of the provided content | html |
| extraction_model | No | Per-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only. | |
| extraction_prompt | No | Natural language instructions for LLM extraction (e.g., 'Extract all product prices and ratings'). Charged at LLM extraction rate when provided. | |
| extraction_schema | No | Custom JSON Schema for extraction. Fields are mapped from content. Overrides extraction_profile when provided | |
| extraction_profile | No | Pre-defined extraction profile. 'product' extracts price/title/reviews, 'article' extracts title/author/body, etc. 'auto' detects the page type. Mutually exclusive with extraction_template. | |
| extraction_provider | No | LLM provider to use for extraction. Selects the matching BYOK key registered at /dashboard/settings/llm-keys. When omitted, the most recently used registered key is used. | |
| extraction_template | No | Shorthand alias for extraction_profile — selects the same pre-built schema template. Mutually exclusive with extraction_profile. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose key traits: it does not fetch URLs, it returns JSON data, and cache='only' never invokes the LLM. It does not mention auth/BYOK requirements or rate limits, but those are partially covered by the schema's extraction_provider description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the negative scope early, then terse routing sentences. Slightly redundant opening with three synonymous phrasings ('extract product data, scrape prices, get structured data'), but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with a nested extraction_schema and no output schema, the description covers the essential calling context: it must receive pre-fetched content, returns JSON, and lists available profiles. Minor gaps remain around provider/model selection behavior, but the schema covers those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters including profiles, cache modes, and evidence. The description restates profile contents ('product' (price, title, reviews)) and cache behavior already present in the schema, adding little new meaning beyond the scraping-vs-extraction distinction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource with concrete examples of extractable fields (names, emails, ratings, prices), plus an explicit negative scope: 'Runs AlterLab's extraction pipeline on raw HTML, text, or markdown you already have — does NOT scrape a URL.' It clearly distinguishes itself from the alterlab_scrape sibling by naming it directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use alternatives: 'For scraping + extraction in one step, use alterlab_scrape with extraction_schema instead,' plus routing guidance for extraction_prompt (natural language/LLM) and cache='only' (retrieve cached result without LLM). The conditions that select each path are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_get_jobA
Fetch the status and result of an asynchronous scrape job by job_id. Use this when alterlab_scrape or alterlab_screenshot returns a job_id instead of content (a long-running scrape that outlived the synchronous wait window). Status values: queued, processing, succeeded, failed, rejected (rejected = not processed due to insufficient balance; stop polling and check the balance). Polling is free; do not re-run the scrape, which would be billed again.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job ID returned by an async or downgraded scrape (alterlab_scrape reports it when a scrape outlives the ~85s synchronous window) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose key behavioral traits: the polling cost model ('Polling is free'), the billing consequence of misuse, and the meaning of each terminal status, including 'rejected' due to insufficient balance. It does not cover permissions/auth or the shape of the returned result, leaving some gaps for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the usage condition, then the status semantics and the cost warning. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by enumerating the five status values and clarifying the terminal 'rejected' state. For a single-parameter polling tool, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is a single parameter, so the schema already documents job_id fully. The description still adds value by explaining the provenance of the ID (an async or downgraded scrape outliving the ~85s synchronous window), reinforcing the schema's own note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the status and result of an asynchronous scrape job by job_id') and explicitly distinguishes itself from the siblings that generate jobs (alterlab_scrape, alterlab_screenshot). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('when alterlab_scrape or alterlab_screenshot returns a job_id instead of content') and a clear directive for the terminal case ('rejected ... stop polling and check the balance'). It also warns against the wrong action (do not re-run the scrape, which would be billed again), which is strong when-to/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_get_sessionA
Get detailed information about a specific stored session. Returns session status, cookie names, usage statistics (total requests, success rate), expiry info, and notes. Use this to inspect a session before deciding to validate, refresh, or delete it.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | UUID of the session to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the data returned (status, cookie names, usage stats, expiry, notes) and implies a read operation. It does not mention side effects, auth, or rate limits, but for a simple get operation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states function and return, second gives usage guidance. No wasted words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter, full schema coverage, no output schema, and clear sibling context (CRUD for sessions), the description fully covers what an agent needs to know to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (session_id) with 100% schema coverage (UUID format). The description adds context for why the parameter is needed ('inspect a session') beyond the schema, providing extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get detailed information about a specific stored session' and lists specific return fields (status, cookie names, usage statistics, expiry info, notes). It distinguishes from sibling tools by saying 'inspect a session before deciding to validate, refresh, or delete it.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to inspect a session before deciding to validate, refresh, or delete it.' This gives clear context for when to use. It doesn't explicitly exclude scenarios, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_get_usageA
Get account usage for the current billing period — balance, credits consumed this period, account tier and entitlement source. Use this to track spend against your plan; use alterlab_check_balance for deposit and spend totals. No parameters required — uses your API key for identification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the identification mechanism ('uses your API key') and the exact data returned, which is the main behavioral concern for a zero-argument read tool. It stops short of explicitly declaring the operation read-only or noting any rate limiting, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose and payload first, then the sibling routing rule, then the no-parameter/auth note. Every sentence adds information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing the returned fields. For a simple no-argument read tool with a named alternative, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing to disambiguate; the description reinforces this with 'No parameters required.' Baseline for a zero-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get account usage for the current billing period') and enumerates the returned fields (balance, credits consumed, tier, entitlement source). It is clearly distinguishable from the sibling alterlab_check_balance, which is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit usage rule: use this to track spend against the plan, and use alterlab_check_balance for deposit and spend totals. The selecting condition between the two sibling tools is stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_list_beta_featuresA
List all public beta and GA features available on AlterLab, with your current opt-in state for each. Beta features require opting in; GA features are available to all users. Use alterlab_enable_beta_feature to opt in to any beta feature that interests you.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description transparently states it lists features and opt-in state, implying read-only behavior. Does not disclose performance or rate limits, but sufficient for safe use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with key action and result. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description fully covers what the tool does and its output (list with opt-in state). Refers to sibling for next action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100%. Description adds nothing about parameters, but baseline 4 is appropriate for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all public beta and GA features with opt-in state, using specific verb 'list' and resource 'features'. It differentiates from sibling 'alterlab_enable_beta_feature' by mentioning that tool for opting in.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use to view features and opt-in state, and suggests 'alterlab_enable_beta_feature' for opting in. Does not explicitly contrast with 'alterlab_list_my_beta_features', but overall guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_list_my_beta_featuresA
List all beta and GA features currently active on your account — a compact slug list for quick checks. Includes all GA features plus any beta features you have opted in to. Use this to verify which features are available before making API calls that require them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description reveals it is a read operation returning a compact slug list. Notes that list includes GA features and opted-in beta features. Lacks details on pagination or format but sufficient for a simple list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with clear purpose: action, content, usage guidance. No redundant words; highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, no-output-schema tool, description fully covers what it does, what it returns, and why to use it. Context with sibling tools is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100% trivially. Description adds meaning by explaining the composition of the list (GA + opted-in beta features), which is beyond schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'list' and resource 'beta and GA features active on your account'. It differentiates from sibling 'alterlab_list_beta_features' by specifying scope is only active features on the user's account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'to verify which features are available before making API calls that require them'. Does not explicitly name alternatives but context implies use sibling for full list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_list_sessionsA
List all stored sessions for authenticated scraping. Sessions contain cookies for specific domains, allowing you to scrape content that requires login (e.g., Amazon order history, LinkedIn profiles). Use the returned session_id with alterlab_scrape to scrape authenticated pages.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly describes the read-only listing behavior ('List all stored sessions') and adds context about authenticated scraping. No side effects are mentioned, which is appropriate for a listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with verb and resource, no filler. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description is complete enough. It explains the purpose of sessions (cookies, login) and the workflow with alterlab_scrape. A minor gap: no mention of return format or pagination, but for a list tool this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters (0 params, 100% coverage). The description adds no parameter info, which is acceptable since none exist. Baseline 4 for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all stored sessions for authenticated scraping' with a specific verb and resource. It distinguishes from sibling tools like alterlab_create_session, alterlab_delete_session, and alterlab_get_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: to obtain session_id for alterlab_scrape. Implicitly excludes other operations (create, delete, get) via sibling names. Could add explicit when-not or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_mapA
Discover all URLs on a website, get a sitemap, or find specific pages within a large site. Lightweight URL discovery via sitemap parsing and link extraction — no content scraping, no JS rendering. Costs just $0.001 per call regardless of how many URLs are found (up to 50,000). Use this before alterlab_crawl or alterlab_batch to identify which pages to scrape. Returns a flat list of URLs with source (sitemap/link) and depth. Use include_patterns/exclude_patterns to scope discovery to specific sections. Use search to rank URLs by relevance to a query. Use include_metadata=true to also fetch page titles and descriptions. Use sitemap_path to specify a non-standard sitemap location (e.g., '/sitemap_index.xml').
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Starting URL for site discovery | |
| search | No | Query to filter and rank discovered URLs by relevance (returns relevance_score per URL) | |
| sitemap | No | Sitemap handling: include (parse sitemaps + follow links), skip (links only), only (sitemap URLs only) | include |
| max_depth | No | Link-following depth (0 = start page + sitemap only) | |
| max_pages | No | Maximum URLs to discover | |
| sitemap_path | No | Explicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location. | |
| respect_robots | No | Respect robots.txt directives | |
| exclude_patterns | No | Glob patterns — exclude URLs whose path matches any (e.g., ['/tag/*', '/page/*']) | |
| include_metadata | No | Fetch title and meta description for each URL via lightweight GET (adds latency) | |
| include_patterns | No | Glob patterns — only include URLs whose path matches at least one (e.g., ['/docs/*']) | |
| include_subdomains | No | Include URLs from subdomains of the target domain |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the cost model ($0.001 flat, up to 50,000 URLs), the exclusion of scraping/JS rendering, and the return shape (flat list with source and depth). It omits auth requirements and latency/politeness caveats beyond the robots parameter, so it falls just short of full behavioral coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then cost, then sequencing, then per-parameter hints, so an agent can stop reading early. It is longer than strictly necessary and repeats the sitemap_path example already in the schema, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema, the description compensates by describing the return value (flat URL list with source and depth) plus cost and sequencing. The complete schema coverage handles the rest, leaving nothing an agent critically needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds workflow-level meaning beyond the schema, notably combining search ranking with pattern scoping and clarifying that include_patterns/exclude_patterns scope discovery to sections. This exceeds what the schema alone conveys, though some items (sitemap_path example) restate the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('discover all URLs on a website... get a sitemap') and explicitly bounds scope with 'no content scraping, no JS rendering'. It clearly distinguishes itself from alterlab_crawl and alterlab_batch, positioning itself as the discovery step that precedes them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance ('Use this before alterlab_crawl or alterlab_batch to identify which pages to scrape') and names the alternatives by name. It also routes parameter-level choices conditionally (search to rank by relevance, include_metadata for titles/descriptions), so the agent knows when to reach for each behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_refresh_sessionA
Refresh a session by rotating its cookies and resetting failure counters. This is the preferred way to update cookies after re-authenticating in your browser. The session status is reset to active. If cookies are omitted, only the failure counters are reset.
| Name | Required | Description | Default |
|---|---|---|---|
| cookies | No | New cookies to replace the old ones. If omitted, only failure counters are reset. Cookies as a {name: value} object (e.g. {"session-id": "abc123"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}. | |
| headers | No | Updated custom headers to include with the session | |
| session_id | Yes | UUID of the session to refresh |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses the mutation (cookie rotation), the side effect of resetting status to active, and the fallback behavior when cookies are omitted. It omits auth/permission requirements and reversibility, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then usage context, then the edge-case behavior. No filler and each sentence adds distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param mutation tool with nested objects and no annotations or output schema, the description adequately conveys what changes and when. It could still note authentication prerequisites or what the refreshed session returns, keeping it short of 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters (including the cookies conditional and format). The description largely restates the omit-cookies behavior that the schema already encodes, adding little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (refresh) and resource (session) and enumerates the concrete effects: rotating cookies, resetting failure counters, and setting status to active. The phrase 'preferred way to update cookies' implicitly distinguishes it from sibling tools like alterlab_update_session, letting an agent tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-to-use trigger ('after re-authenticating in your browser') and the conditional path when cookies are omitted. It stops short of naming alternatives or explicit exclusions, so it clears the 4 bar but not the 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_scrapeA
Get data from any website, bypass Cloudflare and anti-bot protection, scrape JavaScript-rendered pages, or fetch content from dynamic single-page apps. Turn any URL into clean, LLM-ready markdown — or get text, HTML, JSON, and structured sections. Automatically bypasses anti-bot protection (Cloudflare, Akamai, DataDome, PerimeterX, hCaptcha) with intelligent tier escalation — no manual configuration needed. Cost-efficient: tier 1 (curl) is $0.0002/page, tier 2 (http) $0.0003, tier 3 (stealth) $0.002, tier 3.5 (lightjs) $0.0025, tier 4 (browser) $0.004; you only pay for the tier that succeeds. Add-ons: screenshot +$0.0002, generate_pdf +$0.0004, ocr +$0.001, use_proxy +$0.0002, LLM extraction +$0.001, embeddings +$0.001; method='POST' costs 1.5x. Returns markdown by default — optimized for LLM context. Supports GET (default) and POST via the method parameter. Use method='POST' with body for GraphQL APIs, REST endpoints, and form submissions. Use content_type to set the POST body Content-Type (json, urlencoded, graphql, plain). Use headers to send custom HTTP headers to the target. Use render_js=true to scrape dynamic pages, JavaScript-heavy sites (React, Angular, Vue, SPAs). Use render_js='auto' for mixed sites to detect JS needs per-page (saves 30-60%). Use actions (click, fill, press, scroll, wait_for, evaluate, ...) to drive the page before extraction. Use use_proxy=true for geo-restricted or heavily protected sites; use_own_proxy for your own proxy integration. Use sticky_session to reuse cookies and exit IP across calls. Use skip_tls_verification only for sites with broken certificates. Use formats=['json_v2'] for a structured section tree (headings + content blocks). Use formats=['rag'] for chunked text optimized for RAG pipelines. Use formats=['raw'] for the raw response body without extraction. Use formats=['content'] for AI/KB pipelines — returns body_markdown, content_hash, images, links. Use extraction_schema to extract structured fields from the page using LLM. Use extraction_prompt for natural language extraction instructions. Use extraction_profile or extraction_template for pre-built templates (product, article, job_posting, etc.). Use evidence=true to include source passages alongside extracted fields. Use embeddings to chunk and embed the scraped text. Use cache=true and cache_ttl to enable response caching. Use cost_controls to cap spending, pin a tier, or set a time budget. Supports authenticated scraping via session_id, inline cookies or session_headers. Use scroll_to_load=true for infinite-scroll pages. Use location.country to scrape geo-targeted content from any region. Use prefer_cost=true to minimize credit spend (starts from cheapest tier). Use prefer_speed=true to skip to a fast reliable tier immediately. Use fail_fast=true to error instead of auto-escalating to expensive tiers. Use force_refresh=true to bypass cache and always fetch live content. Use promote_schema_org=true to prefer Schema.org JSON-LD over LLM extraction on structured pages. Use estimate_first=true to run a free cost estimate before scraping (prepended to the result). If a long-running scrape returns a job_id instead of content, the job continues server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| ocr | No | Extract text from images using OCR (+$0.001) | |
| url | Yes | URL to scrape | |
| body | No | Request body for POST requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{"query": "{ user { id name } }"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET requests. | |
| mode | No | Scraping mode: auto (recommended), html, js (headless browser), pdf, or ocr | auto |
| cache | No | Enable caching for this request. When true, repeat requests with identical parameters may return cached results. Only use for idempotent requests (GET pages, read-only POSTs). | |
| method | No | HTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, and REST API calls. When using POST, provide body with the request payload. POST costs 1.5x base tier price. | GET |
| actions | No | Browser automation actions run in order after page load (max 20, requires render_js=true). Failed actions are skipped without aborting the sequence. Results are returned in action_results. Each action has a 'type': wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate. | |
| cookies | No | Inline cookies as key-value pairs for authenticated scraping (e.g., {"session_token": "abc123"}). Use this for one-off requests; use session_id for reusable sessions. | |
| formats | No | Output formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines. | |
| headers | No | Custom HTTP headers to send to the target URL. Hop-by-hop headers (Connection, Transfer-Encoding, Host, etc.) are not allowed. | |
| timeout | No | Request timeout in seconds (1-300) | |
| evidence | No | Include provenance/evidence snippets alongside extracted fields. Each extracted value will include the source text passage it was derived from. Requires extraction_schema or extraction_prompt. | |
| location | No | Geo-targeting parameters for localized content scraping. Controls proxy country routing, Accept-Language header, and browser locale. | |
| template | No | DEPRECATED alias for extraction_template, kept for backward compatibility. Sent to the API as extraction_template; prefer extraction_template. | |
| wait_for | No | CSS selector to wait for before extracting content (e.g., '#main-content') | |
| cache_ttl | No | Cache TTL in seconds (60–86400). Defaults to 3600 (60 min) when cache=true. Requires cache=true. | |
| fail_fast | No | Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Shorthand for cost_controls.fail_fast. Returns an error with the required tier instead of upgrading. | |
| render_js | No | Render JavaScript using a headless browser (forces Tier 4 minimum, $0.004/req — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with a browser — saves 30-60% on mixed sites). | |
| use_proxy | No | Route through AlterLab's premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot | |
| embeddings | No | Chunk the scraped text and embed it with OpenAI models (+$0.001 per page). Set enabled=true; model, chunk_size (64-8191) and chunk_overlap (0-2048) are optional. | |
| pdf_format | No | Output format for mode='pdf' extraction (API default 'markdown') | |
| screenshot | No | Capture a full-page screenshot (+$0.0002, requires render_js). The URL is returned as screenshot_url. Use alterlab_screenshot to get the image inline. | |
| session_id | No | UUID of a stored session for authenticated scraping. Use alterlab_list_sessions to find available sessions. The session's cookies will be injected into the request. | |
| wait_until | No | Page load event to wait for before extracting (networkidle, domcontentloaded or load; API default networkidle) | |
| prefer_cost | No | Optimize for lowest cost — try cheaper tiers first before escalating. Shorthand for cost_controls.prefer_cost. Mutually exclusive intent with prefer_speed. | |
| sync_policy | No | Synchronous wait policy. 'auto' (default) may return an early 202 with a job_id for predicted T3/T4 jobs; 'wait_until_deadline' keeps the connection open until the terminal result or the safe sync deadline (~85s). | |
| block_images | No | Block image downloads during browser rendering. Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true. | |
| content_type | No | Content-Type header for the request body. Defaults to 'application/json' when body is provided. Use 'application/graphql' for raw GraphQL queries. Use 'application/x-www-form-urlencoded' for HTML form submissions. Requires body to be set. | |
| generate_pdf | No | Generate a PDF of the rendered page (+$0.0004, requires render_js) | |
| ocr_language | No | Tesseract language code for OCR (API default 'eng') | |
| prefer_speed | No | Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Shorthand for cost_controls.prefer_speed. Mutually exclusive intent with prefer_cost. | |
| scroll_count | No | Number of scroll iterations when scroll_to_load is enabled (1-10, API default 3) | |
| cost_controls | No | Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. | |
| enable_scroll | No | Force scrolling for lazy-load images. true: always scroll (+5-10s), false: never scroll, omit: auto (scroll unless social media site). | |
| force_refresh | No | Bypass the cache and always fetch a fresh copy of the page. Use when you need real-time content and a cached result would be stale. | |
| proxy_country | No | ISO country code for proxy geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true | |
| use_own_proxy | No | Use your own proxy integration (bring-your-own-proxy) instead of the system proxy. BYOP requests get a 20% discount on the tier price. | |
| estimate_first | No | Run a cost estimate before scraping and include it in the response. Adds one lightweight API call (~50ms) with no credit charge. The estimated tier, cost, and confidence are prepended to the scrape result. Useful for unfamiliar or potentially expensive sites — see cost before committing. | |
| filter_content | No | Apply quality filtering to extracted content. When false (default), returns all parsed content without quality thresholds (lossless mode). When true, filters low-quality boilerplate. | |
| scroll_to_load | No | Scroll page to trigger lazy-loaded content (requires render_js). Performs explicit viewport-height scrolls to load dynamic content. Adds ~2-3s latency. | |
| section_filter | No | Filter for the json_v2 section tree. Only applies when 'json_v2' is in formats. | |
| sticky_session | No | Sticky-session handle. Scrapes that pass the same value reuse the cookie jar captured on the first call and, best-effort, the same exit IP (~10 min). Alphanumeric, '-' and '_' only. Requires a paid plan (growth tier or above). | |
| wait_condition | No | Wait condition for JS rendering: domcontentloaded, networkidle or load | |
| include_iframes | No | Inline iframe content into the main document (free, requires render_js). Same-origin iframes are read directly; cross-origin iframes are marked but not fetched. | |
| session_headers | No | Inline auth headers sent to the target (e.g. Authorization: Bearer ...). Merged with the stored session's headers when session_id is also set. | |
| extraction_model | No | Per-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only. | |
| include_raw_html | No | Include raw HTML in the response alongside formatted content | |
| use_system_proxy | No | Override your default proxy integration and use AlterLab's system proxy for this request. | |
| extraction_prompt | No | Natural language extraction instruction. Describes what fields to extract from the page. Mutually exclusive with extraction_schema. Example: "Extract the product name, price, and availability". | |
| extraction_schema | No | JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM (+$0.001). Result is returned in extraction_result. Example: { "title": "string", "price": "number", "in_stock": "boolean" } | |
| extraction_profile | No | Pre-built extraction schema template. auto: detect best template (API default). product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries. Mutually exclusive with extraction_template. | |
| flatten_shadow_dom | No | Flatten Shadow DOM roots into regular DOM for extraction (free, requires render_js). | |
| max_response_bytes | No | Soft cap on raw response body size in bytes. When the downloaded HTML exceeds this value it is truncated before extraction. Default: 5 MB (5242880). Set to 0 for no limit. Maximum: 50 MB (52428800). Useful for very large pages where you only need the beginning of the content. | |
| promote_schema_org | No | Use Schema.org JSON-LD/Microdata as the primary structured-data source when present (API default true). Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages. | |
| sticky_session_ttl | No | Sticky-session cookie-jar lifetime in seconds (300-7200, API default 1800). Ignored unless sticky_session is set. | |
| extraction_provider | No | LLM provider to use for extraction. Selects the matching BYOK key registered at /dashboard/settings/llm-keys. When omitted, the most recently used registered key is used automatically. Requires extraction_schema or extraction_prompt. | |
| extraction_template | No | Shorthand alias for extraction_profile — selects the same pre-built template. Mutually exclusive with extraction_profile. | |
| proxy_integration_id | No | Specific proxy integration ID to use (requires use_own_proxy=true) | |
| remove_cookie_banners | No | Remove cookie consent banners from HTML before content extraction (free; the API default is true) | |
| skip_tls_verification | No | TLS certificate verification for the target. Omit (recommended): certificates are verified, and if the site's own certificate is invalid (expired, self-signed, wrong hostname, incomplete chain) the page is still fetched without verification. true skips verification from the start. false always requires a valid certificate, so sites with an invalid certificate fail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and delivers: tier escalation logic ('you only pay for the tier that succeeds'), a complete cost table, add-on pricing, mutation multipliers (POST = 1.5x), default return format, caching semantics, fail-fast vs auto-escalation behavior, and the server-side job_id continuation for long-running scrapes. This is exactly the beyond-schema behavioral disclosure the dimension rewards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, which is good, but the body is an enormous wall of repetitive 'Use X to...' sentences that duplicate the schema line-for-line. For a 60-parameter tool some length is defensible, yet the majority of sentences restate structured data and do not earn their place, making the description a manual rather than a focused definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 60-parameter, nested-schema tool with no output schema and no annotations, the description is nearly complete: it covers return format defaults (markdown), the format alternatives, async job_id handling, cost/tier behavior, auth paths, and caching. The only minor gap is a lack of clarity on the exact response envelope, but the return-shape essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description largely restates parameter documentation already present in the schema (method/POST, render_js tiers, formats, cost_controls) rather than adding new semantics. It does aggregate parameters into a readable workflow narrative and clarifies 'you only pay for the tier that succeeds,' but the net informational gain over the schema is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource — 'Get data from any website... scrape JavaScript-rendered pages... fetch content from dynamic single-page apps' — and the markdown-conversion scope is unmistakable. An agent can tell this is a single-page scrape tool. However, it never explicitly distinguishes itself from siblings like alterlab_batch_scrape, alterlab_crawl, or alterlab_search, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is saturated with 'Use X to do Y' parameter guidance (render_js, method, formats, prefer_cost, etc.), which gives strong intra-tool usage context. But it never addresses tool-level selection — when to choose this over alterlab_batch_scrape, alterlab_crawl, or alterlab_extract — and offers no 'when not to use' exclusions. Usage guidance is implied through capability statements rather than stated as routing criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_screenshotA
Take a screenshot of any website, capture a webpage as an image, or snapshot a URL visually. Works on anti-bot protected sites (Cloudflare, DataDome, etc.) — uses the same bypass engine as alterlab_scrape. Returns a full-page PNG screenshot directly in the conversation — rendered with a real headless browser (tier 4 $0.004 + $0.0002 screenshot add-on). Use wait_for to wait for a specific element before capturing. Use wait_until to control page load timing (networkidle, domcontentloaded, load). Use session_id or cookies to capture pages behind a login. For the full set of scrape options (actions, sticky sessions, cost controls), call alterlab_scrape with screenshot=true.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to take a screenshot of | |
| cookies | No | Inline cookies for a one-off authenticated screenshot | |
| timeout | No | Request timeout in seconds (1-300, API default 90) | |
| location | No | Geo-targeting parameters for localized content scraping. Controls proxy country routing, Accept-Language header, and browser locale. | |
| wait_for | No | CSS selector to wait for before taking screenshot | |
| use_proxy | No | Route through AlterLab's premium proxy (+$0.0002) | |
| session_id | No | UUID of a stored session, to screenshot a logged-in page | |
| wait_until | No | Page load event to wait for before screenshot | networkidle |
| proxy_country | No | ISO country code for proxy geo-targeting. Requires use_proxy=true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses anti-bot bypass coverage (Cloudflare, DataDome), the real headless browser, a full-page PNG return delivered in-conversation, and the exact tier-4 pricing ($0.004 + $0.0002). It does not cover failure behavior or rate limits, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then progressively details capabilities and parameters, ending with the sibling routing. Every sentence adds something, though the three synonymous opening phrasings and stacked param tips make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return format (full-page PNG in conversation) and covers the main capability and pricing context. For a 9-parameter, nested-schema tool it could say more about geo/proxy interplay and timeout defaults, but nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine usage meaning beyond the schema for wait_for, wait_until, session_id, and cookies (element gating, load-event choice, authentication). It stops short of documenting location/proxy_country/timeout interactions, keeping it at a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
State a specific verb and resource ('Take a screenshot of any website') with three near-synonym phrasings that catch varied agent intents, and it explicitly distinguishes itself from alterlab_scrape by positioning that tool as the full-option fallback. An agent can tell what this does and how it differs from siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance for the key parameters ('Use wait_for to wait for a specific element', 'Use session_id or cookies to capture pages behind a login') and names the alternative for broader needs ('call alterlab_scrape with screenshot=true'). The routing to the sibling tool is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_searchA
Search the web, find information online, look up any topic, or research a subject across the internet. Returns search results with URLs, titles, and snippets from multiple search engines. Uses AlterLab's SERP engine with Google/Bing/DuckDuckGo multi-engine failover for reliable results. Costs $0.001 per search query on the default duckduckgo engine; engine='google' or 'bing' costs $0.004 per query. Set scrape_results=true to also scrape each result page (with anti-bot bypass) and get full content — each page is billed at its normal scraping tier cost. Use domain to restrict results to a specific site (equivalent to site: operator). Use time_range to filter by recency (hour/day/week/month/year). Safe search is on by default; pass safe_search=false to disable it.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page number (1-indexed). Page 2 returns results 11-20, etc. | |
| query | Yes | Search query (max 500 characters) | |
| domain | No | Restrict results to a specific domain (applied as site: prefix, e.g. 'docs.example.com') | |
| engine | No | Search engine (API default duckduckgo). duckduckgo costs $0.001/query; google and bing use browser rendering and cost $0.004/query. | |
| country | No | ISO 3166-1 alpha-2 country code for geo-targeted results (e.g., 'US', 'GB', 'DE') | |
| formats | No | Output formats when scrape_results=true | |
| language | No | Language code for results (e.g., 'en', 'fr', 'de') | |
| time_range | No | Filter results by recency | |
| num_results | No | Number of results to return (1-30) | |
| safe_search | No | Safe search filtering to exclude adult content from results (API default true). Set false to disable. | |
| scrape_results | No | If true, scrape each result page and include content in response. Each page is billed at its scraping tier cost in addition to the base search fee. | |
| extraction_schema | No | JSON schema for structured extraction when scrape_results=true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses per-engine pricing tiers ($0.001 vs $0.004), that scrape_results incurs additional per-page scraping-tier billing, multi-engine failover for reliability, anti-bot bypass, and that safe search is on by default. Cost and default behavior are exactly the traits an agent needs before invoking a paid API.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a dense paragraph, but front-loaded with purpose and output shape before moving to cost and parameter guidance. Nearly every sentence carries information, though the repeated cost figures slightly overlap the engine parameter description in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no output schema and no annotations, the description covers the response shape, cost model, and the most consequential optional parameters. It is a bit thin on how scrape_results interacts with formats/extraction_schema and says nothing about pagination beyond what the schema already states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, giving a baseline of 3. The description restates a few key ones (domain as site:, time_range, engine cost differences) but adds no syntax or format detail beyond the schema, and omits extraction_schema and formats entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a clear verb+resource ('Search the web... research a subject across the internet') and the second states the return shape (URLs, titles, snippets from multiple engines). It is distinguishable from siblings like alterlab_scrape or alterlab_extract, which retrieve page content rather than ranked results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use guidance for specific parameters: domain for site restriction, time_range for recency, scrape_results to fetch full page content, and engine selection driven by cost. It does not, however, explicitly say when to prefer this over alterlab_scrape or alterlab_extract, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_update_sessionA
Update a stored session's properties. You can change the name, rotate cookies, update custom headers, set a new expiration, or add notes. When cookies are provided, they replace ALL existing cookies (not merged). Use this instead of delete+recreate when you need to rotate credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the session | |
| notes | No | Notes or description for this session | |
| cookies | No | New cookies — replaces ALL existing cookies. Cookies as a {name: value} object (e.g. {"session-id": "abc123"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}. | |
| headers | No | New custom headers — replaces ALL existing headers | |
| expires_at | No | New expiration date in ISO 8601 format (e.g., '2026-12-31T23:59:59Z') | |
| session_id | Yes | UUID of the session to update | |
| notify_on_failure | No | Enable or disable the validation-failure notification | |
| auto_refresh_enabled | No | Enable or disable proactive expiry detection and health checks | |
| notify_before_expiry | No | Enable or disable the before-expiry notification |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does add one genuinely important destructive trait — cookies 'replace ALL existing cookies (not merged)' — which an agent must know. However, it says nothing about permissions, whether the update is partial, the fate of unspecified headers, or reversibility, so the disclosure is helpful but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then the mutable fields, then the critical replace-semantics caveat and the usage recommendation. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no annotations and no output schema, the description omits the notification/auto-refresh/health-check parameters entirely and never states whether the operation is partial or full-replace across all fields. The cookie caveat helps, but enough behavioral context is missing that it is only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 9 parameters, including the cookie replace-all semantics and the notification/auto-refresh booleans. The description restates a subset of fields (name, notes, headers, expiration) without adding format or constraint detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (update) plus resource (stored session) with an enumerated list of mutable properties (name, cookies, headers, expiration, notes). It distinguishes itself from the delete+recreate pattern and is clearly separable from siblings like get_session, list_sessions, or refresh_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule: 'Use this instead of delete+recreate when you need to rotate credentials.' That is stronger than implied usage, but it never mentions the closely related refresh_session or create_session siblings, so routing among the session-lifecycle tools is only partially resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alterlab_validate_sessionA
Validate whether a stored session is still active and its cookies are valid. Run this before scraping if you suspect a session may have expired. Returns the session status and a reason if invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | UUID of the session to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it checks session activity and cookie validity, returns status and reason if invalid. No annotations provided, so description carries burden; no side effects mentioned but validation is inherently read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers purpose, usage context, and return information for a simple validation tool with one parameter and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (session_id) with 100% schema description coverage. The description does not add meaningful detail beyond what the schema already provides (UUID for session). Baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states validation of session activity and cookie validity. Distinguishes from sibling tools like create, delete, refresh, get by focusing solely on checking status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Run this before scraping if you suspect a session may have expired,' providing clear context for use. No explicit exclusions but implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v1.9.0- Changed
alterlab_batch30 fields changed- added
Input schema / properties / exportAdded value: +{ + "additionalProperties": false, + "description": "Export batch results to a storage integration when the batch finishes", + "properties": { + "format": { + "description": "Export file format (API default jsonl)", + "enum": [ + "jsonl", + "csv", + "json" + ], + "type": "string" + }, + "integration_id": { + "description": "ID of a storage integration (S3/R2/GCS) configured in the dashboard", + "type": "string" + }, + "prefix": { + "description": "Object key prefix for exported files", + "maxLength": 500, + "type": "string" + } + }, + "required": [ + "integration_id" + ], + "type": "object" +} - added
Input schema / properties / extraction_profileAdded value: +{ + "description": "Batch-level pre-built extraction profile applied to every URL", + "enum": [ + "auto", + "product", + "article", + "job_posting", + "faq", + "recipe", + "event" + ], + "type": "string" +} - added
Input schema / properties / extraction_promptAdded value: +{ + "description": "Batch-level natural language extraction instruction", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / extraction_providerAdded value: +{ + "$ref": "#/properties/urls/items/properties/extraction_provider", + "description": "Batch-level BYOK LLM provider for extraction" +} - added
Input schema / properties / extraction_schemaAdded value: +{ + "additionalProperties": {}, + "description": "Batch-level JSON schema for structured extraction applied to every URL", + "type": "object" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "UUID of a stored session applied to every URL in the batch (see alterlab_list_sessions)", + "format": "uuid", + "type": "string" +} - added
Input schema / properties / urls / items / properties / advancedAdded value: +{ + "additionalProperties": false, + "description": "Advanced scrape options for this URL (render_js, use_proxy, use_own_proxy, actions, session_id, cookies, skip_tls_verification, sticky_session, ...). Same fields as the alterlab_scrape parameters of the same name.", + "properties": { + "actions": { + "description": "Browser automation actions run in order after page load (max 20, requires render_js=true). Failed actions are skipped without aborting the sequence. Results are returned in action_results. Each action has a 'type': wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate.", + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "milliseconds": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "selector": { + "description": "CSS selector to wait for visibility", + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "wait", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "timeout": { + "description": "Timeout in ms (default 10000)", + "maximum": 30000, + "minimum": 1000, + "type": "integer" + }, + "type": { + "const": "wait_for", + "type": "string" + } + }, + "required": [ + "type", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "click", + "type": "string" + } + }, + "required": [ + "type", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "fill", + "type": "string" + }, + "value": { + "maxLength": 5000, + "type": "string" + } + }, + "required": [ + "type", + "selector", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "key": { + "description": "Key to press, e.g. 'Enter', 'Tab', 'Escape'", + "maxLength": 50, + "type": "string" + }, + "type": { + "const": "press", + "type": "string" + } + }, + "required": [ + "type", + "key" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Viewport heights to scroll", + "maximum": 20, + "minimum": 1, + "type": "integer" + }, + "direction": { + "enum": [ + "down", + "up" + ], + "type": "string" + }, + "type": { + "const": "scroll", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "delay": { + "description": "Delay between scrolls in ms", + "maximum": 5000, + "minimum": 200, + "type": "integer" + }, + "end_selector": { + "description": "Stop scrolling when this selector appears", + "maxLength": 500, + "type": "string" + }, + "max_scrolls": { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + "type": { + "const": "infinite_scroll", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "full_page": { + "type": "boolean" + }, + "type": { + "const": "screenshot", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "script": { + "description": "JavaScript to run in the page (max 5120 chars). Network APIs (fetch, XMLHttpRequest, WebSocket) and dynamic code execution (eval, Function) are blocked.", + "maxLength": 5120, + "type": "string" + }, + "type": { + "const": "evaluate", + "type": "string" + } + }, + "required": [ + "type", + "script" + ], + "type": "object" + } + ] + }, + "maxItems": 20, + "type": "array" + }, + "block_images": { + "description": "Block image downloads during browser rendering. Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true.", + "type": "boolean" + }, + "cookies": { + "additionalProperties": { + "type": "string" + }, + "description": "Inline cookies as key-value pairs for authenticated scraping (e.g., {\"session_token\": \"abc123\"}). Use this for one-off requests; use session_id for reusable sessions.", + "type": "object" + }, + "flatten_shadow_dom": { + "description": "Flatten Shadow DOM roots into regular DOM for extraction (free, requires render_js).", + "type": "boolean" + }, + "generate_pdf": { + "description": "Generate a PDF of the rendered page (+$0.0004, requires render_js)", + "type": "boolean" + }, + "include_iframes": { + "description": "Inline iframe content into the main document (free, requires render_js). Same-origin iframes are read directly; cross-origin iframes are marked but not fetched.", + "type": "boolean" + }, + "markdown": { + "description": "Extract content as Markdown for this URL (free)", + "type": "boolean" + }, + "ocr": { + "description": "Extract text from images using OCR (+$0.001)", + "type": "boolean" + }, + "proxy_country": { + "description": "ISO country code for proxy geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true", + "type": "string" + }, + "proxy_integration_id": { + "description": "Specific proxy integration ID to use (requires use_own_proxy=true)", + "type": "string" + }, + "remove_cookie_banners": { + "description": "Remove cookie consent banners from HTML before content extraction (free; the API default is true)", + "type": "boolean" + }, + "render_js": { + "anyOf": [ + { + "type": "boolean" + }, + { + "const": "auto", + "type": "string" + } + ], + "description": "Render JavaScript using a headless browser (forces Tier 4 minimum, $0.004/req — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with a browser — saves 30-60% on mixed sites)." + }, + "screenshot": { + "description": "Capture a full-page screenshot of this URL (+$0.0002, requires render_js)", + "type": "boolean" + }, + "scroll_count": { + "description": "Number of scroll iterations when scroll_to_load is enabled (1-10, API default 3)", + "maximum": 10, + "minimum": 1, + "type": "integer" + }, + "scroll_to_load": { + "description": "Scroll page to trigger lazy-loaded content (requires render_js). Performs explicit viewport-height scrolls to load dynamic content. Adds ~2-3s latency.", + "type": "boolean" + }, + "section_filter": { + "additionalProperties": false, + "description": "Filter for the json_v2 section tree. Only applies when 'json_v2' is in formats.", + "properties": { + "content_only": { + "type": "boolean" + }, + "exclude_content_types": { + "items": { + "type": "string" + }, + "type": "array" + }, + "min_content_blocks": { + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "session_headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Inline auth headers sent to the target (e.g. Authorization: Bearer ...). Merged with the stored session's headers when session_id is also set.", + "type": "object" + }, + "session_id": { + "description": "UUID of a stored session for authenticated scraping. Use alterlab_list_sessions to find available sessions. The session's cookies will be injected into the request.", + "format": "uuid", + "type": "string" + }, + "skip_tls_verification": { + "description": "TLS certificate verification for the target. Omit (recommended): certificates are verified, and if the site's own certificate is invalid (expired, self-signed, wrong hostname, incomplete chain) the page is still fetched without verification. true skips verification from the start. false always requires a valid certificate, so sites with an invalid certificate fail.", + "type": "boolean" + }, + "sticky_session": { + "description": "Sticky-session handle. Scrapes that pass the same value reuse the cookie jar captured on the first call and, best-effort, the same exit IP (~10 min). Alphanumeric, '-' and '_' only. Requires a paid plan (growth tier or above).", + "maxLength": 128, + "type": "string" + }, + "sticky_session_ttl": { + "description": "Sticky-session cookie-jar lifetime in seconds (300-7200, API default 1800). Ignored unless sticky_session is set.", + "maximum": 7200, + "minimum": 300, + "type": "integer" + }, + "use_own_proxy": { + "description": "Use your own proxy integration (bring-your-own-proxy) instead of the system proxy. BYOP requests get a 20% discount on the tier price.", + "type": "boolean" + }, + "use_proxy": { + "description": "Route through AlterLab's premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot", + "type": "boolean" + }, + "use_system_proxy": { + "description": "Override your default proxy integration and use AlterLab's system proxy for this request.", + "type": "boolean" + }, + "wait_condition": { + "description": "Wait condition for JS rendering: domcontentloaded, networkidle or load", + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / urls / items / properties / bodyAdded value: +{ + "description": "Request body for POST requests to this URL", + "type": "string" +} - removed
Input schema / properties / urls / items / properties / cache / defaultRemoved value: -false - added
Input schema / properties / urls / items / properties / content_typeAdded value: +{ + "description": "Content-Type of the POST body for this URL", + "enum": [ + "application/json", + "application/x-www-form-urlencoded", + "text/plain", + "application/graphql" + ], + "type": "string" +} - added
Input schema / properties / urls / items / properties / cost_controlsAdded value: +{ + "additionalProperties": false, + "description": "Cost and tier controls for this URL (max_tier, force_tier, max_credits, ...)", + "properties": { + "fail_fast": { + "description": "Return error instead of escalating to more expensive tiers on failure.", + "type": "boolean" + }, + "force_tier": { + "description": "Pin execution to this exact tier, bypassing escalation (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). Use to guarantee a specific engine is used regardless of site difficulty.", + "enum": [ + "1", + "2", + "3", + "3.5", + "4" + ], + "type": "string" + }, + "max_credits": { + "description": "Hard spending cap for this request in credits. Request fails if cost would exceed this.", + "exclusiveMinimum": 0, + "type": "number" + }, + "max_tier": { + "$ref": "#/properties/urls/items/properties/cost_controls/properties/force_tier", + "description": "Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set. Combining render_js=true with a max_tier below 4 is rejected (render_js forces tier 4)." + }, + "prefer_cost": { + "description": "Optimize for cost — try cheaper tiers first, accept lower success probability.", + "type": "boolean" + }, + "prefer_speed": { + "description": "Optimize for speed — skip to the most reliable tier for this domain.", + "type": "boolean" + }, + "time_budget": { + "description": "Total wall-clock budget in seconds for the entire tier escalation sequence (5–300s). Escalation stops when remaining budget is insufficient for the next tier attempt.", + "maximum": 300, + "minimum": 5, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / urls / items / properties / extraction_profileAdded value: +{ + "description": "Pre-built extraction profile for this URL (mutually exclusive with extraction_template)", + "enum": [ + "auto", + "product", + "article", + "job_posting", + "faq", + "recipe", + "event", + "ecommerce_homepage", + "directory_listing" + ], + "type": "string" +} - added
Input schema / properties / urls / items / properties / extraction_promptAdded value: +{ + "description": "Natural language extraction instruction for this URL", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / urls / items / properties / extraction_providerAdded value: +{ + "description": "BYOK LLM provider for extraction on this URL", + "enum": [ + "openai", + "anthropic", + "openrouter", + "groq" + ], + "type": "string" +} - added
Input schema / properties / urls / items / properties / extraction_templateAdded value: +{ + "$ref": "#/properties/urls/items/properties/extraction_profile", + "description": "Alias for extraction_profile (mutually exclusive with it)" +} - changed
Input schema / properties / urls / items / properties / formats / descriptionPrevious value: -"Output formats for this URL (overrides batch-level formats)"New value: +"Output formats for this URL. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines." - changed
Input schema / properties / urls / items / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown", - "rag" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "content", + "raw" +] - added
Input schema / properties / urls / items / properties / include_raw_htmlAdded value: +{ + "description": "Include raw HTML in the result for this URL", + "type": "boolean" +} - added
Input schema / properties / urls / items / properties / locationAdded value: +{ + "additionalProperties": false, + "description": "Geo-targeting for this URL (country, language)", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country code for geo-targeting (e.g., 'US', 'DE', 'JP'). Routes request through a proxy in the specified country.", + "maxLength": 2, + "minLength": 2, + "type": "string" + }, + "language": { + "description": "ISO 639-1 language code (e.g., 'en', 'de', 'ja'). Sets the Accept-Language header and browser locale.", + "maxLength": 5, + "minLength": 2, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / urls / items / properties / methodAdded value: +{ + "description": "HTTP method for this URL. POST costs 1.5x the base tier price.", + "enum": [ + "GET", + "POST" + ], + "type": "string" +} - removed
Input schema / properties / urls / items / properties / mode / defaultRemoved value: -"auto" - changed
Input schema / properties / urls / items / properties / mode / descriptionPrevious value: -"Scraping mode for this URL"New value: +"Scraping mode for this URL (API default auto)" - added
Input schema / properties / urls / items / properties / render_js / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "const": "auto", + "type": "string" + } +] - changed
Input schema / properties / urls / items / properties / render_js / descriptionPrevious value: -"Render JavaScript for this URL"New value: +"Shortcut for advanced.render_js for this URL" - removed
Input schema / properties / urls / items / properties / render_js / typeRemoved value: -"boolean" - removed
Input schema / properties / urls / items / properties / timeout / defaultRemoved value: -90 - changed
Input schema / properties / urls / items / properties / timeout / descriptionPrevious value: -"Timeout in seconds for this URL"New value: +"Timeout in seconds for this URL (1-300, API default 90)" - added
Input schema / properties / urls / items / properties / url / maxLengthAdded value: +2083 - changed
Input schema / properties / urls / items / properties / use_proxy / descriptionPrevious value: -"Use premium proxy for this URL"New value: +"Shortcut for advanced.use_proxy for this URL" - added
Input schema / properties / webhook_url / maxLengthAdded value: +2083
- Changed
alterlab_batch_scrape4 fields changed- changed
Input schema / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown", - "rag", - "content" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "content", + "raw" +] - changed
Input schema / properties / render_js / descriptionPrevious value: -"Render JavaScript using headless browser for all URLs. Required for JS-heavy sites. Increases cost to tier 4 (~$0.001/req)."New value: +"Render JavaScript using headless browser for all URLs. Required for JS-heavy sites. Forces tier 4 ($0.004/req)." - added
Input schema / properties / urls / items / maxLengthAdded value: +2083 - changed
Input schema / properties / use_proxy / descriptionPrevious value: -"Route all requests through premium proxy (+~$0.0002/req)."New value: +"Route all requests through premium proxy (+$0.0002/req)."
- Changed
alterlab_crawl28 fields changed- removed
Input schema / properties / block_imagesRemoved value: -{ - "default": false, - "description": "Block image downloads during browser rendering on each crawled page. Reduces proxy bandwidth and speeds up crawls. Only effective with render_js=true.", - "type": "boolean" -} - added
Input schema / properties / budgetAdded value: +{ + "additionalProperties": { + "type": "integer" + }, + "description": "Per-path page budget: glob pattern -> max pages, most specific pattern wins, '*' is the catch-all (e.g., {\"/products/*\": 100, \"/blog/*\": 50, \"*\": 5}). max_pages stays the hard cap.", + "type": "object" +} - added
Input schema / properties / cacheAdded value: +{ + "description": "Serve pages from the response cache when available", + "type": "boolean" +} - added
Input schema / properties / cache_ttlAdded value: +{ + "description": "Cache TTL in seconds (60-86400). Requires cache=true", + "maximum": 86400, + "minimum": 60, + "type": "integer" +} - added
Input schema / properties / change_trackingAdded value: +{ + "additionalProperties": false, + "description": "Track page changes between crawls", + "properties": { + "enabled": { + "type": "boolean" + }, + "include_diff": { + "description": "Include a diff of changed pages", + "type": "boolean" + }, + "mode": { + "enum": [ + "content", + "structured" + ], + "type": "string" + }, + "tracking_id": { + "description": "Stable ID to compare this crawl against earlier crawls with the same ID", + "maxLength": 200, + "type": "string" + } + }, + "type": "object" +} - changed
Input schema / properties / cost_controls / properties / max_tier / descriptionPrevious value: -"Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004)"New value: +"Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). render_js=true with a max_tier below 4 is rejected (render_js forces tier 4)." - added
Input schema / properties / delayAdded value: +{ + "description": "Politeness delay between page requests, in seconds (0-30)", + "maximum": 30, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / depth_strategyAdded value: +{ + "description": "Link-discovery strategy (API default 'sequential')", + "enum": [ + "eager", + "sequential" + ], + "type": "string" +} - added
Input schema / properties / exclude_patterns / maxItemsAdded value: +50 - added
Input schema / properties / extractionAdded value: +{ + "const": "auto", + "description": "Set to 'auto' for automatic page-type detection and extraction without a user-defined schema. Mutually exclusive with extraction_schema.", + "type": "string" +} - changed
Input schema / properties / extraction_profile / enumPrevious value: -[ - "auto", - "product", - "article", - "job_posting", - "faq", - "recipe", - "event" -]New value: +[ + "auto", + "product", + "article", + "job_posting", + "faq", + "recipe", + "event", + "ecommerce_homepage", + "directory_listing" +] - added
Input schema / properties / extraction_providerAdded value: +{ + "description": "BYOK LLM provider used for extraction on each page", + "enum": [ + "openai", + "anthropic", + "openrouter", + "groq" + ], + "type": "string" +} - added
Input schema / properties / extraction_templateAdded value: +{ + "$ref": "#/properties/extraction_profile", + "description": "Alias for extraction_profile (mutually exclusive with it)" +} - added
Input schema / properties / force_refreshAdded value: +{ + "description": "Bypass the cache and fetch every page fresh", + "type": "boolean" +} - changed
Input schema / properties / formats / descriptionPrevious value: -"Output formats for each scraped page"New value: +"Output formats for each scraped page. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines." - changed
Input schema / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "content" +] - added
Input schema / properties / include_patterns / maxItemsAdded value: +50 - added
Input schema / properties / priorityAdded value: +{ + "additionalProperties": false, + "description": "Crawl prioritisation hints (keywords, boost_patterns, demote_patterns)", + "properties": { + "boost_patterns": { + "description": "URL glob patterns to crawl earlier", + "items": { + "type": "string" + }, + "type": "array" + }, + "demote_patterns": { + "description": "URL glob patterns to crawl later", + "items": { + "type": "string" + }, + "type": "array" + }, + "keywords": { + "description": "Crawl pages matching these keywords first", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +} - removed
Input schema / properties / render_js / defaultRemoved value: -false - changed
Input schema / properties / render_js / descriptionPrevious value: -"Render JavaScript on crawled pages. true=always (Tier 4), false=never, auto=smart detection per page"New value: +"Render JavaScript on crawled pages. true=always (Tier 4, $0.004/page), false=never, auto=smart detection per page" - added
Input schema / properties / screenshotAdded value: +{ + "description": "Capture a screenshot of each crawled page (requires render_js)", + "type": "boolean" +} - added
Input schema / properties / storageAdded value: +{ + "description": "Where crawl results are stored (API default 'redis')", + "enum": [ + "redis", + "s3", + "r2" + ], + "type": "string" +} - changed
Input schema / properties / timeout / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / url / maxLengthAdded value: +2083 - removed
Input schema / properties / use_proxy / defaultRemoved value: -false - changed
Input schema / properties / use_proxy / descriptionPrevious value: -"Route all crawl requests through premium proxy"New value: +"Route all crawl requests through premium proxy (+$0.0002/page)" - added
Input schema / properties / webhookAdded value: +{ + "additionalProperties": false, + "description": "Detailed webhook config (events, signing secret, headers); use instead of webhook_url", + "properties": { + "events": { + "description": "Event names to deliver (default: all)", + "items": { + "type": "string" + }, + "type": "array" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "metadata": { + "additionalProperties": {}, + "description": "Opaque metadata echoed in every event", + "type": "object" + }, + "secret": { + "description": "Signing secret for webhook payloads (8-256 chars)", + "maxLength": 256, + "minLength": 8, + "type": "string" + }, + "url": { + "format": "uri", + "maxLength": 2083, + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" +} - added
Input schema / properties / webhook_url / maxLengthAdded value: +2083
- Changed
alterlab_create_session17 fields changed- added
Input schema / properties / auto_refresh_enabledAdded value: +{ + "description": "Enable proactive expiry detection and health checks (API default true)", + "type": "boolean" +} - added
Input schema / properties / consentAdded value: +{ + "description": "Explicit GDPR consent from the account owner to store these session cookies. Must be true — the API rejects session creation with CONSENT_REQUIRED otherwise. Only set true after the user has agreed to AlterLab storing their cookies.", + "type": "boolean" +} - removed
Input schema / properties / cookies / additionalPropertiesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / cookies / anyOfAdded value: +[ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "expires": { + "type": "number" + }, + "httpOnly": { + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "path": { + "type": "string" + }, + "sameSite": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + } +] - changed
Input schema / properties / cookies / descriptionPrevious value: -"Cookie key-value pairs for authentication (e.g., {\"session-id\": \"abc123\", \"session-token\": \"xyz789\"})"New value: +"Cookies for authentication. Cookies as a {name: value} object (e.g. {\"session-id\": \"abc123\"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}." - removed
Input schema / properties / cookies / typeRemoved value: -"object" - added
Input schema / properties / domain / maxLengthAdded value: +255 - changed
Input schema / properties / domain / minLengthPrevious value: -1New value: +3 - added
Input schema / properties / expires_atAdded value: +{ + "description": "Session expiry in ISO 8601 format (e.g., '2026-12-31T23:59:59Z')", + "type": "string" +} - added
Input schema / properties / headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Custom headers sent with this session (e.g., a User-Agent or Authorization header)", + "type": "object" +} - added
Input schema / properties / notesAdded value: +{ + "description": "Free-text notes about this session", + "maxLength": 1000, + "type": "string" +} - added
Input schema / properties / notify_before_expiryAdded value: +{ + "description": "Notify when the session is about to expire (API default true)", + "type": "boolean" +} - added
Input schema / properties / notify_on_failureAdded value: +{ + "description": "Notify when session validation fails (API default true)", + "type": "boolean" +} - added
Input schema / properties / organization_idAdded value: +{ + "description": "Organization to assign the session to (org admins only)", + "format": "uuid", + "type": "string" +} - added
Input schema / properties / sharedAdded value: +{ + "description": "Share the session with organization members immediately (API default false)", + "type": "boolean" +} - removed
Input schema / properties / user_agentRemoved value: -{ - "description": "Browser User-Agent string to use with this session", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "name", - "domain", - "cookies" -]New value: +[ + "name", + "domain", + "consent" +]
- Changed
alterlab_estimate_cost11 fields changed- changed
Input schema / properties / formats / descriptionPrevious value: -"Output formats to include in the estimate. Passed to the API but does not currently affect the cost estimate — the endpoint uses URL-pattern heuristics only. 'json_v2' returns a structured section tree. 'rag' returns chunked text for retrieval-augmented generation. 'content' returns body_markdown + content_hash + images + links. 'raw' returns the response body byte-for-byte with no transformation."New value: +"Output formats to include in the estimate. Passed to the API but does not currently affect the cost estimate — the endpoint uses URL-pattern heuristics only. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines." - added
Input schema / properties / generate_pdfAdded value: +{ + "description": "Include the PDF add-on (+$0.0004)", + "type": "boolean" +} - added
Input schema / properties / methodAdded value: +{ + "description": "HTTP method. POST requests cost 1.5x the base tier price.", + "enum": [ + "GET", + "POST" + ], + "type": "string" +} - added
Input schema / properties / ocrAdded value: +{ + "description": "Include the OCR add-on (+$0.001)", + "type": "boolean" +} - added
Input schema / properties / render_js / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "const": "auto", + "type": "string" + } +] - changed
Input schema / properties / render_js / descriptionPrevious value: -"Enable JS rendering (forces Tier 4 minimum — no separate add-on charge)"New value: +"Enable JS rendering (forces Tier 4 minimum, $0.004 — no separate add-on charge)" - removed
Input schema / properties / render_js / typeRemoved value: -"boolean" - added
Input schema / properties / screenshotAdded value: +{ + "description": "Include the screenshot add-on (+$0.0002)", + "type": "boolean" +} - added
Input schema / properties / url / maxLengthAdded value: +2083 - added
Input schema / properties / use_own_proxyAdded value: +{ + "description": "Price the request with your own proxy integration (20% BYOP discount)", + "type": "boolean" +} - changed
Input schema / properties / use_proxy / descriptionPrevious value: -"Include premium proxy cost (+1 credit)"New value: +"Include premium proxy cost (+$0.0002)"
- Changed
alterlab_extract3 fields changed- added
Input schema / properties / content / maxLengthAdded value: +500000 - added
Input schema / properties / extraction_model / anyOfAdded value: +[ + { + "maxLength": 256, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / extraction_model / typeRemoved value: -[ - "string", - "null" -]
- Added
alterlab_get_job - Changed
alterlab_map4 fields changed- added
Input schema / properties / exclude_patterns / maxItemsAdded value: +50 - added
Input schema / properties / include_patterns / maxItemsAdded value: +50 - added
Input schema / properties / sitemap_path / maxLengthAdded value: +500 - added
Input schema / properties / url / maxLengthAdded value: +2083
- Changed
alterlab_refresh_session4 fields changed- removed
Input schema / properties / cookies / additionalPropertiesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / cookies / anyOfAdded value: +[ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "expires": { + "type": "number" + }, + "httpOnly": { + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "path": { + "type": "string" + }, + "sameSite": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + } +] - changed
Input schema / properties / cookies / descriptionPrevious value: -"New cookie key-value pairs to replace the old ones. If omitted, only failure counters are reset."New value: +"New cookies to replace the old ones. If omitted, only failure counters are reset. Cookies as a {name: value} object (e.g. {\"session-id\": \"abc123\"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}." - removed
Input schema / properties / cookies / typeRemoved value: -"object"
- Changed
alterlab_scrape50 fields changed- added
Input schema / properties / actionsAdded value: +{ + "description": "Browser automation actions run in order after page load (max 20, requires render_js=true). Failed actions are skipped without aborting the sequence. Results are returned in action_results. Each action has a 'type': wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate.", + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "milliseconds": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "selector": { + "description": "CSS selector to wait for visibility", + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "wait", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "timeout": { + "description": "Timeout in ms (default 10000)", + "maximum": 30000, + "minimum": 1000, + "type": "integer" + }, + "type": { + "const": "wait_for", + "type": "string" + } + }, + "required": [ + "type", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "click", + "type": "string" + } + }, + "required": [ + "type", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "selector": { + "maxLength": 500, + "type": "string" + }, + "type": { + "const": "fill", + "type": "string" + }, + "value": { + "maxLength": 5000, + "type": "string" + } + }, + "required": [ + "type", + "selector", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "key": { + "description": "Key to press, e.g. 'Enter', 'Tab', 'Escape'", + "maxLength": 50, + "type": "string" + }, + "type": { + "const": "press", + "type": "string" + } + }, + "required": [ + "type", + "key" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Viewport heights to scroll", + "maximum": 20, + "minimum": 1, + "type": "integer" + }, + "direction": { + "enum": [ + "down", + "up" + ], + "type": "string" + }, + "type": { + "const": "scroll", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "delay": { + "description": "Delay between scrolls in ms", + "maximum": 5000, + "minimum": 200, + "type": "integer" + }, + "end_selector": { + "description": "Stop scrolling when this selector appears", + "maxLength": 500, + "type": "string" + }, + "max_scrolls": { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + "type": { + "const": "infinite_scroll", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "full_page": { + "type": "boolean" + }, + "type": { + "const": "screenshot", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "script": { + "description": "JavaScript to run in the page (max 5120 chars). Network APIs (fetch, XMLHttpRequest, WebSocket) and dynamic code execution (eval, Function) are blocked.", + "maxLength": 5120, + "type": "string" + }, + "type": { + "const": "evaluate", + "type": "string" + } + }, + "required": [ + "type", + "script" + ], + "type": "object" + } + ] + }, + "maxItems": 20, + "type": "array" +} - removed
Input schema / properties / block_images / defaultRemoved value: -false - changed
Input schema / properties / cache_ttl / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / cost_controls / descriptionPrevious value: -"Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. Prefer these over the top-level prefer_cost/prefer_speed/fail_fast fields for full control."New value: +"Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed." - changed
Input schema / properties / cost_controls / properties / max_tier / descriptionPrevious value: -"Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set."New value: +"Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set. Combining render_js=true with a max_tier below 4 is rejected (render_js forces tier 4)." - added
Input schema / properties / embeddingsAdded value: +{ + "additionalProperties": false, + "description": "Chunk the scraped text and embed it with OpenAI models (+$0.001 per page). Set enabled=true; model, chunk_size (64-8191) and chunk_overlap (0-2048) are optional.", + "properties": { + "chunk_overlap": { + "maximum": 2048, + "minimum": 0, + "type": "integer" + }, + "chunk_size": { + "maximum": 8191, + "minimum": 64, + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "model": { + "enum": [ + "text-embedding-3-small", + "text-embedding-3-large" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / enable_scrollAdded value: +{ + "description": "Force scrolling for lazy-load images. true: always scroll (+5-10s), false: never scroll, omit: auto (scroll unless social media site).", + "type": [ + "boolean", + "null" + ] +} - added
Input schema / properties / extraction_model / anyOfAdded value: +[ + { + "maxLength": 256, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / extraction_model / typeRemoved value: -[ - "string", - "null" -] - changed
Input schema / properties / extraction_profile / descriptionPrevious value: -"Pre-built extraction schema template. auto: detect best template. product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries."New value: +"Pre-built extraction schema template. auto: detect best template (API default). product: e-commerce product details. article: news/blog article fields. job_posting: job listing fields. faq: FAQ entries. recipe: recipe ingredients and instructions. event: event details. ecommerce_homepage: homepage product listings. directory_listing: directory/listing page entries. Mutually exclusive with extraction_template." - changed
Input schema / properties / extraction_schema / descriptionPrevious value: -"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"New value: +"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM (+$0.001). Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }" - added
Input schema / properties / extraction_templateAdded value: +{ + "$ref": "#/properties/extraction_profile", + "description": "Shorthand alias for extraction_profile — selects the same pre-built template. Mutually exclusive with extraction_profile." +} - changed
Input schema / properties / fail_fast / descriptionPrevious value: -"Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Use this to protect against unexpected credit spend on protected pages. Returns an error with the required tier instead of automatically upgrading."New value: +"Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Shorthand for cost_controls.fail_fast. Returns an error with the required tier instead of upgrading." - added
Input schema / properties / flatten_shadow_domAdded value: +{ + "description": "Flatten Shadow DOM roots into regular DOM for extraction (free, requires render_js).", + "type": "boolean" +} - changed
Input schema / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown", - "rag", - "raw", - "content" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "content", + "raw" +] - added
Input schema / properties / generate_pdfAdded value: +{ + "description": "Generate a PDF of the rendered page (+$0.0004, requires render_js)", + "type": "boolean" +} - added
Input schema / properties / headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Custom HTTP headers to send to the target URL. Hop-by-hop headers (Connection, Transfer-Encoding, Host, etc.) are not allowed.", + "type": "object" +} - added
Input schema / properties / include_iframesAdded value: +{ + "description": "Inline iframe content into the main document (free, requires render_js). Same-origin iframes are read directly; cross-origin iframes are marked but not fetched.", + "type": "boolean" +} - removed
Input schema / properties / max_response_bytes / defaultRemoved value: -5242880 - added
Input schema / properties / ocrAdded value: +{ + "description": "Extract text from images using OCR (+$0.001)", + "type": "boolean" +} - added
Input schema / properties / ocr_languageAdded value: +{ + "description": "Tesseract language code for OCR (API default 'eng')", + "type": "string" +} - added
Input schema / properties / pdf_formatAdded value: +{ + "description": "Output format for mode='pdf' extraction (API default 'markdown')", + "type": "string" +} - changed
Input schema / properties / prefer_cost / descriptionPrevious value: -"Optimize for lowest cost — try cheaper tiers first before escalating. Best for non-time-sensitive scrapes where minimizing credit spend matters. Mutually exclusive intent with prefer_speed."New value: +"Optimize for lowest cost — try cheaper tiers first before escalating. Shorthand for cost_controls.prefer_cost. Mutually exclusive intent with prefer_speed." - changed
Input schema / properties / prefer_speed / descriptionPrevious value: -"Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Best for time-sensitive scrapes where latency matters more than cost. Mutually exclusive intent with prefer_cost."New value: +"Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Shorthand for cost_controls.prefer_speed. Mutually exclusive intent with prefer_cost." - changed
Input schema / properties / promote_schema_org / descriptionPrevious value: -"Use Schema.org JSON-LD/Microdata as the primary structured-data source when present. Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages."New value: +"Use Schema.org JSON-LD/Microdata as the primary structured-data source when present (API default true). Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages." - changed
Input schema / properties / proxy_country / descriptionPrevious value: -"ISO country code for geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true"New value: +"ISO country code for proxy geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true" - added
Input schema / properties / proxy_integration_idAdded value: +{ + "description": "Specific proxy integration ID to use (requires use_own_proxy=true)", + "type": "string" +} - removed
Input schema / properties / remove_cookie_banners / defaultRemoved value: -true - changed
Input schema / properties / remove_cookie_banners / descriptionPrevious value: -"Remove cookie consent banners from HTML before content extraction (free, enabled by default)"New value: +"Remove cookie consent banners from HTML before content extraction (free; the API default is true)" - removed
Input schema / properties / render_js / defaultRemoved value: -false - changed
Input schema / properties / render_js / descriptionPrevious value: -"Render JavaScript using headless browser (forces Tier 4 minimum — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with browser — saves 30-60% on mixed sites)."New value: +"Render JavaScript using a headless browser (forces Tier 4 minimum, $0.004/req — no separate add-on charge). Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, only renders JS-heavy pages with a browser — saves 30-60% on mixed sites)." - added
Input schema / properties / screenshotAdded value: +{ + "description": "Capture a full-page screenshot (+$0.0002, requires render_js). The URL is returned as screenshot_url. Use alterlab_screenshot to get the image inline.", + "type": "boolean" +} - removed
Input schema / properties / scroll_count / defaultRemoved value: -3 - changed
Input schema / properties / scroll_count / descriptionPrevious value: -"Number of scroll iterations when scroll_to_load is enabled (1-10, default 3)"New value: +"Number of scroll iterations when scroll_to_load is enabled (1-10, API default 3)" - removed
Input schema / properties / scroll_to_load / defaultRemoved value: -false - added
Input schema / properties / section_filterAdded value: +{ + "additionalProperties": false, + "description": "Filter for the json_v2 section tree. Only applies when 'json_v2' is in formats.", + "properties": { + "content_only": { + "type": "boolean" + }, + "exclude_content_types": { + "items": { + "type": "string" + }, + "type": "array" + }, + "min_content_blocks": { + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / session_headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Inline auth headers sent to the target (e.g. Authorization: Bearer ...). Merged with the stored session's headers when session_id is also set.", + "type": "object" +} - added
Input schema / properties / skip_tls_verificationAdded value: +{ + "description": "TLS certificate verification for the target. Omit (recommended): certificates are verified, and if the site's own certificate is invalid (expired, self-signed, wrong hostname, incomplete chain) the page is still fetched without verification. true skips verification from the start. false always requires a valid certificate, so sites with an invalid certificate fail.", + "type": "boolean" +} - added
Input schema / properties / sticky_sessionAdded value: +{ + "description": "Sticky-session handle. Scrapes that pass the same value reuse the cookie jar captured on the first call and, best-effort, the same exit IP (~10 min). Alphanumeric, '-' and '_' only. Requires a paid plan (growth tier or above).", + "maxLength": 128, + "type": "string" +} - added
Input schema / properties / sticky_session_ttlAdded value: +{ + "description": "Sticky-session cookie-jar lifetime in seconds (300-7200, API default 1800). Ignored unless sticky_session is set.", + "maximum": 7200, + "minimum": 300, + "type": "integer" +} - added
Input schema / properties / sync_policyAdded value: +{ + "description": "Synchronous wait policy. 'auto' (default) may return an early 202 with a job_id for predicted T3/T4 jobs; 'wait_until_deadline' keeps the connection open until the terminal result or the safe sync deadline (~85s).", + "enum": [ + "auto", + "wait_until_deadline" + ], + "type": "string" +} - changed
Input schema / properties / template / descriptionPrevious value: -"Named extraction template to apply to the scrape result. Accepts standard template names (e.g. 'product', 'article', 'job_posting') or a custom template name registered in your account. When provided, routes the request through template-based extraction."New value: +"DEPRECATED alias for extraction_template, kept for backward compatibility. Sent to the API as extraction_template; prefer extraction_template." - changed
Input schema / properties / timeout / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / url / maxLengthAdded value: +2083 - added
Input schema / properties / use_own_proxyAdded value: +{ + "description": "Use your own proxy integration (bring-your-own-proxy) instead of the system proxy. BYOP requests get a 20% discount on the tier price.", + "type": "boolean" +} - removed
Input schema / properties / use_proxy / defaultRemoved value: -false - changed
Input schema / properties / use_proxy / descriptionPrevious value: -"Route through premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot"New value: +"Route through AlterLab's premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot" - added
Input schema / properties / use_system_proxyAdded value: +{ + "description": "Override your default proxy integration and use AlterLab's system proxy for this request.", + "type": "boolean" +} - added
Input schema / properties / wait_conditionAdded value: +{ + "description": "Wait condition for JS rendering: domcontentloaded, networkidle or load", + "type": "string" +} - added
Input schema / properties / wait_untilAdded value: +{ + "description": "Page load event to wait for before extracting (networkidle, domcontentloaded or load; API default networkidle)", + "type": "string" +}
- Changed
alterlab_screenshot7 fields changed- added
Input schema / properties / cookiesAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Inline cookies for a one-off authenticated screenshot", + "type": "object" +} - added
Input schema / properties / locationAdded value: +{ + "additionalProperties": false, + "description": "Geo-targeting parameters for localized content scraping. Controls proxy country routing, Accept-Language header, and browser locale.", + "properties": { + "country": { + "description": "ISO 3166-1 alpha-2 country code for geo-targeting (e.g., 'US', 'DE', 'JP'). Routes request through a proxy in the specified country.", + "maxLength": 2, + "minLength": 2, + "type": "string" + }, + "language": { + "description": "ISO 639-1 language code (e.g., 'en', 'de', 'ja'). Sets the Accept-Language header and browser locale.", + "maxLength": 5, + "minLength": 2, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / proxy_countryAdded value: +{ + "description": "ISO country code for proxy geo-targeting. Requires use_proxy=true", + "type": "string" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "UUID of a stored session, to screenshot a logged-in page", + "format": "uuid", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "description": "Request timeout in seconds (1-300, API default 90)", + "maximum": 300, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / url / maxLengthAdded value: +2083 - added
Input schema / properties / use_proxyAdded value: +{ + "description": "Route through AlterLab's premium proxy (+$0.0002)", + "type": "boolean" +}
- Changed
alterlab_search4 fields changed- added
Input schema / properties / domain / maxLengthAdded value: +253 - added
Input schema / properties / engineAdded value: +{ + "description": "Search engine (API default duckduckgo). duckduckgo costs $0.001/query; google and bing use browser rendering and cost $0.004/query.", + "enum": [ + "duckduckgo", + "google", + "bing" + ], + "type": "string" +} - changed
Input schema / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "content" +] - changed
Input schema / properties / safe_search / descriptionPrevious value: -"Enable safe search filtering to exclude adult content from results. Defaults to the search engine's own safe-search setting when omitted."New value: +"Safe search filtering to exclude adult content from results (API default true). Set false to disable."
- Changed
alterlab_update_session7 fields changed- added
Input schema / properties / auto_refresh_enabledAdded value: +{ + "description": "Enable or disable proactive expiry detection and health checks", + "type": "boolean" +} - removed
Input schema / properties / cookies / additionalPropertiesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / cookies / anyOfAdded value: +[ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "expires": { + "type": "number" + }, + "httpOnly": { + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "path": { + "type": "string" + }, + "sameSite": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" + } +] - changed
Input schema / properties / cookies / descriptionPrevious value: -"New cookie key-value pairs — replaces ALL existing cookies (e.g., {\"session-id\": \"new123\", \"session-token\": \"newxyz\"})"New value: +"New cookies — replaces ALL existing cookies. Cookies as a {name: value} object (e.g. {\"session-id\": \"abc123\"}) or as a list (max 100) of cookie objects with metadata: {name, value, domain?, path?, secure?, httpOnly?, sameSite?, expires?}." - removed
Input schema / properties / cookies / typeRemoved value: -"object" - added
Input schema / properties / notify_before_expiryAdded value: +{ + "description": "Enable or disable the before-expiry notification", + "type": "boolean" +} - added
Input schema / properties / notify_on_failureAdded value: +{ + "description": "Enable or disable the validation-failure notification", + "type": "boolean" +}
7 tool updates
v1.8.0- Added
alterlab_batch_scrape - Changed
alterlab_crawl6 fields changed- added
Input schema / properties / cost_controlsAdded value: +{ + "additionalProperties": false, + "description": "Cost controls for the entire crawl — cap total spend or pin the scraping tier", + "properties": { + "force_tier": { + "$ref": "#/properties/cost_controls/properties/max_tier", + "description": "Force all pages to use this exact tier, bypassing per-page escalation" + }, + "max_credits": { + "description": "Hard spending cap in credits for the entire crawl", + "exclusiveMinimum": 0, + "type": "integer" + }, + "max_tier": { + "description": "Maximum tier to use for page scrapes (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004)", + "enum": [ + "1", + "2", + "3", + "3.5", + "4" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / extraction_profileAdded value: +{ + "description": "Pre-defined extraction profile applied to every crawled page. 'auto' detects the page type automatically.", + "enum": [ + "auto", + "product", + "article", + "job_posting", + "faq", + "recipe", + "event" + ], + "type": "string" +} - added
Input schema / properties / headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Custom HTTP headers injected into every page request during the crawl (e.g., {\"Authorization\": \"Bearer token\"}). Maximum 50 headers.", + "type": "object" +} - added
Input schema / properties / sitemap_pathAdded value: +{ + "description": "Explicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "description": "Per-page request timeout in seconds (1-300)", + "maximum": 300, + "minimum": 1, + "type": "number" +} - added
Input schema / properties / wait_forAdded value: +{ + "description": "CSS selector to wait for before extracting each page (e.g., '#main-content'). Applied to all pages in the crawl.", + "type": "string" +}
- Changed
alterlab_estimate_cost1 field changed- changed
Input schema / properties / formats / descriptionPrevious value: -"Output formats to include in the estimate. Affects cost prediction accuracy. 'json_v2' returns a structured section tree. 'rag' returns chunked text for retrieval-augmented generation. 'content' returns body_markdown + content_hash + images + links. 'raw' returns the response body byte-for-byte with no transformation."New value: +"Output formats to include in the estimate. Passed to the API but does not currently affect the cost estimate — the endpoint uses URL-pattern heuristics only. 'json_v2' returns a structured section tree. 'rag' returns chunked text for retrieval-augmented generation. 'content' returns body_markdown + content_hash + images + links. 'raw' returns the response body byte-for-byte with no transformation."
- Added
alterlab_get_usage - Changed
alterlab_map1 field changed- added
Input schema / properties / sitemap_pathAdded value: +{ + "description": "Explicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.", + "type": "string" +}
- Changed
alterlab_scrape19 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"Request body for POST/PUT/PATCH requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{\"query\": \"{ user { id name } }\"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET/HEAD/DELETE requests."New value: +"Request body for POST requests. For GraphQL: JSON string with 'query' and optional 'variables' fields (e.g., '{\"query\": \"{ user { id name } }\"}').For REST APIs: JSON-encoded payload string. For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). Omit for GET requests." - added
Input schema / properties / cacheAdded value: +{ + "description": "Enable caching for this request. When true, repeat requests with identical parameters may return cached results. Only use for idempotent requests (GET pages, read-only POSTs).", + "type": "boolean" +} - added
Input schema / properties / cache_ttlAdded value: +{ + "description": "Cache TTL in seconds (60–86400). Defaults to 3600 (60 min) when cache=true. Requires cache=true.", + "maximum": 86400, + "minimum": 60, + "type": "number" +} - added
Input schema / properties / content_typeAdded value: +{ + "description": "Content-Type header for the request body. Defaults to 'application/json' when body is provided. Use 'application/graphql' for raw GraphQL queries. Use 'application/x-www-form-urlencoded' for HTML form submissions. Requires body to be set.", + "enum": [ + "application/json", + "application/x-www-form-urlencoded", + "text/plain", + "application/graphql" + ], + "type": "string" +} - added
Input schema / properties / cost_controlsAdded value: +{ + "additionalProperties": false, + "description": "Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. Prefer these over the top-level prefer_cost/prefer_speed/fail_fast fields for full control.", + "properties": { + "fail_fast": { + "description": "Return error instead of escalating to more expensive tiers on failure.", + "type": "boolean" + }, + "force_tier": { + "description": "Pin execution to this exact tier, bypassing escalation (1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). Use to guarantee a specific engine is used regardless of site difficulty.", + "enum": [ + "1", + "2", + "3", + "3.5", + "4" + ], + "type": "string" + }, + "max_credits": { + "description": "Hard spending cap for this request in credits. Request fails if cost would exceed this.", + "exclusiveMinimum": 0, + "type": "number" + }, + "max_tier": { + "$ref": "#/properties/cost_controls/properties/force_tier", + "description": "Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. Cannot exceed force_tier when both are set." + }, + "prefer_cost": { + "description": "Optimize for cost — try cheaper tiers first, accept lower success probability.", + "type": "boolean" + }, + "prefer_speed": { + "description": "Optimize for speed — skip to the most reliable tier for this domain.", + "type": "boolean" + }, + "time_budget": { + "description": "Total wall-clock budget in seconds for the entire tier escalation sequence (5–300s). Escalation stops when remaining budget is insufficient for the next tier attempt.", + "maximum": 300, + "minimum": 5, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / estimate_firstAdded value: +{ + "default": false, + "description": "Run a cost estimate before scraping and include it in the response. Adds one lightweight API call (~50ms) with no credit charge. The estimated tier, cost, and confidence are prepended to the scrape result. Useful for unfamiliar or potentially expensive sites — see cost before committing.", + "type": "boolean" +} - added
Input schema / properties / evidenceAdded value: +{ + "description": "Include provenance/evidence snippets alongside extracted fields. Each extracted value will include the source text passage it was derived from. Requires extraction_schema or extraction_prompt.", + "type": "boolean" +} - changed
Input schema / properties / extraction_schema / descriptionPrevious value: -"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in content.json (add 'json' to formats) and in the top-level filtered_content field. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }"New value: +"JSON schema for structured extraction. The API extracts fields matching this schema from the scraped page using LLM. Result is returned in extraction_result. Example: { \"title\": \"string\", \"price\": \"number\", \"in_stock\": \"boolean\" }" - added
Input schema / properties / fail_fastAdded value: +{ + "description": "Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. Use this to protect against unexpected credit spend on protected pages. Returns an error with the required tier instead of automatically upgrading.", + "type": "boolean" +} - added
Input schema / properties / filter_contentAdded value: +{ + "description": "Apply quality filtering to extracted content. When false (default), returns all parsed content without quality thresholds (lossless mode). When true, filters low-quality boilerplate.", + "type": "boolean" +} - added
Input schema / properties / force_refreshAdded value: +{ + "description": "Bypass the cache and always fetch a fresh copy of the page. Use when you need real-time content and a cached result would be stale.", + "type": "boolean" +} - changed
Input schema / properties / formats / descriptionPrevious value: -"Output formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines."New value: +"Output formats. 'markdown' is best for LLM consumption. 'json_v2' returns a structured section tree (headings + content blocks). 'rag' returns chunked text optimized for retrieval-augmented generation. 'raw' returns the raw response body without extraction. 'content' returns body_markdown + content_hash + images + links for AI/KB pipelines." - changed
Input schema / properties / formats / items / enumPrevious value: -[ - "text", - "json", - "json_v2", - "html", - "markdown", - "rag", - "content" -]New value: +[ + "text", + "json", + "json_v2", + "html", + "markdown", + "rag", + "raw", + "content" +] - changed
Input schema / properties / method / descriptionPrevious value: -"HTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, REST API calls. Use PUT/PATCH for REST API updates. When using POST/PUT/PATCH, provide body with the request payload."New value: +"HTTP method for the request. Default GET (standard page scraping). Use POST for GraphQL endpoints, form submissions, and REST API calls. When using POST, provide body with the request payload. POST costs 1.5x base tier price." - changed
Input schema / properties / method / enumPrevious value: -[ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "HEAD" -]New value: +[ + "GET", + "POST" +] - added
Input schema / properties / prefer_costAdded value: +{ + "description": "Optimize for lowest cost — try cheaper tiers first before escalating. Best for non-time-sensitive scrapes where minimizing credit spend matters. Mutually exclusive intent with prefer_speed.", + "type": "boolean" +} - added
Input schema / properties / prefer_speedAdded value: +{ + "description": "Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. Best for time-sensitive scrapes where latency matters more than cost. Mutually exclusive intent with prefer_cost.", + "type": "boolean" +} - added
Input schema / properties / promote_schema_orgAdded value: +{ + "description": "Use Schema.org JSON-LD/Microdata as the primary structured-data source when present. Promotes machine-readable metadata embedded in the page over LLM extraction. Most effective on e-commerce, recipe, and news article pages.", + "type": "boolean" +} - added
Input schema / properties / templateAdded value: +{ + "description": "Named extraction template to apply to the scrape result. Accepts standard template names (e.g. 'product', 'article', 'job_posting') or a custom template name registered in your account. When provided, routes the request through template-based extraction.", + "type": "string" +}
- Changed
alterlab_search1 field changed- added
Input schema / properties / safe_searchAdded value: +{ + "description": "Enable safe search filtering to exclude adult content from results. Defaults to the search engine's own safe-search setting when omitted.", + "type": "boolean" +}
2 tool updates
v1.7.0- Changed
alterlab_crawl1 field changed- added
Input schema / properties / block_imagesAdded value: +{ + "default": false, + "description": "Block image downloads during browser rendering on each crawled page. Reduces proxy bandwidth and speeds up crawls. Only effective with render_js=true.", + "type": "boolean" +}
- Changed
alterlab_scrape1 field changed- added
Input schema / properties / block_imagesAdded value: +{ + "default": false, + "description": "Block image downloads during browser rendering. Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true.", + "type": "boolean" +}
23 tool updates
v1.5.0- First observed
alterlab_batch - First observed
alterlab_batch_status - First observed
alterlab_check_balance - First observed
alterlab_crawl - First observed
alterlab_crawl_cancel - First observed
alterlab_crawl_status - First observed
alterlab_create_session - First observed
alterlab_delete_session - First observed
alterlab_disable_beta_feature - First observed
alterlab_enable_beta_feature - First observed
alterlab_estimate_cost - First observed
alterlab_extract - First observed
alterlab_get_session - First observed
alterlab_list_beta_features - First observed
alterlab_list_my_beta_features - First observed
alterlab_list_sessions - First observed
alterlab_map - First observed
alterlab_refresh_session - First observed
alterlab_scrape - First observed
alterlab_screenshot - First observed
alterlab_search - First observed
alterlab_update_session - First observed
alterlab_validate_session
TDQS
Scored across 26 tools
Tools are grouped into distinct domains (scrape/extract, crawl, batch, sessions, account, beta) and descriptions explicitly cross-reference siblings to steer selection. However, a few pairs blur boundaries: alterlab_batch vs alterlab_batch_scrape (async vs inline), alterlab_update_session vs alterlab_refresh_session (both rotate cookies), and alterlab_get_usage vs alterlab_check_balance all require reading the descriptions to disambiguate. These overlaps are documented but still create mild misselection risk.
Every tool uses the alterlab_ prefix with snake_case, and the vast majority follow a clear verb_noun pattern (create_session, delete_session, list_sessions, estimate_cost, enable_beta_feature). The few deviations (crawl_status, batch_status, bare verbs like search/map) are natural and remain fully predictable and readable.
At 26 tools the surface is on the heavy side and pushes past the comfortable range. Several tools could be consolidated (batch vs batch_scrape, list_beta_features vs list_my_beta_features), though the breadth of the platform's features (scraping, crawling, batching, sessions, account, beta flags) partially justifies the count.
Coverage is strong: full session lifecycle (create/read/update/refresh/validate/delete), scrape/crawl/batch with status and cancel, async job polling, cost estimation, and balance/usage. Minor gaps remain, such as no dedicated tool for managing completion webhooks or exports, both of which are only exposed as parameters.
Maintenance
Related MCP Connectors
Crawl, scrape, search the web, and automate browsers at scale with anti-bot bypass.
Fetch and extract data from any public web page, even JS-rendered or anti-bot protected
Fetch, crawl, and browse protected pages with anti-bot handling - renders in a real browser and
Web scraping for AI agents. Extract text and metadata from any URL worldwide. $0.005/page.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables web scraping and document processing with JavaScript execution, anti-detection measures, batch processing, and structured data extraction. Supports multiple formats including markdown, HTML, screenshots, and handles PDFs with OCR capabilities.4MIT
- AlicenseBqualityBmaintenanceEnables web scraping and data extraction from websites with geographic flexibility, privacy features, and anti-detection capabilities. Supports scraping general websites, Google Search, Amazon Search, and Reddit with customizable parameters for rendering, geolocation, and locale.301,196 npm37ISC
- AlicenseNot gradedqualityFmaintenanceEnables intelligent web scraping with support for static pages, JavaScript-rendered SPAs, and natural language data extraction.MIT
- FlicenseAqualityCmaintenanceEnables crawling websites, including JavaScript-rendered pages, and returns extracted page content as JSON with structured error reporting.1-