spicrawl-com · Schema
ScrapeRequest
Body of POST /v1/scrape. Unknown fields (including nested ones) are rejected with 400 ERR::REQUEST::INVALID_PARAMETER; a wrong JSON type is 400 naming the field. Max body 1 MiB (413).
CompanyWeb ScrapingData ExtractionAPIAutomationAI
Properties
| Name | Type | Description |
|---|---|---|
| url | string | Target URL; required, must be http or https with a host. A private or reserved address fails with 400 ERR::SECURITY::SSRF_BLOCKED at 0 credits. |
| method | string | HTTP method sent to the target (case-insensitive). There is no request-body parameter, so non-GET methods are sent without a body; only GET/HEAD/OPTIONS are retried on transient failure and only GET r |
| js_render | boolean | Run the page's JavaScript before capture (3 credits on datacenter or your own proxy; 25 on managed residential exits, coming soon). Required by every browser-only flag unless stealth or mode=auto is s |
| stealth | boolean | Coming soon. Render with full-browser rendering hardened against bot detection, flat 25 credits at any proxy tier; wins over js_render when both are set. Cannot be combined with mode=auto; returns 503 |
| impersonate | boolean | Fetch tier only: present a current browser TLS/HTTP2 fingerprint, with matching browser headers and Accept-Encoding, to pass passive fingerprint checks. On by default, free, no JavaScript; `false` tur |
| mode | string | `auto` escalates through the rendering tiers (plain fetch, then JavaScript rendering) until one returns a usable page, billing only the rung that succeeded (0 if all fail) while reserving the dearest |
| engine | string | Deprecated and ignored; rendering is chosen automatically from the request's flags and the page, and you are billed for the rendering tier actually used (`X-Engine`). Accepted so existing clients keep |
| premium_proxy | boolean | Coming soon; not available yet, so bring your own `proxy` (residential works best). Will use residential exits from the managed pool: 10 credits for a plain fetch, 25 with JavaScript rendering, 32 wit |
| proxy_country | string | Coming soon. ISO 3166-1 alpha-2 exit country (case-insensitive), within the residential pool. Requires premium_proxy=true (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise) unless `proxy` is set, in whi |
| proxy | string | Your own proxy URL (http, https, socks5 or socks5h; credentials in userinfo). Takes precedence over premium_proxy and adds 0 proxy credits; proxy_country is kept as the render environment hint; loopba |
| proxy_verify | boolean | Probe the custom `proxy` before spending the engine cost so a dead proxy fails fast. Requires `proxy` (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise). |
| session_id | string | Reuse a session's cookies and storage (created via /v1/sessions); the request runs with the session's own rendering. Checked before any work, at 0 credits and not retryable - an unknown, malformed or |
| sticky_key | string | Coming soon. Any string; requests sharing it reuse the same pool exit. Forces a pool exit even on deployments whose default is direct egress, so it can fail 503 ERR::PROXY::EXHAUSTED where no pool exi |
| wait | integer | Milliseconds to wait after load before capture. Browser-only: needs js_render, stealth, or mode=auto, else 400 ERR::REQUEST::INCOMPATIBLE_FLAGS. |
| wait_for | string | CSS selector to wait for before capture. Browser-only. If it never appears the page is returned as it stood with an X-Warning RENDER_DEGRADED; if the render times out waiting it fails 504 ERR::UPSTREA |
| wait_for_timeout | integer | Milliseconds to wait for `wait_for`; 0 uses the engine default. Requires wait_for (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise). |
| actions | array | Ordered browser workflow (click, fill, scroll, ...), validated before anything is spent. Browser-only and makes the request uncacheable. A failed step ends the request at 0 credits unless that step ha |
| block_resources | array | Subresource classes the browser must not load (plural and short aliases accepted, case-insensitive). If omitted, full-browser rendering blocks nothing, so images and fonts load, including for screensh |
| headless | boolean | Deprecated and ignored. Rendering is chosen automatically. Accepted so existing clients keep working. The response carries `X-Warning: ENGINE_IGNORED`. |
| screenshot | boolean | Capture a screenshot; forces the JSON envelope (image base64 under `screenshots`). Rendered with full-browser rendering - on a deployment without it, 400 ERR::REQUEST::CAPABILITY_UNSUPPORTED at 0 cred |
| screenshot_fullpage | boolean | Capture the full scrollable page. Requires screenshot=true; mutually exclusive with screenshot_selector. |
| screenshot_selector | string | CSS selector of the element to capture. Requires screenshot=true; mutually exclusive with screenshot_fullpage. |
| screenshot_format | string | Image format; omitted uses the engine default (png). Not validated by the API - an unrecognised value silently falls back to the engine default. |
| screenshot_quality | integer | Lossy quality for jpeg/webp; 0 uses the engine default. A value above 0 requires screenshot=true. |
| custom_headers | object | Headers sent to the target, as name -> string value. Hop-by-hop headers (Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, TE, Trailer, Transfer-Encoding, Upgrade, Host, Content-Length) |
| network_capture | object | Record the XHR/fetch responses the page itself made (often cleaner JSON than the DOM), returned under `network` in the JSON envelope. Browser-only; no extra credits. |
| autoparse | boolean | Harvest the page's own structured metadata (JSON-LD, OpenGraph, Twitter, microdata, RDFa, meta, embedded SPA state) into `data`, no selectors needed. Forces the JSON envelope; no extra credits; refuse |
| links | boolean | Return the page's absolute, de-duplicated targets under `links`. Forces the JSON envelope; no extra credits; refused on a PDF. If omitted, the project's stored default applies. |
| extract | object | Selector extraction into `data`: a selector map, or a JSON Schema whose properties carry `selector`. Forces the JSON envelope, validated before fetching, no extra credits; mutually exclusive with extr |
| extract_preset | string | Coming soon. Name of a server-side extraction preset. This deployment has no preset store, so any value fails with 400 ERR::EXTRACT::INVALID_RULES (at 0 credits, after the fetch); use `extract` inline |
| ai_extract | object | Coming soon. Model-driven extraction into `data`; adds 4 credits. Refused with 503 ERR::INTERNAL::UNAVAILABLE where no model is configured, and a model failure is 502 ERR::EXTRACT::FAILED at 0 credits |
| main_content_only | boolean | true strips nav/footer/aside to the main article; false keeps the whole document. Omitted keeps the pipeline default (main-content isolation on for markdown). Applies to markdown/text/cleaned output. |
| include_tags | array | CSS selectors; keep only matching subtrees before extraction and markdown conversion. Applied before exclude_tags and main_content_only. |
| exclude_tags | array | CSS selectors; remove matching elements, applied after include_tags and before main_content_only. |
| parse_pdf | boolean | When the target returns a PDF and markdown/text is requested, parse it to text. false refuses it with 502 ERR::EXTRACT::FAILED (0 credits); response_format=html always returns the raw bytes. If omitte |
| response_format | string | Body shape: html/markdown/text return the document itself, json the envelope, pdf a PDF printed by a real browser (needs full-browser rendering). extract, autoparse, links, ai_extract, network_capture |
| cache | boolean | Serve a stored result younger than cache_ttl (Cache-State: hit). A hit is billed at the same price as the fetch that stored it: the cache saves the fetch (latency and load on the target), not credits. |
| cache_ttl | integer | Maximum acceptable age of a cached result, in seconds. Default and cap are deployment settings (48h by default); larger values are clamped with X-Warning CACHE_TTL_CLAMPED. 0 disables caching for this |
| max_cost | integer | Credit ceiling; 0 means none. Checked against the dearest reachable outcome (the top rung under mode=auto) before anything runs, failing 400 ERR::LIMIT::MAX_COST_EXCEEDED at 0 credits. |
| original_status | boolean | On success, use the target's status as this response's HTTP status instead of 200. Leave off unless you need it: it makes a target 404 indistinguishable from an API error by status alone. |
| allowed_status_codes | array | Extra target statuses to treat as billable successes (200, 404 and 410 always are). Other statuses return the target's body at 0 credits, and under mode=auto trigger escalation. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/spicrawl-com/json-schema/spicrawl-com-scrape-request-schema.json",
"title": "ScrapeRequest",
"description": "Body of POST /v1/scrape. Unknown fields (including nested ones) are rejected with 400 ERR::REQUEST::INVALID_PARAMETER; a wrong JSON type is 400 naming the field. Max body 1 MiB (413).",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/spicrawl-com-openapi.yaml#/components/schemas/ScrapeRequest",
"type": "object",
"additionalProperties": false,
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 8192,
"description": "Target URL; required, must be http or https with a host. A private or reserved address fails with 400 ERR::SECURITY::SSRF_BLOCKED at 0 credits."
},
"method": {
"type": "string",
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"HEAD",
"OPTIONS"
],
"default": "GET",
"description": "HTTP method sent to the target (case-insensitive). There is no request-body parameter, so non-GET methods are sent without a body; only GET/HEAD/OPTIONS are retried on transient failure and only GET results are cached."
},
"js_render": {
"type": "boolean",
"default": false,
"description": "Run the page's JavaScript before capture (3 credits on datacenter or your own proxy; 25 on managed residential exits, coming soon). Required by every browser-only flag unless stealth or mode=auto is set; cannot be combined with mode=auto. If omitted, the project's stored default applies."
},
"stealth": {
"type": "boolean",
"default": false,
"description": "Coming soon. Render with full-browser rendering hardened against bot detection, flat 25 credits at any proxy tier; wins over js_render when both are set. Cannot be combined with mode=auto; returns 503 ERR::ENGINE::UNAVAILABLE where it is not available. If omitted, the project's stored default applies."
},
"impersonate": {
"type": "boolean",
"default": true,
"description": "Fetch tier only: present a current browser TLS/HTTP2 fingerprint, with matching browser headers and Accept-Encoding, to pass passive fingerprint checks. On by default, free, no JavaScript; `false` turns it off and the fetch uses a non-browser TLS handshake. Ignored on rendered requests. If omitted, the project's stored default applies, and `true` when the project sets none."
},
"mode": {
"type": "string",
"enum": [
"auto"
],
"description": "`auto` escalates through the rendering tiers (plain fetch, then JavaScript rendering) until one returns a usable page, billing only the rung that succeeded (0 if all fail) while reserving the dearest rung against quota. Incompatible with js_render and stealth. If omitted, the project's stored default applies."
},
"engine": {
"type": "string",
"deprecated": true,
"description": "Deprecated and ignored; rendering is chosen automatically from the request's flags and the page, and you are billed for the rendering tier actually used (`X-Engine`). Accepted so existing clients keep working. The response carries `X-Warning: ENGINE_IGNORED`."
},
"premium_proxy": {
"type": "boolean",
"default": false,
"description": "Coming soon; not available yet, so bring your own `proxy` (residential works best). Will use residential exits from the managed pool: 10 credits for a plain fetch, 25 with JavaScript rendering, 32 with full-browser rendering (stealth stays 25). If no residential exit is available the request fails 503 ERR::PROXY::EXHAUSTED rather than falling back; ignored (with X-Warning PROXY_FLAG_IGNORED) when `proxy` is set. See \"Bot challenges\" in the operation description. If omitted, the project's stored default applies."
},
"proxy_country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Coming soon. ISO 3166-1 alpha-2 exit country (case-insensitive), within the residential pool. Requires premium_proxy=true (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise) unless `proxy` is set, in which case it is kept as the render environment hint (browser timezone and locale follow it) while the custom URL stays the exit; an unavailable country is 503 ERR::PROXY::EXHAUSTED, never substituted. A browser render takes its timezone and locale from this country or, when it is omitted, from the country of the pool exit it was assigned. If omitted, the project's stored default applies."
},
"proxy": {
"type": "string",
"description": "Your own proxy URL (http, https, socks5 or socks5h; credentials in userinfo). Takes precedence over premium_proxy and adds 0 proxy credits; proxy_country is kept as the render environment hint; loopback hosts are refused with 400 ERR::SECURITY::SSRF_BLOCKED. An unreachable proxy fails 502 ERR::PROXY::UNREACHABLE. A bot challenge from a named vendor is escalated automatically to stronger rendering on the same exit when the proxy is http:// (residential works best); see \"Bot challenges\" in the operation description."
},
"proxy_verify": {
"type": "boolean",
"default": false,
"description": "Probe the custom `proxy` before spending the engine cost so a dead proxy fails fast. Requires `proxy` (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise)."
},
"session_id": {
"type": "string",
"description": "Reuse a session's cookies and storage (created via /v1/sessions); the request runs with the session's own rendering. Checked before any work, at 0 credits and not retryable - an unknown, malformed or other organization's id is 404 ERR::SESSION::NOT_FOUND, a released session 410 ERR::SESSION::RELEASED, an expired one 410 ERR::SESSION::EXPIRED. A successful request increments the session's `usage_count`, sets `last_used_at` and slides `expires_at`. Requests with a session are never cached."
},
"sticky_key": {
"type": "string",
"description": "Coming soon. Any string; requests sharing it reuse the same pool exit. Forces a pool exit even on deployments whose default is direct egress, so it can fail 503 ERR::PROXY::EXHAUSTED where no pool exists."
},
"wait": {
"type": "integer",
"minimum": 0,
"maximum": 30000,
"default": 0,
"description": "Milliseconds to wait after load before capture. Browser-only: needs js_render, stealth, or mode=auto, else 400 ERR::REQUEST::INCOMPATIBLE_FLAGS."
},
"wait_for": {
"type": "string",
"description": "CSS selector to wait for before capture. Browser-only. If it never appears the page is returned as it stood with an X-Warning RENDER_DEGRADED; if the render times out waiting it fails 504 ERR::UPSTREAM::TIMEOUT - raise wait_for_timeout or fix the selector."
},
"wait_for_timeout": {
"type": "integer",
"minimum": 0,
"maximum": 120000,
"default": 0,
"description": "Milliseconds to wait for `wait_for`; 0 uses the engine default. Requires wait_for (400 ERR::REQUEST::INCOMPATIBLE_FLAGS otherwise)."
},
"actions": {
"type": "array",
"maxItems": 50,
"items": {
"$ref": "#/$defs/ScrapeAction"
},
"description": "Ordered browser workflow (click, fill, scroll, ...), validated before anything is spent. Browser-only and makes the request uncacheable. A failed step ends the request at 0 credits unless that step has on_error=skip."
},
"block_resources": {
"type": "array",
"uniqueItems": false,
"items": {
"type": "string",
"enum": [
"none",
"document",
"documents",
"stylesheet",
"stylesheets",
"css",
"image",
"images",
"media",
"font",
"fonts",
"script",
"scripts",
"js",
"xhr",
"fetch",
"websocket",
"websockets",
"other"
]
},
"description": "Subresource classes the browser must not load (plural and short aliases accepted, case-insensitive). If omitted, full-browser rendering blocks nothing, so images and fonts load, including for screenshot, pdf, actions and anti-bot escalation. A list blocks exactly the classes named and `none` (alone) blocks nothing. Any value other than `none` is browser-only. If omitted, the project's stored default applies."
},
"headless": {
"type": "boolean",
"deprecated": true,
"description": "Deprecated and ignored. Rendering is chosen automatically. Accepted so existing clients keep working. The response carries `X-Warning: ENGINE_IGNORED`."
},
"screenshot": {
"type": "boolean",
"default": false,
"description": "Capture a screenshot; forces the JSON envelope (image base64 under `screenshots`). Rendered with full-browser rendering - on a deployment without it, 400 ERR::REQUEST::CAPABILITY_UNSUPPORTED at 0 credits. mode=auto cannot satisfy it (its fetch rung has no rasteriser). If the image is not delivered the page is still returned but charged 0."
},
"screenshot_fullpage": {
"type": "boolean",
"default": false,
"description": "Capture the full scrollable page. Requires screenshot=true; mutually exclusive with screenshot_selector."
},
"screenshot_selector": {
"type": "string",
"description": "CSS selector of the element to capture. Requires screenshot=true; mutually exclusive with screenshot_fullpage."
},
"screenshot_format": {
"type": "string",
"enum": [
"png",
"jpeg",
"jpg",
"webp"
],
"description": "Image format; omitted uses the engine default (png). Not validated by the API - an unrecognised value silently falls back to the engine default."
},
"screenshot_quality": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"default": 0,
"description": "Lossy quality for jpeg/webp; 0 uses the engine default. A value above 0 requires screenshot=true."
},
"custom_headers": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Headers sent to the target, as name -> string value. Hop-by-hop headers (Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, TE, Trailer, Transfer-Encoding, Upgrade, Host, Content-Length) are refused with 400 ERR::REQUEST::INVALID_PARAMETER. If omitted, the project's stored default applies."
},
"network_capture": {
"allOf": [
{
"$ref": "#/$defs/NetworkCapture"
}
],
"description": "Record the XHR/fetch responses the page itself made (often cleaner JSON than the DOM), returned under `network` in the JSON envelope. Browser-only; no extra credits."
},
"autoparse": {
"type": "boolean",
"default": false,
"description": "Harvest the page's own structured metadata (JSON-LD, OpenGraph, Twitter, microdata, RDFa, meta, embedded SPA state) into `data`, no selectors needed. Forces the JSON envelope; no extra credits; refused on a PDF."
},
"links": {
"type": "boolean",
"default": false,
"description": "Return the page's absolute, de-duplicated <a href> targets under `links`. Forces the JSON envelope; no extra credits; refused on a PDF. If omitted, the project's stored default applies."
},
"extract": {
"allOf": [
{
"$ref": "#/$defs/ScrapeExtract"
}
],
"description": "Selector extraction into `data`: a selector map, or a JSON Schema whose properties carry `selector`. Forces the JSON envelope, validated before fetching, no extra credits; mutually exclusive with extract_preset. Rules that match nothing are listed in `empty_fields`."
},
"extract_preset": {
"type": "string",
"description": "Coming soon. Name of a server-side extraction preset. This deployment has no preset store, so any value fails with 400 ERR::EXTRACT::INVALID_RULES (at 0 credits, after the fetch); use `extract` inline. Mutually exclusive with extract."
},
"ai_extract": {
"allOf": [
{
"$ref": "#/$defs/AIExtract"
}
],
"description": "Coming soon. Model-driven extraction into `data`; adds 4 credits. Refused with 503 ERR::INTERNAL::UNAVAILABLE where no model is configured, and a model failure is 502 ERR::EXTRACT::FAILED at 0 credits. Forces the JSON envelope."
},
"main_content_only": {
"type": "boolean",
"description": "true strips nav/footer/aside to the main article; false keeps the whole document. Omitted keeps the pipeline default (main-content isolation on for markdown). Applies to markdown/text/cleaned output. If omitted, the project's stored default applies."
},
"include_tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "CSS selectors; keep only matching subtrees before extraction and markdown conversion. Applied before exclude_tags and main_content_only."
},
"exclude_tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "CSS selectors; remove matching elements, applied after include_tags and before main_content_only."
},
"parse_pdf": {
"type": "boolean",
"default": true,
"description": "When the target returns a PDF and markdown/text is requested, parse it to text. false refuses it with 502 ERR::EXTRACT::FAILED (0 credits); response_format=html always returns the raw bytes. If omitted, the project's stored default applies."
},
"response_format": {
"type": "string",
"enum": [
"html",
"markdown",
"text",
"json",
"pdf"
],
"default": "html",
"description": "Body shape: html/markdown/text return the document itself, json the envelope, pdf a PDF printed by a real browser (needs full-browser rendering). extract, autoparse, links, ai_extract, network_capture or screenshot override this to the JSON envelope with X-Warning FORMAT_COERCED. A non-HTML target (image, binary) requested as markdown/text fails 502 ERR::EXTRACT::FAILED at 0 credits. If omitted, the project's stored default applies."
},
"cache": {
"type": "boolean",
"default": true,
"description": "Serve a stored result younger than cache_ttl (Cache-State: hit). A hit is billed at the same price as the fetch that stored it: the cache saves the fetch (latency and load on the target), not credits. Only billable successes of GET-method requests without session_id or actions are stored. Set false for time-sensitive data; cache=false with cache_ttl>0 is 400 ERR::REQUEST::INCOMPATIBLE_FLAGS."
},
"cache_ttl": {
"type": "integer",
"minimum": 0,
"default": 172800,
"description": "Maximum acceptable age of a cached result, in seconds. Default and cap are deployment settings (48h by default); larger values are clamped with X-Warning CACHE_TTL_CLAMPED. 0 disables caching for this request."
},
"max_cost": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Credit ceiling; 0 means none. Checked against the dearest reachable outcome (the top rung under mode=auto) before anything runs, failing 400 ERR::LIMIT::MAX_COST_EXCEEDED at 0 credits."
},
"original_status": {
"type": "boolean",
"default": false,
"description": "On success, use the target's status as this response's HTTP status instead of 200. Leave off unless you need it: it makes a target 404 indistinguishable from an API error by status alone."
},
"allowed_status_codes": {
"type": "array",
"items": {
"type": "integer",
"minimum": 100,
"maximum": 599
},
"description": "Extra target statuses to treat as billable successes (200, 404 and 410 always are). Other statuses return the target's body at 0 credits, and under mode=auto trigger escalation."
}
},
"$defs": {
"AIExtract": {
"type": "object",
"additionalProperties": false,
"description": "Exactly one of `prompt` or `schema` (both is 400 INCOMPATIBLE_FLAGS, neither is 400 INVALID_PARAMETER). The model reads the page as cleaned markdown; output lands in `data`. +4 credits.",
"properties": {
"prompt": {
"type": "string",
"minLength": 1,
"description": "Plain-language description of the data to extract."
},
"schema": {
"type": "object",
"minProperties": 1,
"description": "JSON Schema the output must follow."
}
},
"oneOf": [
{
"required": [
"prompt"
],
"not": {
"required": [
"schema"
]
}
},
{
"required": [
"schema"
],
"not": {
"required": [
"prompt"
]
}
}
]
},
"NetworkCapture": {
"type": "object",
"additionalProperties": false,
"description": "Filters for recording the responses the page fetched. Browser-only.",
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Substring matches, or anchored regexes when starting with `^`; empty captures every response of the selected types."
},
"resource_types": {
"type": "array",
"items": {
"type": "string",
"enum": [
"document",
"stylesheet",
"image",
"media",
"font",
"script",
"xhr",
"fetch",
"websocket",
"other"
]
},
"default": [
"xhr",
"fetch"
],
"description": "Resource types to record (exact singular names; no aliases). Unknown values are 400."
},
"include_bodies": {
"type": "boolean",
"default": true,
"description": "Include response bodies; false returns url/status/type/timing only, far smaller."
},
"max_body_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 2097152,
"default": 1048576,
"description": "Per-response body cap in bytes; 0 = default. Larger bodies are truncated and flagged body_truncated."
},
"max_responses": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"default": 100,
"description": "Maximum responses recorded; 0 = default."
}
}
},
"ScrapeAction": {
"description": "One workflow step: an object with exactly one verb key plus optional label/timeout_ms/on_error. Two verb keys, or an unknown verb, is 400 ERR::REQUEST::INVALID_PARAMETER before anything is spent.",
"oneOf": [
{
"$ref": "#/$defs/ScrapeActionWaitFor"
},
{
"$ref": "#/$defs/ScrapeActionClick"
},
{
"$ref": "#/$defs/ScrapeActionFill"
},
{
"$ref": "#/$defs/ScrapeActionSelect"
},
{
"$ref": "#/$defs/ScrapeActionScroll"
},
{
"$ref": "#/$defs/ScrapeActionEvaluate"
},
{
"$ref": "#/$defs/ScrapeActionScreenshot"
}
]
},
"ScrapeActionClick": {
"type": "object",
"title": "click",
"description": "Click an element.",
"required": [
"click"
],
"additionalProperties": false,
"properties": {
"click": {
"oneOf": [
{
"type": "string",
"minLength": 1,
"description": "Shorthand: CSS selector to click."
},
{
"type": "object",
"properties": {
"selector": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
},
"description": "Unknown keys inside the verb object are ignored.",
"required": [
"selector"
]
}
]
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
}
},
"ScrapeActionEvaluate": {
"type": "object",
"title": "evaluate",
"description": "Run JavaScript in the page.",
"required": [
"evaluate"
],
"additionalProperties": false,
"properties": {
"evaluate": {
"oneOf": [
{
"type": "string",
"minLength": 1,
"description": "Shorthand: JavaScript expression."
},
{
"type": "object",
"properties": {
"expression": {
"type": "string",
"minLength": 1,
"description": "JavaScript run in the page."
},
"return_value": {
"type": "boolean",
"default": false,
"description": "Return the expression's value in the step result."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
},
"description": "Unknown keys inside the verb object are ignored.",
"required": [
"expression"
]
}
]
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
}
},
"ScrapeActionFill": {
"type": "object",
"title": "fill",
"description": "Type a value into an input.",
"required": [
"fill"
],
"additionalProperties": false,
"properties": {
"fill": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"minLength": 1,
"description": "Input to fill."
},
"value": {
"type": "string",
"description": "Text to enter; must be a string."
},
"secret": {
"type": "boolean",
"default": false,
"description": "Redact the value from logs, results and diagnostics; use for passwords."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
},
"description": "Unknown keys inside the verb object are ignored.",
"required": [
"selector",
"value"
]
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
}
},
"ScrapeActionScreenshot": {
"type": "object",
"title": "screenshot",
"description": "Capture a screenshot mid-workflow (needs full-browser rendering); returned under `screenshots` with this step's label.",
"required": [
"screenshot"
],
"additionalProperties": false,
"properties": {
"screenshot": {
"type": "object",
"properties": {
"full_page": {
"type": "boolean",
"default": false,
"description": "Capture the full page; exclusive with selector."
},
"selector": {
"type": "string",
"description": "Element to capture; exclusive with full_page."
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"jpg",
"webp"
],
"description": "Image format; engine default if omitted."
},
"quality": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"default": 0,
"description": "Lossy quality; 0 = engine default."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
},
"description": "Unknown keys inside the verb object are ignored."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
}
},
"ScrapeActionScroll": {
"type": "object",
"title": "scroll",
"description": "Scroll the page or an element into view.",
"required": [
"scroll"
],
"additionalProperties": false,
"properties": {
"scroll": {
"type": "object",
"properties": {
"y": {
"type": "integer",
"description": "Pixels to scroll vertically."
},
"pixels": {
"type": "integer",
"description": "Alias of `y`."
},
"selector": {
"type": "string",
"description": "Scroll this element into view."
},
"to_bottom": {
"type": "boolean",
"default": false,
"description": "Scroll to the bottom of the page."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continues. May also be placed inside the verb object."
}
},
"description": "Needs non-zero `y`/`pixels`, a `selector`, or to_bottom=true, else 400."
},
"label": {
"type": "string",
"description": "Name echoed in diagnostics and screenshot labels; defaults to `<verb>[index]`."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"description": "Per-step timeout in ms; omitted or <=0 uses the engine default. May also be placed inside the verb object."
},
"on_error": {
"type": "string",
"enum": [
"fail",
"skip"
],
"default": "fail",
"description": "`fail` ends the request at 0 credits naming the step; `skip` records the failure and continue
# --- truncated at 32 KB (40 KB total) ---
# Full source: https://artifacts.apis.io/spicrawl-com/json-schema/spicrawl-com-scrape-request-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/spicrawl-com-scrape-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.