Skip to main content
Glama

Get an async scrape job result

scrape_result

Retrieve the extracted content of a completed asynchronous scrape job, including markdown, HTML, links, images, screenshot, and metadata; call only after scrape_status shows done.

Instructions

Fetch the extracted content of a completed async scrape job (the same result shape as the synchronous scrape tool: markdown, cleaned HTML, raw HTML, links, images, screenshot, page metadata in metadata, values from extract.elements in elements, and response_meta.usage). Errors if the job is still pending/running — check scrape_status first (status done) before calling this. Check page_status_code before you trust the content: it is the HTTP status the site answered with for the final page. A page the site served is a successful result whatever its status, so a 404 or 503 page comes back with its content, not as an error. A 404 means the markdown is the site's "not found" page, not the page you asked for. 2xx and 4xx pages are billed, except 403, 407, 408, 429 and 451; 5xx pages are never billed. A job answers for 24 hours after it was submitted, then returns not_found. Screenshot URLs are signed download links that expire at the same moment, however late you fetch the result: download the image if you need it later.

Input Schema

NameRequiredDescriptionDefault
job_idYesJob identifier returned by the `scrape_async` tool

Output Schema

NameRequiredDescriptionDefault
urlYesThe URL that was actually scraped, after any redirects, in normalized form — the base that links, images, and internal labels are computed against
linksNoLinks found on the page
imagesNoInline images found on the page
elementsNoThe values asked for in `extract.elements`, under the same names. Each name is a string, an object (a spec with `fields`), a list of either (`all: true`), or null when nothing matched (`[]` with `all: true`). An object holds its field names with the same kinds of values, nested up to 3 levels. Every requested name is always present, at every level of `fields`.
markdownNoPage content converted to clean Markdown
metadataNoExtracted page metadata (title, OG tags, etc.)
raw_htmlNoRaw, unprocessed HTML of the page
warningsNoNon-error notices about the scrape. Truncation codes — `screenshot_truncated` (long page exceeded the scrolling-screenshot height cap), `links_truncated` / `inline_images_truncated` (page had more links/images than the per-page extraction caps), `raw_html_truncated` (rendered HTML exceeded the per-page size budget) — mean the field is present but capped. `elements_truncated` means at least one `elements` value hit a limit: a list was cut at 1,000 matches, the request reached 10,000 matches in total, or a value did not fit the ~1 MB of values allowed per request (that value is then null, never cut short). Unavailability codes — `links_unavailable` / `inline_images_unavailable` / `metadata_unavailable` — mean that optional field could not be extracted and was omitted (null/empty) while the rest of the scrape succeeded, so an empty field carrying one of these does NOT mean the page had none. `screenshot_unavailable` means a screenshot was asked for, but the page came back from the http engine without one. Stable string codes — clients can switch on them. Warnings are stored with the result: async result fetches and cache hits carry them too, filtered to the fields the request asked for. `metadata_truncated` is retired and no longer sent: metadata has no size limit of its own now, though the code can still appear on results stored before that change.
screenshotNoScreenshot of the page, if requested
cleaned_htmlNoCleaned HTML of the main page content
content_typeNoContent-Type header returned by the server
requested_urlYesThe URL you requested, echoed verbatim — before any redirects
response_metaYesRequest-level metadata. `response_meta.usage` reports what the request cost (total_credit_cost and its parts), the billed engine and the resolved proxy tier.
page_status_codeNoThe HTTP status the site answered with for the final page, after redirects. Check it before you trust the content. A page the site served is a successful result whatever its status: a 404 or 503 page comes back with its content here, not as an error, so a 404 means the markdown is the site's "not found" page, not the page you asked for. Billing follows this status: 2xx and 4xx pages are billed, except 403, 407, 408, 429 and 451; 5xx pages are never billed. Older api versions do not send it; they only returned pages that loaded normally.
unsupported_fieldsNoExtract fields that were requested but are not supported for this content type

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv1.3.3
    • removedOutput schema / properties / images / items / properties / alt / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / images / items / properties / alt / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / metadata / properties / favicon_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / metadata / properties / favicon_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed10 schema fields changedv1.1.1
    • addedOutput schema / properties / elements
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "The values asked for in `extract.elements`, under the same names. Each name is a string, an object (a spec with `fields`), a list of either (`all: true`), or null when nothing matched (`[]` with `all: true`). An object holds its field names with the same kinds of values, nested up to 3 levels. Every requested name is always present, at every level of `fields`.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / properties / response_meta / properties / usage / description
      Previous value: -"What this request cost and why: total_credit_cost = engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost, plus the billed engine and the resolved proxy tier."New value: +"What this request cost and why: total_credit_cost = engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost + zero_data_retention_credit_cost, plus the billed engine and the resolved proxy tier."
    • removedOutput schema / properties / response_meta / properties / usage / properties / credits
      Removed value: -{
      -  "deprecated": true,
      -  "description": "Deprecated: use total_credit_cost, which always has the same value. This field will be removed in a future version.",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • removedOutput schema / properties / response_meta / properties / usage / properties / screenshot_slices
      Removed value: -{
      -  "deprecated": true,
      -  "description": "Deprecated: use screenshot_slicing_credit_cost, which always has the same value. Despite its name this is a 0/1 charge, not a count of slices. This field will be removed in a future version.",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • changedOutput schema / properties / response_meta / properties / usage / properties / screenshot_slicing_credit_cost / description
      Previous value: -"The screenshot slicing add-on: 1 when the screenshot was split into slices on this request (a flat +1 credit outside the proxy multiplier, however many slices it made), else 0. A cache hit that reused slices that already existed costs 0. Older api versions do not send it; read `screenshot_slices` then, which has the same value."New value: +"The screenshot slicing add-on: 1 when the screenshot was split into slices on this request (a flat +1 credit outside the proxy multiplier, however many slices it made), else 0. A cache hit that reused slices that already existed costs 0. Older api versions do not send it."
    • changedOutput schema / properties / response_meta / properties / usage / properties / total_credit_cost / description
      Previous value: -"Credits charged for this request. Always equals engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost. 0 when nothing is billed: a cache hit, or a page whose status is not billed (see page_status_code). Older api versions do not send it; read `credits` then, which has the same value."New value: +"Credits charged for this request. Always equals engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost + zero_data_retention_credit_cost. 0 when nothing is billed: a cache hit, or a page whose status is not billed (see page_status_code). Older api versions do not send it."
    • addedOutput schema / properties / response_meta / properties / usage / properties / zero_data_retention_credit_cost
      Added value: +{
      +  "description": "Credits added by zero data retention: 1 on a billed, fresh result, else 0. Older api versions do not send it.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / screenshot / properties / slices / items / properties / url / description
      Previous value: -"URL to download this slice image"New value: +"Signed link to download this slice image. It expires 24 hours after the scrape (for an async scrape, 24 hours after you submitted it). Download the image, do not keep the link"
    • changedOutput schema / properties / screenshot / properties / url / description
      Previous value: -"URL to download the full screenshot image"New value: +"Signed link to download the full screenshot image. It expires 24 hours after the scrape (for an async scrape, 24 hours after you submitted it). Download the image, do not keep the link"
    • changedOutput schema / properties / warnings / description
      Previous value: -"Non-error notices about the scrape. Truncation codes — `screenshot_truncated` (long page exceeded the scrolling-screenshot height cap), `links_truncated` / `inline_images_truncated` (page had more links/images than the per-page extraction caps), `raw_html_truncated` / `metadata_truncated` (rendered HTML exceeded the per-page size budget) — mean the field is present but capped. Unavailability codes — `links_unavailable` / `inline_images_unavailable` / `metadata_unavailable` — mean that optional field could not be extracted and was omitted (null/empty) while the rest of the scrape succeeded, so an empty field carrying one of these does NOT mean the page had none. Stable string codes — clients can switch on them. Warnings are stored with the result: async result fetches and cache hits carry them too, filtered to the fields the request asked for."New value: +"Non-error notices about the scrape. Truncation codes — `screenshot_truncated` (long page exceeded the scrolling-screenshot height cap), `links_truncated` / `inline_images_truncated` (page had more links/images than the per-page extraction caps), `raw_html_truncated` (rendered HTML exceeded the per-page size budget) — mean the field is present but capped. `elements_truncated` means at least one `elements` value hit a limit: a list was cut at 1,000 matches, the request reached 10,000 matches in total, or a value did not fit the ~1 MB of values allowed per request (that value is then null, never cut short). Unavailability codes — `links_unavailable` / `inline_images_unavailable` / `metadata_unavailable` — mean that optional field could not be extracted and was omitted (null/empty) while the rest of the scrape succeeded, so an empty field carrying one of these does NOT mean the page had none. `screenshot_unavailable` means a screenshot was asked for, but the page came back from the http engine without one. Stable string codes — clients can switch on them. Warnings are stored with the result: async result fetches and cache hits carry them too, filtered to the fields the request asked for. `metadata_truncated` is retired and no longer sent: metadata has no size limit of its own now, though the code can still appear on results stored before that change."
  3. Changed14 schema fields changedv1.1.0
    • addedOutput schema / properties / page_status_code
      Added value: +{
      +  "description": "The HTTP status the site answered with for the final page, after redirects. Check it before you trust the content. A page the site served is a successful result whatever its status: a 404 or 503 page comes back with its content here, not as an error, so a 404 means the markdown is the site's \"not found\" page, not the page you asked for. Billing follows this status: 2xx and 4xx pages are billed, except 403, 407, 408, 429 and 451; 5xx pages are never billed. Older api versions do not send it; they only returned pages that loaded normally.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / response_meta / description
      Previous value: -"Request-level metadata. `response_meta.usage` reports credits charged, the billed engine, the resolved proxy tier, and any screenshot-slice add-on."New value: +"Request-level metadata. `response_meta.usage` reports what the request cost (total_credit_cost and its parts), the billed engine and the resolved proxy tier."
    • changedOutput schema / properties / response_meta / properties / usage / description
      Previous value: -"Usage accounting for this request: credits charged, billed engine, resolved proxy tier, and screenshot-slice add-on."New value: +"What this request cost and why: total_credit_cost = engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost, plus the billed engine and the resolved proxy tier."
    • addedOutput schema / properties / response_meta / properties / usage / properties / credits / deprecated
      Added value: +true
    • changedOutput schema / properties / response_meta / properties / usage / properties / credits / description
      Previous value: -"Credits actually charged for this request. Always equals the engine base × the proxy multiplier, plus screenshot_slices. A cache hit has engine \"cache\" (base 0), so it costs only the parts we still had to compute — a newly produced screenshot-slice variant — and is otherwise free."New value: +"Deprecated: use total_credit_cost, which always has the same value. This field will be removed in a future version."
    • changedOutput schema / properties / response_meta / properties / usage / properties / engine / description
      Previous value: -"The engine base the request was billed at — \"http\" (1 credit), \"browser\" (3), \"screenshot\" (5), or \"cache\" (0, the result was served from cache) — before the proxy multiplier. Reflects what was delivered, never what was requested."New value: +"The engine the request was billed at — \"http\", \"browser\", \"screenshot\", or \"cache\" (the result was served from cache). Reflects what was delivered, never what was requested."
    • addedOutput schema / properties / response_meta / properties / usage / properties / engine_credit_cost
      Added value: +{
      +  "description": "The engine base charged, before the proxy multiplier: 1 for \"http\", 3 for \"browser\", 5 for \"screenshot\", 0 for \"cache\". Also 0 when the page is not billed (see page_status_code). Older api versions do not send it.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / response_meta / properties / usage / properties / proxy / description
      Previous value: -"The proxy tier the request actually ran on (resolved value — never `auto`; `auto` is resolved server-side to `basic` or `advanced`)."New value: +"The proxy tier the request actually ran on (resolved value — never `auto`; `auto` is resolved server-side to `basic` or `advanced`). \"advanced\" multiplies the engine base by 5."
    • addedOutput schema / properties / response_meta / properties / usage / properties / proxy_multiplier
      Added value: +{
      +  "description": "The multiplier of the proxy tier the request ran on: 1 for \"basic\", 5 for \"advanced\". Always reported, even when the engine cost is 0. Older api versions do not send it.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / response_meta / properties / usage / properties / screenshot_slices / deprecated
      Added value: +true
    • changedOutput schema / properties / response_meta / properties / usage / properties / screenshot_slices / description
      Previous value: -"Whether this request was billed the screenshot-split add-on: 1 when the screenshot was split on this request (a flat +1 credit outside the proxy multiplier, regardless of how many slices the split produced), else 0 — including a cache hit that reused an already-existing slice variant."New value: +"Deprecated: use screenshot_slicing_credit_cost, which always has the same value. Despite its name this is a 0/1 charge, not a count of slices. This field will be removed in a future version."
    • addedOutput schema / properties / response_meta / properties / usage / properties / screenshot_slicing_credit_cost
      Added value: +{
      +  "description": "The screenshot slicing add-on: 1 when the screenshot was split into slices on this request (a flat +1 credit outside the proxy multiplier, however many slices it made), else 0. A cache hit that reused slices that already existed costs 0. Older api versions do not send it; read `screenshot_slices` then, which has the same value.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / response_meta / properties / usage / properties / total_credit_cost
      Added value: +{
      +  "description": "Credits charged for this request. Always equals engine_credit_cost × proxy_multiplier + screenshot_slicing_credit_cost. 0 when nothing is billed: a cache hit, or a page whose status is not billed (see page_status_code). Older api versions do not send it; read `credits` then, which has the same value.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / response_meta / properties / usage / required
      Previous value: -[
      -  "credits",
      -  "engine",
      -  "proxy",
      -  "screenshot_slices"
      -]New value: +[
      +  "engine",
      +  "proxy"
      +]
  4. First observedv1.0.3

TDQS

A4.8/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: it discloses the error condition for incomplete jobs, the crucial `page_status_code` semantics (4xx/5xx pages are returned as content, not errors), billing rules per status class, the 24-hour job lifetime ending in `not_found`, and expiry of signed screenshot URLs. This is exactly the non-obvious behavior an agent would otherwise get wrong.

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, followed by return shape, then preconditions, then caveats, which is a sound ordering. It is dense and the billing exception list is somewhat tangential to a read call, but every claim is actionable rather than 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?

An output schema exists, yet the description still sketches the result shape and, more importantly, covers failure modes (pending/running, expired jobs) and trust caveats (page_status_code) that the schema cannot express. Nothing an agent needs to call this 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 the single `job_id` is already documented as coming from `scrape_async`, so the baseline is 3. The description goes beyond by explaining the identifier's useful lifetime (24 hours, then `not_found`), which tells the agent when a stored job_id stops working.

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: 'Fetch the extracted content of a completed async scrape job'. It explicitly relates to the synchronous `scrape` tool's result shape and implies a distinct role from `scrape_async` (submit) and `scrape_status` (poll), so an agent can place it in the workflow without ambiguity.

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 precondition and alternative: 'Errors if the job is still pending/running — check `scrape_status` first (status `done`) before calling this.' That is a named sibling plus the exact routing condition, leaving nothing to inference.

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