Skip to main content
Glama
RapierCraft

alterlab-mcp-server


One-Line Install

Claude Code

claude mcp add alterlab -- npx -y alterlab-mcp-server@latest

Then 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 below

Smithery

npx -y @smithery/cli install alterlab-mcp-server --client claude

Related 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:

  1. Curl ($0.0002/req) — Direct HTTP for static pages, RSS feeds, public APIs

  2. HTTP ($0.0003/req) — TLS fingerprint rotation for moderately protected sites

  3. Stealth ($0.002/req) — Browser impersonation for Cloudflare/DataDome-protected sites

  4. Light JS ($0.0025/req) — Lightweight JS extraction from server-rendered HTML

  5. 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 claude

Get Your API Key

  1. Sign up free — $1 free balance on signup

  2. Go to Dashboard → API Keys and copy your key

  3. Paste it into the ALTERLAB_API_KEY field 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

url

string

required

URL to scrape

mode

auto | html | js | pdf | ocr

auto

Scraping mode

method / body / content_type / headers

enum / string / enum / object

GET

POST support (1.5x cost) and custom target headers

formats

(text|json|json_v2|html|markdown|rag|content|raw)[]

["markdown"]

Output formats

extraction_schema / extraction_prompt

object / string

—

LLM extraction (+$0.001)

extraction_profile / extraction_template

enum

—

auto, product, article, job_posting, faq, recipe, event, ecommerce_homepage, directory_listing (template is a deprecated alias)

extraction_provider / extraction_model

enum / string

—

BYOK LLM selection

evidence, promote_schema_org, filter_content

boolean

—

Extraction behaviour

cache, cache_ttl, force_refresh

boolean / number / boolean

—

Response caching (cache_ttl 60-86400)

render_js

boolean | "auto"

API default

Headless browser (forces Browser tier, $0.004)

use_proxy, proxy_country

boolean, string

—

Premium proxy (+$0.0002) and geo-targeting

use_own_proxy, use_system_proxy, proxy_integration_id

boolean, boolean, string

—

Bring-your-own-proxy selection

skip_tls_verification

boolean

—

Omit (recommended) = verify, fall back on invalid certs; true skip, false require valid cert

wait_for, wait_until, wait_condition

string

—

Selector / load-event waits

actions

object[] (max 20)

—

Browser actions: wait, wait_for, click, fill, press, scroll, infinite_scroll, screenshot, evaluate

screenshot, generate_pdf, ocr

boolean

—

Add-ons (+$0.0002 / +$0.0004 / +$0.001)

scroll_to_load, scroll_count, enable_scroll

boolean / 1-10 / boolean

—

Lazy-load handling

include_iframes, flatten_shadow_dom, block_images, remove_cookie_banners

boolean

—

Rendering options

section_filter

object

—

Filter for json_v2 sections

session_id, cookies, session_headers

UUID, object, object

—

Authenticated scraping

sticky_session, sticky_session_ttl

string, 300-7200

—

Reuse cookies and exit IP across calls (paid plans)

location

{country, language}

—

Geo-targeting

cost_controls

object

—

force_tier, max_tier, max_credits, prefer_cost, prefer_speed, fail_fast, time_budget (prefer_cost, prefer_speed, fail_fast also accepted at top level)

embeddings

object

—

enabled, model, chunk_size, chunk_overlap (+$0.001/page)

sync_policy

auto | wait_until_deadline

auto

Wait behaviour for long scrapes

timeout, max_response_bytes, include_raw_html

number, number, boolean

90, 5 MB, false

Limits and raw output

estimate_first

boolean

false

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

content

string (max 500,000)

required

HTML, text or markdown you already have (this tool does not fetch a URL)

content_type

html | text | markdown

html

Type of content

extraction_profile / extraction_template

enum

—

Profile: auto, product, article, job_posting, faq, recipe, event, ecommerce_homepage, directory_listing

extraction_schema

object

—

Custom JSON Schema for structured output

extraction_prompt

string

—

Natural language extraction instructions

extraction_provider / extraction_model

enum / string

—

BYOK LLM selection

formats

enum[]

["json"]

Output formats

source_url, evidence

string, boolean

—

Context URL and provenance

cache, cache_ttl

auto | skip | only, number

auto

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

url

string

required

URL to screenshot

wait_for

string

—

CSS selector to wait for before capture

wait_until

enum

networkidle

networkidle, domcontentloaded, or load

timeout

number

90

Timeout in seconds (1-300)

use_proxy, proxy_country

boolean, string

—

Premium proxy and geo-targeting

session_id, cookies

UUID, object

—

Screenshot pages behind a login

location

{country, language}

—

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

url

string

required

URL to estimate

mode

enum

auto

Scraping mode

method

GET | POST

GET

POST costs 1.5x

render_js

boolean | "auto"

false

Include JS rendering cost

use_proxy, use_own_proxy

boolean

false

Include proxy cost / BYOP discount

screenshot, generate_pdf, ocr

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

name

string

required

Human-readable name (e.g., "My Amazon Account")

domain

string

required

Domain (e.g., "amazon.com")

consent

boolean

required

Must be true: explicit GDPR consent to store the cookies (the API rejects creation otherwise)

cookies

Record<string,string> | cookie objects[]

&mdash;

Cookies as key-value pairs or {name, value, domain, path, ...} objects

headers

Record<string,string>

&mdash;

Custom headers (e.g. a User-Agent)

expires_at, notes

string

&mdash;

Expiry (ISO 8601) and notes

auto_refresh_enabled, notify_before_expiry, notify_on_failure

boolean

true

Health checks and notifications

organization_id, shared

UUID, boolean

&mdash;

Organization sharing

alterlab_validate_session &mdash; 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

session_id

string (UUID)

required

Session ID to validate

alterlab_delete_session &mdash; Delete a Session

Permanently delete a stored session and its cookies.

"Delete session abc-123-def"

Parameter

Type

Default

Description

session_id

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

  1. Create a session with cookies from a logged-in browser using alterlab_create_session

  2. Scrape authenticated pages by passing the session_id to alterlab_scrape

  3. Manage 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 &mdash; 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: render_js bills the Browser tier ($0.004)

PDF Generation

+$0.0004

PDF of the rendered page

LLM Extraction / Embeddings

+$0.001

extraction_schema / extraction_prompt, embeddings

POST requests

x1.5

method: "POST" costs 1.5x the tier price

Own proxy (BYOP)

-20%

use_own_proxy discount on the tier price

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

ALTERLAB_API_KEY

Yes

&mdash;

Your API key (get one free)

ALTERLAB_API_URL

No

https://api.alterlab.io

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 &mdash; 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 &mdash; like web scraping &mdash; 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 &mdash; 5-20x cheaper than most scraping APIs &mdash; 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 &mdash; 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 &mdash; headings, tables, lists, links &mdash; 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 ALTERLAB_API_KEY is set correctly

402 Insufficient Credits

Balance too low

Run alterlab_check_balance, add funds

403 Forbidden

Site blocked the request

Try render_js: true + use_proxy: true

429 Rate Limited

Too many requests

Automatic retry with backoff

504 Gateway Timeout

Scrape took too long

Increase timeout, simplify request


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 build

Support

License

MIT

Available Tools

26 tools
alterlab_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesList of URLs to scrape (max 100)
exportNoExport batch results to a storage integration when the batch finishes
session_idNoUUID of a stored session applied to every URL in the batch (see alterlab_list_sessions)
webhook_urlNoWebhook URL to receive batch.completed event when all jobs finish
extraction_promptNoBatch-level natural language extraction instruction
extraction_schemaNoBatch-level JSON schema for structured extraction applied to every URL
extraction_profileNoBatch-level pre-built extraction profile applied to every URL
extraction_providerNoBatch-level BYOK LLM provider for extraction

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesList of URLs to scrape (max 20). All results are returned synchronously.
formatsNoOutput formats applied to every URL. 'markdown' is best for LLM consumption.
timeoutNoRequest timeout in seconds per URL (1-300).
render_jsNoRender JavaScript using headless browser for all URLs. Required for JS-heavy sites. Forces tier 4 ($0.004/req).
use_proxyNoRoute all requests through premium proxy (+$0.0002/req).
max_concurrentNoMaximum number of URLs to scrape in parallel (1-10, default 3). Higher values finish faster but consume more concurrent connections.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb (scrape) and resource (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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYesBatch ID returned by alterlab_batch

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesStart URL for the crawl
cacheNoServe pages from the response cache when available
delayNoPoliteness delay between page requests, in seconds (0-30)
budgetNoPer-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.
formatsNoOutput 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.
headersNoCustom HTTP headers injected into every page request during the crawl (e.g., {"Authorization": "Bearer token"}). Maximum 50 headers.
sitemapNoSitemap mode: include (default), skip (link extraction only), only (sitemap URLs only)include
storageNoWhere crawl results are stored (API default 'redis')
timeoutNoPer-page request timeout in seconds (1-300)
webhookNoDetailed webhook config (events, signing secret, headers); use instead of webhook_url
priorityNoCrawl prioritisation hints (keywords, boost_patterns, demote_patterns)
wait_forNoCSS selector to wait for before extracting each page (e.g., '#main-content'). Applied to all pages in the crawl.
cache_ttlNoCache TTL in seconds (60-86400). Requires cache=true
max_depthNoMaximum link-following depth from start URL (0 = start page only)
max_pagesNoMaximum number of pages to scrape
render_jsNoRender JavaScript on crawled pages. true=always (Tier 4, $0.004/page), false=never, auto=smart detection per page
use_proxyNoRoute all crawl requests through premium proxy (+$0.0002/page)
extractionNoSet to 'auto' for automatic page-type detection and extraction without a user-defined schema. Mutually exclusive with extraction_schema.
screenshotNoCapture a screenshot of each crawled page (requires render_js)
webhook_urlNoWebhook URL to notify on crawl completion
sitemap_pathNoExplicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.
cost_controlsNoCost controls for the entire crawl — cap total spend or pin the scraping tier
force_refreshNoBypass the cache and fetch every page fresh
depth_strategyNoLink-discovery strategy (API default 'sequential')
respect_robotsNoRespect robots.txt rules for the target domain
change_trackingNoTrack page changes between crawls
max_concurrencyNoMaximum concurrent pages to scrape simultaneously
exclude_patternsNoGlob patterns — skip URLs whose path matches any (e.g., ['/tag/*', '/author/*'])
extraction_modelNoPer-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only.
include_patternsNoGlob patterns — only scrape URLs whose path matches at least one (e.g., ['/blog/*', '/docs/*'])
extraction_schemaNoJSON schema for structured extraction on each page
extraction_profileNoPre-defined extraction profile applied to every crawled page. 'auto' detects the page type automatically.
include_subdomainsNoInclude links to subdomains during discovery
extraction_providerNoBYOK LLM provider used for extraction on each page
extraction_templateNoAlias for extraction_profile (mutually exclusive with it)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
crawl_idYesCrawl ID to cancel

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
crawl_idYesCrawl ID returned by alterlab_crawl

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for this session (e.g., 'My Amazon Account')
notesNoFree-text notes about this session
domainYesDomain this session is for (e.g., 'amazon.com')
sharedNoShare the session with organization members immediately (API default false)
consentYesExplicit 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.
cookiesNoCookies 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?}.
headersNoCustom headers sent with this session (e.g., a User-Agent or Authorization header)
expires_atNoSession expiry in ISO 8601 format (e.g., '2026-12-31T23:59:59Z')
organization_idNoOrganization to assign the session to (org admins only)
notify_on_failureNoNotify when session validation fails (API default true)
auto_refresh_enabledNoEnable proactive expiry detection and health checks (API default true)
notify_before_expiryNoNotify when the session is about to expire (API default true)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesUUID of the session to delete

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesURL-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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesURL-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

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNoInclude the OCR add-on (+$0.001)
urlYesURL to estimate scraping cost for
modeNoScraping modeauto
methodNoHTTP method. POST requests cost 1.5x the base tier price.
formatsNoOutput 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_jsNoEnable JS rendering (forces Tier 4 minimum, $0.004 — no separate add-on charge)
use_proxyNoInclude premium proxy cost (+$0.0002)
screenshotNoInclude the screenshot add-on (+$0.0002)
generate_pdfNoInclude the PDF add-on (+$0.0004)
use_own_proxyNoPrice the request with your own proxy integration (20% BYOP discount)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cacheNoCache 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
contentYesRaw content to extract from — HTML, text, or markdown. Bring your own pre-fetched content; this endpoint does NOT scrape a URL.
formatsNoOutput formats for content transformation. 'json' is best for structured extraction. 'content' returns filtered/cleaned content. 'raw' returns the unprocessed response body.
evidenceNoInclude field provenance/evidence for extracted fields (which part of the content each field came from)
cache_ttlNoTTL for caching this extraction result, in seconds. Defaults to server setting (3600s). Max 86400s (24 hours).
source_urlNoOriginal URL of the content (for context only — not fetched). Helps the extractor understand the content's domain.
content_typeNoType of the provided contenthtml
extraction_modelNoPer-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). Overrides the model saved in your BYOK key settings for this request only.
extraction_promptNoNatural language instructions for LLM extraction (e.g., 'Extract all product prices and ratings'). Charged at LLM extraction rate when provided.
extraction_schemaNoCustom JSON Schema for extraction. Fields are mapped from content. Overrides extraction_profile when provided
extraction_profileNoPre-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_providerNoLLM provider to use for extraction. Selects the matching BYOK key registered at /dashboard/settings/llm-keys. When omitted, the most recently used registered key is used.
extraction_templateNoShorthand alias for extraction_profile — selects the same pre-built schema template. Mutually exclusive with extraction_profile.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob ID returned by an async or downgraded scrape (alterlab_scrape reports it when a scrape outlives the ~85s synchronous window)

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesUUID of the session to retrieve

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

States a specific verb and resource ('Get 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesStarting URL for site discovery
searchNoQuery to filter and rank discovered URLs by relevance (returns relevance_score per URL)
sitemapNoSitemap handling: include (parse sitemaps + follow links), skip (links only), only (sitemap URLs only)include
max_depthNoLink-following depth (0 = start page + sitemap only)
max_pagesNoMaximum URLs to discover
sitemap_pathNoExplicit path to the sitemap file (e.g., '/sitemap_index.xml'). Use when the sitemap is not at the standard /sitemap.xml location.
respect_robotsNoRespect robots.txt directives
exclude_patternsNoGlob patterns — exclude URLs whose path matches any (e.g., ['/tag/*', '/page/*'])
include_metadataNoFetch title and meta description for each URL via lightweight GET (adds latency)
include_patternsNoGlob patterns — only include URLs whose path matches at least one (e.g., ['/docs/*'])
include_subdomainsNoInclude URLs from subdomains of the target domain

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesNoNew 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?}.
headersNoUpdated custom headers to include with the session
session_idYesUUID of the session to refresh

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

TDQS

A3.7/5.0
Behavior5/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to take a screenshot of
cookiesNoInline cookies for a one-off authenticated screenshot
timeoutNoRequest timeout in seconds (1-300, API default 90)
locationNoGeo-targeting parameters for localized content scraping. Controls proxy country routing, Accept-Language header, and browser locale.
wait_forNoCSS selector to wait for before taking screenshot
use_proxyNoRoute through AlterLab's premium proxy (+$0.0002)
session_idNoUUID of a stored session, to screenshot a logged-in page
wait_untilNoPage load event to wait for before screenshotnetworkidle
proxy_countryNoISO country code for proxy geo-targeting. Requires use_proxy=true

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the session
notesNoNotes or description for this session
cookiesNoNew 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?}.
headersNoNew custom headers — replaces ALL existing headers
expires_atNoNew expiration date in ISO 8601 format (e.g., '2026-12-31T23:59:59Z')
session_idYesUUID of the session to update
notify_on_failureNoEnable or disable the validation-failure notification
auto_refresh_enabledNoEnable or disable proactive expiry detection and health checks
notify_before_expiryNoEnable or disable the before-expiry notification

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesUUID of the session to validate

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

TDQS

A4.1/5.0

Scored across 26 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers