Web scraping MCP server: any URL to Markdown or JSON, with JavaScript rendering and batch jobs.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Spicrawl API key authentication.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Append URLs to a batch job that was submitted with `open: true`. Same item vocabulary as `spicrawl_batch_submit` (EITHER `urls` or `items`, not both, plus shared settings for these new items). Fails with CONFLICT if the job is closed or finished. Not idempotent: calling twice adds the URLs twice. Returns `{ job, items_added, items_dispatched }`.
The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list.
Shorthand: URLs scraped with the shared settings and no per-item overrides. Mutually exclusive with `items`.
Milliseconds to wait after load (rendered scrapes).
Long form: one /v1/scrape request object per item. Besides `url` and `external_id`, any /v1/scrape field (e.g. `js_render`, `wait_for`, `response_format`) overrides the shared setting for that item only. Mutually exclusive with `urls`.
Output format for every item (`response_format`). spicrawl_batch_submit defaults to 'markdown', the same as spicrawl_scrape; an item's own `response_format` overrides it.
Render every URL with a browser (`js_render`).
Ceiling in credits for ONE item (not the whole job — see credit_budget).
CSS selector to wait for before capturing (rendered scrapes).
Extra request headers sent with every URL.
Resource types to block while rendering, e.g. ["image","font","media"].
Strip each page to its main article.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Append URLs to a batch job that was submitted with `open: true`. Same item vocabulary as `spicrawl_batch_submit` (EITHER `urls` or `items`, not both, plus shared settings for these new items). Fails with CONFLICT if the job is closed or finished. Not idempotent: calling twice adds the URLs twice. Returns `{ job, items_added, items_dispatched }`.
| Argument | Type | Description |
|---|---|---|
| urls | array | Shorthand: URLs scraped with the shared settings and no per-item overrides. Mutually exclusive with `items`. |
| wait | integer | Milliseconds to wait after load (rendered scrapes). |
| items | array | Long form: one /v1/scrape request object per item. Besides `url` and `external_id`, any /v1/scrape field (e.g. `js_render`, `wait_for`, `response_format`) overrides the shared setting for that item only. Mutually exclusive with `urls`. |
| format | string | Output format for every item (`response_format`). spicrawl_batch_submit defaults to 'markdown', the same as spicrawl_scrape; an item's own `response_format` overrides it. |
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
| render | boolean | Render every URL with a browser (`js_render`). |
| max_cost | integer | Ceiling in credits for ONE item (not the whole job — see credit_budget). |
| wait_for | string | CSS selector to wait for before capturing (rendered scrapes). |
| custom_headers | object | Extra request headers sent with every URL. |
| block_resources | array | Resource types to block while rendering, e.g. ["image","font","media"]. |
| main_content_only | boolean | Strip each page to its main article. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "Shorthand: URLs scraped with the shared settings and no per-item overrides. Mutually exclusive with `items`."
},
"wait": {
"type": "integer",
"minimum": 0,
"description": "Milliseconds to wait after load (rendered scrapes)."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL of this item."
},
"external_id": {
"type": "string",
"description": "Your own correlation id, echoed back on this item's result record."
}
},
"additionalProperties": true
},
"description": "Long form: one /v1/scrape request object per item. Besides `url` and `external_id`, any /v1/scrape field (e.g. `js_render`, `wait_for`, `response_format`) overrides the shared setting for that item only. Mutually exclusive with `urls`."
},
"format": {
"enum": [
"markdown",
"text",
"html",
"json"
],
"type": "string",
"description": "Output format for every item (`response_format`). spicrawl_batch_submit defaults to 'markdown', the same as spicrawl_scrape; an item's own `response_format` overrides it."
},
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
},
"render": {
"type": "boolean",
"description": "Render every URL with a browser (`js_render`)."
},
"max_cost": {
"type": "integer",
"minimum": 1,
"description": "Ceiling in credits for ONE item (not the whole job — see credit_budget)."
},
"wait_for": {
"type": "string",
"description": "CSS selector to wait for before capturing (rendered scrapes)."
},
"custom_headers": {
"type": "object",
"description": "Extra request headers sent with every URL.",
"additionalProperties": {
"type": "string"
}
},
"block_resources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Resource types to block while rendering, e.g. [\"image\",\"font\",\"media\"]."
},
"main_content_only": {
"type": "boolean",
"description": "Strip each page to its main article."
}
},
"additionalProperties": false
}Cancel a batch job: items not yet started are cancelled and will never run; items already finished keep their results; items already running finish first, so the job comes back `cancelling` and moves to `cancelled` when they drain. Cannot be undone — resubmit to run the URLs again. Returns the job object.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
}
},
"additionalProperties": false
}Stop an open batch job accepting items, so it completes once its queued work drains. Idempotent (closing a closed job succeeds). Returns the job object.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
}
},
"additionalProperties": false
}List this API key's project's batch jobs, newest first, with status and progress. Returns `{ batches: [...], next_cursor? }`; pass `next_cursor` back as `cursor` for the next page.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size (default 50, max 200). |
| cursor | string | `next_cursor` from a previous page, verbatim. |
| status | string | Only jobs in this status. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Page size (default 50, max 200)."
},
"cursor": {
"type": "string",
"description": "`next_cursor` from a previous page, verbatim."
},
"status": {
"enum": [
"queued",
"running",
"paused",
"cancelling",
"completed",
"failed",
"cancelled"
],
"type": "string",
"description": "Only jobs in this status."
}
},
"additionalProperties": false
}Return a page of FINISHED items of a batch job (one record per item: seq, url, external_id, status, error, and content, or a `result_url` API path (GET /v1/batch/{id}/tasks/{seq}/content, same key) for large bodies). Unfinished items are not listed yet. Returns `{ results: [...], next_cursor? }`; pass `next_cursor` back as `cursor` for the next page. Results expire after the job's retention window (410 Gone).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size (default 500, max 5000). |
| cursor | string | `next_cursor` from a previous page, verbatim. |
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
| status | string | Only items that finished with this status. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 5000,
"minimum": 1,
"description": "Page size (default 500, max 5000)."
},
"cursor": {
"type": "string",
"description": "`next_cursor` from a previous page, verbatim."
},
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
},
"status": {
"enum": [
"succeeded",
"failed",
"cancelled",
"skipped"
],
"type": "string",
"description": "Only items that finished with this status."
}
},
"additionalProperties": false
}Re-queue every FAILED item of a batch job so it runs again (succeeded items are untouched; a job with no failures is returned unchanged). Returns `{ job, items_reset, items_dispatched }`.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
}
},
"additionalProperties": false
}Return one batch job with its status and progress (total/completed/succeeded/failed/remaining, credits charged). Poll this after `spicrawl_batch_submit`; once status is `completed`, `failed` or `cancelled`, read `spicrawl_batch_results`.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
}
},
"additionalProperties": false
}Submit many URLs to be scraped as one asynchronous job, with shared settings applied to every URL. Give EITHER `urls` or `items`, not both (at least one URL, unless `open` is true). Returns the job object (id, status, estimated_credits, progress). Poll with `spicrawl_batch_status`, read with `spicrawl_batch_results` or `spicrawl_batch_task_content`. Use this instead of many `spicrawl_scrape` calls when you have tens or thousands of URLs. Set `open: true` to keep the job accepting more URLs via `spicrawl_batch_add_items`; an open job never finishes until you call `spicrawl_batch_close`.
| Argument | Type | Description |
|---|---|---|
| name | string | A human label for the job. |
| open | boolean | Keep the job accepting items after submission (append with spicrawl_batch_add_items, finish with spicrawl_batch_close). |
| urls | array | Shorthand: URLs scraped with the shared settings and no per-item overrides. Mutually exclusive with `items`. |
| wait | integer | Milliseconds to wait after load (rendered scrapes). |
| items | array | Long form: one /v1/scrape request object per item. Besides `url` and `external_id`, any /v1/scrape field (e.g. `js_render`, `wait_for`, `response_format`) overrides the shared setting for that item only. Mutually exclusive with `urls`. |
| format | string | Output format for every item (`response_format`). spicrawl_batch_submit defaults to 'markdown', the same as spicrawl_scrape; an item's own `response_format` overrides it. |
Return the full payload one item of a batch job produced, by its `seq` (items are numbered from 0 in submission order). Cheaper than paging results when you need one URL's output. A CONFLICT error means either the item has not finished yet (poll `spicrawl_batch_status` and ask again) or it finished as failed (it will never produce content; the message says which). NOT_FOUND means no such seq.
| Argument | Type | Description |
|---|---|---|
| seq* | integer | The item's sequence number (0-based, submission order). |
| job_id* | string | The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id",
"seq"
],
"properties": {
"seq": {
"type": "integer",
"minimum": 0,
"description": "The item's sequence number (0-based, submission order)."
},
"job_id": {
"type": "string",
"minLength": 1,
"description": "The batch job id returned by spicrawl_batch_submit or spicrawl_batch_list."
}
},
"additionalProperties": false
}The docs' llms.txt: every Spicrawl documentation page with its title, a one-line description and its Markdown URL. Use it to find the right page when a search does not, or to get an overview of what is documented; read a page with spicrawl_docs_read. No parameters.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
}Fetches one Spicrawl documentation page as Markdown. `path` may be a page path (`guides/anti-bot`), a docs URL from spicrawl_docs_search (url or md_url), or either with a `#anchor` (the whole page is returned; the anchor names the section to look at). Only pages on the Spicrawl docs (https://docs.spicrawl.com/docs) can be read. Pages over 60000 characters are truncated, and the text says so. Don't know the path? Use spicrawl_docs_search, or spicrawl_docs_index (llms.txt) for the list of every page.
| Argument | Type | Description |
|---|---|---|
| path* | string | Page path (`guides/anti-bot`, `errors#AUTH_INVALID_KEY`) or a full docs URL, as returned by spicrawl_docs_search. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Page path (`guides/anti-bot`, `errors#AUTH_INVALID_KEY`) or a full docs URL, as returned by spicrawl_docs_search."
}
},
"additionalProperties": false
}Full-text search over the Spicrawl documentation (guides, API reference, errors, limits). Use it to look up a parameter name, value or combination for a spicrawl_* tool, or to explain an error a spicrawl_* tool returned: search the error code itself (e.g. `ERR::UPSTREAM::CHALLENGE`) and the result also carries a direct link to that code's entry on the errors page. Returns the best-matching pages, each with its title, the matching sections (heading, a short snippet, URL) and md_url; then call spicrawl_docs_read with a page's md_url or url to read it in full.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum pages to return, 1-20. Default 8. |
| query* | string | What to look for: a feature, parameter, error code or question, e.g. 'wait_for selector' or 'ERR::AUTH::INSUFFICIENT_SCOPE'. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Maximum pages to return, 1-20. Default 8."
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "What to look for: a feature, parameter, error code or question, e.g. 'wait_for selector' or 'ERR::AUTH::INSUFFICIENT_SCOPE'."
}
},
"additionalProperties": false
}The full log record of one past API call by its request id. Every response carries its id in the X-Request-Id header (and error bodies carry it too), so this is the tool for debugging a failed or slow scrape: it shows status, error_code/error_detail, attempts, the engine and proxy (tier, country, provider, sticky) actually used, whether and how the target blocked it (vendor/signal/rule), per-stage latency spans and credits charged. Returns not_found both for unknown ids and for ones older than your retention window, and for another project's request unless your key has the `read` scope.
| Argument | Type | Description |
|---|---|---|
| id* | string | The request id (a ULID, from X-Request-Id or a spicrawl_requests_list row's `id`). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "The request id (a ULID, from X-Request-Id or a spicrawl_requests_list row's `id`)."
}
},
"additionalProperties": false
}Recent API calls in your key's project, newest first, each with project_id, status, engine, http_status, error_code/error_detail, attempts, URL, proxy used, latency spans (queue/engine/upstream/total ms), block detection and credits. Use it to find failing calls (only_errors=true) or to spot patterns across a target. all_projects=true lists every project in your organization instead (needs a key with the `read` scope; 403 ERR::AUTH::INSUFFICIENT_SCOPE otherwise). Records only exist within the retention window reported in page.retention_hours / page.retained_since; an empty page means nothing in that window. Paginate by passing page.next_before and page.next_before_id back as before and before_id while page.has_more is true, keeping all_projects the same. Not billing-grade: use spicrawl_usage for totals.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows per page, 1-200. Default 50. |
| before | string | Cursor: RFC 3339 timestamp, exactly as returned in page.next_before. Pass together with before_id. |
| status | string | Only requests with this outcome. |
| before_id | string | Cursor: request id, exactly as returned in page.next_before_id. |
| only_errors | boolean | Only requests whose status is anything other than 'success'. |
| all_projects | boolean |
Retrieve a web page and return its content as markdown (default), text, HTML, a JSON envelope, or a printed PDF. Handles the fetch vs. browser decision, charset decoding, and PDF-to-text for you. Optionally extract structured data with CSS selectors (`extract`) or `autoparse`, return discovered `links`, take a `screenshot`, or scope the DOM with `include_tags`/`exclude_tags`. Each successful call is billed in credits (a failure costs 0). Results are cached by default, and a cache hit is billed like the fetch that stored it (the cache saves time, not credits); set `cache=false` for time-sensitive pages. With the defaults it only reads the page. A `method` other than GET, HEAD or OPTIONS, and the `actions` that click, fill or run scripts on the page, can change state on the target site: set them only when the user asks for that. For markdown, text and HTML it returns `{ content }`. With `format: "json"`, or when `extract`, `autoparse`, `links`, `screenshot` or `network_capture` is set, it returns the JSON envelope: `content`, the site's `status`, `credits`, `engine` (the rendering tier: `fetch`, `js` or `browser`), `warnings` and `data` for extraction. Screenshots come back as image content blocks; each `screenshots` entry in the JSON keeps its metadata and says which block holds it. A PDF comes back as a resource content block, with its size, the rendering tier and the credits in the JSON.
| Argument | Type | Description |
|---|---|---|
| url* | string | The absolute URL to retrieve. |
| mode | string | Routing mode. `auto` lets the platform escalate fetch -> browser as needed, billing only the rung that worked. |
| wait | integer | Milliseconds to wait after load before capturing (render only). |
| cache | boolean | Serve a recent cached result if fresh (on by default). A hit is billed at the same price as the fetch that stored it: the cache saves time, not credits. Set false only when you need live data. |
Return the full stored state of a LIVE session — cookies, localStorage and other credentials — plus its fingerprint and domain scores. The `session_context` object can be passed to spicrawl_session_create to clone the session. The result contains secrets (login cookies): do not echo it to the user or logs unless asked.
| Argument | Type | Description |
|---|---|---|
| session_id* | string | The session id returned by spicrawl_session_create or spicrawl_session_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"minLength": 1,
"description": "The session id returned by spicrawl_session_create or spicrawl_session_list."
}
},
"additionalProperties": false
}Create a session: a persistent browser identity (cookie jar, localStorage, a fixed rendering tier and, by default, a sticky exit IP) that survives across scrapes. Use it for multi-step flows — log in, then fetch pages behind the login — by passing the returned `id` as `session_id` to every `spicrawl_scrape` call that should share the state. The rendering tier is fixed for the session's lifetime and every scrape on the session runs on it. Leave `engine` out and one is chosen for you. Release the session with `spicrawl_session_release` when done. Returns the session object (id, engine, status, sticky_key, proxy, expires_at).
| Argument | Type | Description |
|---|---|---|
| engine | string | Rendering tier fixed for the session's lifetime. Optional: leave it out and one is chosen for you. `fetch` is plain HTTP; `js` is JavaScript rendering and refuses `actions`, `block_resources`, screenshots and PDFs; `browser` is a full browser. |
| ttl_seconds | integer | Idle lifetime in seconds (min 30, default 1800; the organization's maximum is enforced, not clamped). |
| domain_scores | object | Seed per-domain error scores (usually copied from a spicrawl_session_context dump). |
| session_context | object | Seed the session's state (cookies, storage) — e.g. the `session_context` object from spicrawl_session_context, to clone a session. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"engine": {
"enum": [
"fetch",
"js",
"browser"
],
"type": "string",
"description": "Rendering tier fixed for the session's lifetime. Optional: leave it out and one is chosen for you. `fetch` is plain HTTP; `js` is JavaScript rendering and refuses `actions`, `block_resources`, screenshots and PDFs; `browser` is a full browser."
},
"ttl_seconds": {
"type": "integer",
"minimum": 30,
"description": "Idle lifetime in seconds (min 30, default 1800; the organization's maximum is enforced, not clamped)."
},
"domain_scores": {
"type": "object",
"description": "Seed per-domain error scores (usually copied from a spicrawl_session_context dump).",
"additionalProperties": {
"type": "object",
"required": [
"score",
"good",
"bad",
"last_updated"
],
"properties": {
"bad": {
"type": "integer"
},
"good": {
"type": "integer"
},
"score": {
"type": "number"
},
"last_updated": {
"type": "integer"
}
},
"additionalProperties": true
}
},
"session_context": {
"type": "object",
"description": "Seed the session's state (cookies, storage) — e.g. the `session_context` object from spicrawl_session_context, to clone a session.",
"additionalProperties": {}
}
},
"additionalProperties": false
}Permanently delete a session and its stored state, including the record itself (prefer spicrawl_session_release if you only want to stop using it). Idempotent: deleting an already-deleted session succeeds. Refused while a scrape holds the session's lease unless `force` is true.
| Argument | Type | Description |
|---|---|---|
| force | boolean | Break an active lease (a scrape currently using the session). Only set when you know it is safe. |
| session_id* | string | The session id returned by spicrawl_session_create or spicrawl_session_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"session_id"
],
"properties": {
"force": {
"type": "boolean",
"description": "Break an active lease (a scrape currently using the session). Only set when you know it is safe."
},
"session_id": {
"type": "string",
"minLength": 1,
"description": "The session id returned by spicrawl_session_create or spicrawl_session_list."
}
},
"additionalProperties": false
}Return one session's metadata: status, `engine` (its rendering tier), proxy/exit, usage count, expiry, lease holder, and a summary of its stored context. Never returns the credentials themselves (use spicrawl_session_context for that).
| Argument | Type | Description |
|---|---|---|
| session_id* | string | The session id returned by spicrawl_session_create or spicrawl_session_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"minLength": 1,
"description": "The session id returned by spicrawl_session_create or spicrawl_session_list."
}
},
"additionalProperties": false
}List this API key's project's sessions, newest first. Returns `{ sessions: [...], next_cursor? }`; pass `next_cursor` back as `cursor` for the next page. Never includes the stored credentials.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size (default 50, max 200). |
| cursor | string | `next_cursor` from a previous page, verbatim. |
| engine | string | Only sessions on this rendering tier. |
| status | string | Only sessions in this state. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Page size (default 50, max 200)."
},
"cursor": {
"type": "string",
"description": "`next_cursor` from a previous page, verbatim."
},
"engine": {
"enum": [
"fetch",
"js",
"browser"
],
"type": "string",
"description": "Only sessions on this rendering tier."
},
"status": {
"enum": [
"active",
"released",
"expired"
],
"type": "string",
"description": "Only sessions in this state."
}
},
"additionalProperties": false
}End a session when you are done with it: frees its exit IP and browser state; it can no longer be used with spicrawl_scrape. Its stored cookies and storage are purged and cannot be recovered; start a new session and log in again to continue. The record stays visible (status `released`) so its history can still be inspected. Refused while a scrape holds the session's lease unless `force` is true. Returns the session object.
| Argument | Type | Description |
|---|---|---|
| force | boolean | Break an active lease (a scrape currently using the session). Only set when you know it is safe. |
| session_id* | string | The session id returned by spicrawl_session_create or spicrawl_session_list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"session_id"
],
"properties": {
"force": {
"type": "boolean",
"description": "Break an active lease (a scrape currently using the session). Only set when you know it is safe."
},
"session_id": {
"type": "string",
"minLength": 1,
"description": "The session id returned by spicrawl_session_create or spicrawl_session_list."
}
},
"additionalProperties": false
}Billing-grade usage for your org over a date window, from the daily rollup (usage_daily), grouped by day, project, engine, feature or key. group_by=key returns per API key (key_id, name, prefix, project_id) counters per metric per day, from usage_key_daily; keyless (dashboard) usage is not in it, and a project-scoped key sees only its own project's keys. Use it to answer 'how many requests/credits did I use, and where'. The window defaults to the last 30 days including today; `to` is EXCLUSIVE (a single day 2026-08-01 is from=2026-08-01, to=2026-08-02) and the window may not exceed 400 days. The response carries stale_seconds (age of the newest rollup row; null when the window is empty). Requires the key to have the `read` scope.
| Argument | Type | Description |
|---|---|---|
| to | any | EXCLUSIVE end date, YYYY-MM-DD (UTC). Default: tomorrow, so today is included. |
| from | string | Inclusive start date, YYYY-MM-DD (UTC). Default: 29 days before today. |
| metrics | array | Metrics to return. Omit for all of them. |
| group_by | string | How to group the rows. Default 'day'. |
| project_id | string | Restrict to one project id (must be a valid Spicrawl identifier). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"$ref": "#/properties/from",
"description": "EXCLUSIVE end date, YYYY-MM-DD (UTC). Default: tomorrow, so today is included."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Inclusive start date, YYYY-MM-DD (UTC). Default: 29 days before today."
},
"metrics": {
"type": "array",
"items": {
"enum": [
"requests",
"credits",
"engine_ms",
"bytes_egress",
"bytes_ingress",
"proxy_bytes_dc",
"proxy_bytes_resi",
"extractions",
"ai_extractions",
"batch_items",
"requests_failed",
"requests_timeout",
"feature_actions",
"feature_ai_extract",
"feature_autoparse",
"feature_extract",
"feature_extract_preset",
"feature_js_render",
"feature_links",
"feature_network_capture",
"feature_pdf",
"feature_proxy_country",
"feature_proxy_custom",
"feature_screenshot",
"feature_session",
"client_cli",
"client_mcp",
"client_sdk",
"client_other"
],
"type": "string"
},
"description": "Metrics to return. Omit for all of them."
},
"group_by": {
"enum": [
"day",
"project",
"engine",
"feature",
"key"
],
"type": "string",
"description": "How to group the rows. Default 'day'."
},
"project_id": {
"type": "string",
"description": "Restrict to one project id (must be a valid Spicrawl identifier)."
}
},
"additionalProperties": false
}Drift report for ONE day: re-derives usage from that day's request log and compares it with the billed daily rollup, so you can see whether the rollup missed or double-counted anything. Defaults to yesterday (UTC); today is still accumulating and would always show drift. Requires the `read` scope.
| Argument | Type | Description |
|---|---|---|
| day | string | The UTC day to reconcile, YYYY-MM-DD. Default: yesterday. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"day": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "The UTC day to reconcile, YYYY-MM-DD. Default: yesterday."
}
},
"additionalProperties": false
}A compact current-period summary of your org's usage (totals as of now, from the daily rollup). No parameters. Use for a quick 'how much have I used so far'; use spicrawl_usage for a windowed breakdown. Requires the `read` scope.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
}| render | boolean | Render every URL with a browser (`js_render`). |
| max_cost | integer | Ceiling in credits for ONE item (not the whole job — see credit_budget). |
| priority | integer | Scheduling priority of the job relative to your other jobs. |
| wait_for | string | CSS selector to wait for before capturing (rendered scrapes). |
| concurrency | integer | Max items in flight at once for this job (may be capped by the server; see warnings). |
| max_attempts | integer | Per-item retry attempts on failure. |
| credit_budget | integer | Ceiling on the WHOLE job, in credits; the run aborts when it would exceed this. |
| custom_headers | object | Extra request headers sent with every URL. |
| block_resources | array | Resource types to block while rendering, e.g. ["image","font","media"]. |
| failure_threshold | integer | Abort the job once this many items have failed. |
| main_content_only | boolean | Strip each page to its main article. |
| webhook_endpoint_id | string | Id of a registered webhook endpoint notified (with the job object) when the job completes. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"type": "string",
"description": "A human label for the job."
},
"open": {
"type": "boolean",
"description": "Keep the job accepting items after submission (append with spicrawl_batch_add_items, finish with spicrawl_batch_close)."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "Shorthand: URLs scraped with the shared settings and no per-item overrides. Mutually exclusive with `items`."
},
"wait": {
"type": "integer",
"minimum": 0,
"description": "Milliseconds to wait after load (rendered scrapes)."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL of this item."
},
"external_id": {
"type": "string",
"description": "Your own correlation id, echoed back on this item's result record."
}
},
"additionalProperties": true
},
"description": "Long form: one /v1/scrape request object per item. Besides `url` and `external_id`, any /v1/scrape field (e.g. `js_render`, `wait_for`, `response_format`) overrides the shared setting for that item only. Mutually exclusive with `urls`."
},
"format": {
"enum": [
"markdown",
"text",
"html",
"json"
],
"type": "string",
"description": "Output format for every item (`response_format`). spicrawl_batch_submit defaults to 'markdown', the same as spicrawl_scrape; an item's own `response_format` overrides it."
},
"render": {
"type": "boolean",
"description": "Render every URL with a browser (`js_render`)."
},
"max_cost": {
"type": "integer",
"minimum": 1,
"description": "Ceiling in credits for ONE item (not the whole job — see credit_budget)."
},
"priority": {
"type": "integer",
"description": "Scheduling priority of the job relative to your other jobs."
},
"wait_for": {
"type": "string",
"description": "CSS selector to wait for before capturing (rendered scrapes)."
},
"concurrency": {
"type": "integer",
"minimum": 1,
"description": "Max items in flight at once for this job (may be capped by the server; see warnings)."
},
"max_attempts": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Per-item retry attempts on failure."
},
"credit_budget": {
"type": "integer",
"minimum": 1,
"description": "Ceiling on the WHOLE job, in credits; the run aborts when it would exceed this."
},
"custom_headers": {
"type": "object",
"description": "Extra request headers sent with every URL.",
"additionalProperties": {
"type": "string"
}
},
"block_resources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Resource types to block while rendering, e.g. [\"image\",\"font\",\"media\"]."
},
"failure_threshold": {
"type": "integer",
"minimum": 1,
"description": "Abort the job once this many items have failed."
},
"main_content_only": {
"type": "boolean",
"description": "Strip each page to its main article."
},
"webhook_endpoint_id": {
"type": "string",
"description": "Id of a registered webhook endpoint notified (with the job object) when the job completes."
}
},
"additionalProperties": false
}| Every project in your organization, not just the key's own. Needs the `read` scope. Keep it the same across pages. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Rows per page, 1-200. Default 50."
},
"before": {
"type": "string",
"description": "Cursor: RFC 3339 timestamp, exactly as returned in page.next_before. Pass together with before_id."
},
"status": {
"enum": [
"success",
"failed",
"timeout",
"blocked",
"rejected",
"cancelled"
],
"type": "string",
"description": "Only requests with this outcome."
},
"before_id": {
"type": "string",
"description": "Cursor: request id, exactly as returned in page.next_before_id."
},
"only_errors": {
"type": "boolean",
"description": "Only requests whose status is anything other than 'success'."
},
"all_projects": {
"type": "boolean",
"description": "Every project in your organization, not just the key's own. Needs the `read` scope. Keep it the same across pages."
}
},
"additionalProperties": false
}| links | boolean | Also return the page's discovered links as an absolute, de-duplicated list. |
| proxy | string | Your own proxy URL to egress through. Takes precedence over the pool; no surcharge. |
| format | string | Output format. 'markdown' (default) is best for feeding to an LLM; 'html' returns the raw document; 'json' returns a structured envelope; 'pdf' prints the page in a full browser (routed there for you) and returns the file as a resource content block. |
| method | string | HTTP method sent to the target (default GET; no request body can be sent). Anything but GET, HEAD or OPTIONS can change state on the target site: use it only when the user asks. |
| render | boolean | Render with a real browser (executes JavaScript). Use for single-page apps or pages whose content is painted client-side. Costs more than the default fetch tier. |
| actions | array | Browser steps run in order before capture (render only). Each step is {type, ...fields}. Examples: [{"type":"click","selector":"#load-more"},{"type":"wait_for","selector":".item:nth-child(20)","timeout_ms":5000}] · infinite scroll: [{"type":"scroll","to_bottom":true},{"type":"wait_for","ms":1000}] · login: [{"type":"fill","selector":"#user","value":"me"},{"type":"fill","selector":"#pass","value":"…","secret":true},{"type":"click","selector":"button[type=submit]","wait_for_navigation":true}]. A screenshot step switches the response to the JSON envelope (a FORMAT_COERCED warning says so). |
| extract | object | Selector-based extraction: a map of field -> CSS/XPath selector, e.g. {"title":"h1","price":".amount"}. Returns structured `data`. Precise and cheap when you know the page structure. |
| max_cost | integer | Refuse (rather than run) a request that would cost more than this many credits. |
| wait_for | string | CSS selector to wait for before capturing (render only). |
| autoparse | boolean | Return the structured data the page publishes about itself (JSON-LD, OpenGraph, Twitter Card, microdata). No selectors; survives redesigns. |
| cache_ttl | integer | Max age in seconds of a cached copy to accept (0 forces a fresh fetch; capped at 48h). Freshness only: a hit is billed like a fetch. |
| parse_pdf | boolean | Turn a PDF target into text/markdown (default true). false refuses PDFs. |
| screenshot | boolean | Capture a screenshot (requires render). |
| session_id | string | Run inside a session from spicrawl_session_create: same exit IP and browser state (cookies, localStorage) across calls. |
| impersonate | boolean | Fetch tier only: present a real browser's TLS/JA3 + HTTP/2 fingerprint to clear passive bot gates. On by default; set false to send a plain client handshake. |
| exclude_tags | array | CSS selectors to remove (e.g. ['nav','.ad','#cookie']). |
| include_tags | array | CSS selectors to KEEP (everything else is dropped). |
| proxy_verify | boolean | Verify `proxy` is reachable before using it. |
| custom_headers | object | Extra request headers sent to the target, e.g. {"Accept-Language":"de"}. |
| block_resources | array | Resource types the browser should not load, e.g. ["fonts","media","images"] (render only). Faster and cheaper. |
| network_capture | object | Record the API responses the PAGE fetched while rendering — often cleaner JSON than the DOM. Render only. |
| original_status | boolean | Return the target's own HTTP status instead of 200 for a successful scrape. |
| wait_for_timeout | integer | Max milliseconds to wait for `wait_for`. |
| main_content_only | boolean | Strip the page to its main article, dropping nav/footer/aside. Defaults on for markdown. |
| screenshot_format | string | Screenshot image format. |
| screenshot_quality | integer | Screenshot quality 1-100 (lossy formats). |
| screenshot_fullpage | boolean | Capture the whole page, not just the viewport. |
| screenshot_selector | string | Capture only the element matching this CSS selector. |
| allowed_status_codes | array | Target statuses to treat as success instead of an error (e.g. [404] to capture a not-found page). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The absolute URL to retrieve."
},
"mode": {
"enum": [
"auto"
],
"type": "string",
"description": "Routing mode. `auto` lets the platform escalate fetch -> browser as needed, billing only the rung that worked."
},
"wait": {
"type": "integer",
"minimum": 0,
"description": "Milliseconds to wait after load before capturing (render only)."
},
"cache": {
"type": "boolean",
"description": "Serve a recent cached result if fresh (on by default). A hit is billed at the same price as the fetch that stored it: the cache saves time, not credits. Set false only when you need live data."
},
"links": {
"type": "boolean",
"default": false,
"description": "Also return the page's discovered links as an absolute, de-duplicated list."
},
"proxy": {
"type": "string",
"description": "Your own proxy URL to egress through. Takes precedence over the pool; no surcharge."
},
"format": {
"enum": [
"markdown",
"text",
"html",
"json",
"pdf"
],
"type": "string",
"default": "markdown",
"description": "Output format. 'markdown' (default) is best for feeding to an LLM; 'html' returns the raw document; 'json' returns a structured envelope; 'pdf' prints the page in a full browser (routed there for you) and returns the file as a resource content block."
},
"method": {
"type": "string",
"description": "HTTP method sent to the target (default GET; no request body can be sent). Anything but GET, HEAD or OPTIONS can change state on the target site: use it only when the user asks."
},
"render": {
"type": "boolean",
"default": false,
"description": "Render with a real browser (executes JavaScript). Use for single-page apps or pages whose content is painted client-side. Costs more than the default fetch tier."
},
"actions": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"type",
"selector"
],
"properties": {
"type": {
"type": "string",
"const": "click"
},
"label": {
"type": "string",
"description": "Name echoed in the response's `actions` and `screenshots`."
},
"until": {
"enum": [
"load",
"domcontentloaded",
"networkidle"
],
"type": "string",
"description": "Load state the new document must reach. Default load."
},
"on_error": {
"enum": [
"fail",
"skip"
],
"type": "string",
"description": "fail (default) aborts the workflow; skip records the failure and continues."
},
"selector": {
"type": "string",
"minLength": 1,
"description": "CSS selector of the element to click."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Budget for this step in ms. The step fails (or is skipped) when it runs out."
},
"wait_for_navigation": {
"type": "boolean",
"description": "The click navigates: finish the step only once the new page has loaded."
}
},
"description": "Click an element. On a checkbox or radio this toggles it (there is no 'set checked'); read its state with evaluate if it matters.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"selector",
"value"
],
"properties": {
"type": {
"type": "string",
"const": "fill"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"value": {
"type": "string"
},
"secret": {
"type": "boolean",
"description": "A credential: redacted from logs and the request log."
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"selector": {
"type": "string",
"minLength": 1
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Type a value into an input.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"ms": {
"type": "integer",
"minimum": 1,
"description": "Or: sleep this many ms."
},
"type": {
"type": "string",
"const": "wait_for"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"selector": {
"type": "string",
"minLength": 1,
"description": "CSS selector to wait for."
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Wait for a selector to appear, or sleep `ms`.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "wait_for_navigation"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"until": {
"$ref": "#/properties/actions/items/anyOf/0/properties/until",
"description": "Load state the new document must reach. Default load."
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Wait for a navigation started by the previous step (a click, a form submit, a redirect) to load.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"y": {
"type": "integer",
"description": "Pixels to scroll down (negative scrolls up)."
},
"type": {
"type": "string",
"const": "scroll"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"selector": {
"type": "string",
"minLength": 1,
"description": "Scroll this element into view."
},
"to_bottom": {
"type": "boolean",
"description": "Scroll to the bottom repeatedly until the page stops growing (infinite scroll)."
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Scroll the page: give exactly one of y, to_bottom or selector.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"selector"
],
"properties": {
"type": {
"type": "string",
"const": "select"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"value": {
"type": "string"
},
"values": {
"type": "array",
"items": {
"type": "string"
},
"description": "Several options, for a multi-select."
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"selector": {
"type": "string",
"minLength": 1,
"description": "CSS selector of the <select>."
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Choose option(s) in a <select> by value.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"expression"
],
"properties": {
"type": {
"type": "string",
"const": "evaluate"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"expression": {
"type": "string",
"minLength": 1,
"description": "JavaScript expression evaluated in the page."
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
},
"return_value": {
"type": "boolean",
"description": "Return the value under `actions` in the response (forces format json)."
},
"await_promise": {
"type": "boolean"
}
},
"description": "Run JavaScript in the page.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"const": "screenshot"
},
"label": {
"$ref": "#/properties/actions/items/anyOf/0/properties/label"
},
"format": {
"enum": [
"png",
"jpeg",
"webp"
],
"type": "string"
},
"quality": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"on_error": {
"$ref": "#/properties/actions/items/anyOf/0/properties/on_error"
},
"selector": {
"type": "string",
"minLength": 1,
"description": "Capture only this element."
},
"full_page": {
"type": "boolean"
},
"timeout_ms": {
"$ref": "#/properties/actions/items/anyOf/0/properties/timeout_ms"
}
},
"description": "Capture the page at this point. The image is returned as an image block; the response becomes the JSON envelope whatever `format` says.",
"additionalProperties": false
}
]
},
"description": "Browser steps run in order before capture (render only). Each step is {type, ...fields}. Examples: [{\"type\":\"click\",\"selector\":\"#load-more\"},{\"type\":\"wait_for\",\"selector\":\".item:nth-child(20)\",\"timeout_ms\":5000}] · infinite scroll: [{\"type\":\"scroll\",\"to_bottom\":true},{\"type\":\"wait_for\",\"ms\":1000}] · login: [{\"type\":\"fill\",\"selector\":\"#user\",\"value\":\"me\"},{\"type\":\"fill\",\"selector\":\"#pass\",\"value\":\"…\",\"secret\":true},{\"type\":\"click\",\"selector\":\"button[type=submit]\",\"wait_for_navigation\":true}]. A screenshot step switches the response to the JSON envelope (a FORMAT_COERCED warning says so)."
},
"extract": {
"type": "object",
"description": "Selector-based extraction: a map of field -> CSS/XPath selector, e.g. {\"title\":\"h1\",\"price\":\".amount\"}. Returns structured `data`. Precise and cheap when you know the page structure.",
"additionalProperties": {}
},
"max_cost": {
"type": "integer",
"minimum": 0,
"description": "Refuse (rather than run) a request that would cost more than this many credits."
},
"wait_for": {
"type": "string",
"description": "CSS selector to wait for before capturing (render only)."
},
"autoparse": {
"type": "boolean",
"description": "Return the structured data the page publishes about itself (JSON-LD, OpenGraph, Twitter Card, microdata). No selectors; survives redesigns."
},
"cache_ttl": {
"type": "integer",
"minimum": 0,
"description": "Max age in seconds of a cached copy to accept (0 forces a fresh fetch; capped at 48h). Freshness only: a hit is billed like a fetch."
},
"parse_pdf": {
"type": "boolean",
"description": "Turn a PDF target into text/markdown (default true). false refuses PDFs."
},
"screenshot": {
"type": "boolean",
"default": false,
"description": "Capture a screenshot (requires render)."
},
"session_id": {
"type": "string",
"description": "Run inside a session from spicrawl_session_create: same exit IP and browser state (cookies, localStorage) across calls."
},
"impersonate": {
"type": "boolean",
"description": "Fetch tier only: present a real browser's TLS/JA3 + HTTP/2 fingerprint to clear passive bot gates. On by default; set false to send a plain client handshake."
},
"exclude_tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "CSS selectors to remove (e.g. ['nav','.ad','#cookie'])."
},
"include_tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "CSS selectors to KEEP (everything else is dropped)."
},
"proxy_verify": {
"type": "boolean",
"description": "Verify `proxy` is reachable before using it."
},
"custom_headers": {
"type": "object",
"description": "Extra request headers sent to the target, e.g. {\"Accept-Language\":\"de\"}.",
"additionalProperties": {
"type": "string"
}
},
"block_resources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Resource types the browser should not load, e.g. [\"fonts\",\"media\",\"images\"] (render only). Faster and cheaper."
},
"network_capture": {
"type": "object",
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "URL patterns of the page's own requests to record."
},
"max_responses": {
"type": "integer",
"description": "Cap on recorded responses."
},
"include_bodies": {
"type": "boolean",
"description": "Include response bodies."
},
"max_body_bytes": {
"type": "integer",
"description": "Per-response body cap."
},
"resource_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Resource types to record, e.g. [\"xhr\",\"fetch\"]."
}
},
"description": "Record the API responses the PAGE fetched while rendering — often cleaner JSON than the DOM. Render only.",
"additionalProperties": false
},
"original_status": {
"type": "boolean",
"description": "Return the target's own HTTP status instead of 200 for a successful scrape."
},
"wait_for_timeout": {
"type": "integer",
"minimum": 0,
"description": "Max milliseconds to wait for `wait_for`."
},
"main_content_only": {
"type": "boolean",
"description": "Strip the page to its main article, dropping nav/footer/aside. Defaults on for markdown."
},
"screenshot_format": {
"type": "string",
"description": "Screenshot image format."
},
"screenshot_quality": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Screenshot quality 1-100 (lossy formats)."
},
"screenshot_fullpage": {
"type": "boolean",
"description": "Capture the whole page, not just the viewport."
},
"screenshot_selector": {
"type": "string",
"description": "Capture only the element matching this CSS selector."
},
"allowed_status_codes": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Target statuses to treat as success instead of an error (e.g. [404] to capture a not-found page)."
}
},
"additionalProperties": false
}