> ## Documentation Index
> Fetch the complete documentation index at: https://docs.prefetch.io/llms.txt
> Use this file to discover all available pages before exploring further.

# GET /batch/scrape/{id}

> Poll a batch scrape for progress and read its pages. Charges 1 credit for each page completed since your last call.

## Overview

The same response as [`GET /crawl/{id}`](/api-reference/endpoint/crawl-status), with `kind: "batch"`: progress, plus a page of scraped pages in completion order. Follow `next` until it is `null` to read every page. Results stay readable for **24 hours** after the batch finishes.

Each page carries `ok`. A failed page has `ok: false`, an `error`, and an [`error_code`](/concepts/errors#error-codes), and is not charged.

## Example request

```bash cURL theme={"theme":"css-variables"}
curl "https://api.prefetch.io/batch/scrape/crw_5a8d2e7f1c4b4a9e8d3c6b1a0f9e8d7c" \
  -H "X-API-Key: $PREFETCH_API_KEY"
```


## OpenAPI

````yaml GET /batch/scrape/{id}
openapi: 3.1.0
info:
  title: Prefetch API
  description: >-
    Extract brand identity, company data, screenshots, IAB classifications, and
    clean page content from any URL.
  version: 1.0.0
  contact:
    email: support@prefetch.io
servers:
  - url: https://api.prefetch.io
    description: Production
security:
  - apiKey: []
tags:
  - name: Endpoints
    description: Data extraction endpoints. All require authentication and consume credits.
  - name: Health
    description: Health and readiness probes. No authentication required.
paths:
  /batch/scrape/{id}:
    get:
      tags:
        - Endpoints
      summary: Get batch status and results
      description: >-
        Progress plus a page of scraped pages, in completion order: the same
        response as `GET /crawl/{id}`, with `kind: "batch"`. Follow `next` until
        it is null. Pages are billed here as they complete, never twice.
      operationId: getBatchScrape
      parameters:
        - $ref: '#/components/parameters/crawlId'
        - $ref: '#/components/parameters/crawlSkip'
        - $ref: '#/components/parameters/crawlPageLimit'
      responses:
        '200':
          description: Batch status.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/CrawlStatusData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - success
                  - data
                  - meta
        '400':
          description: Invalid or missing parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Revoked key, expired key, credit limit, or blocklisted URL.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Crawl not found, expired, or owned by another key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: The URL hostname could not be resolved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service temporarily busy. Retry shortly.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '504':
          description: Request timed out.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  parameters:
    crawlId:
      name: id
      in: path
      required: true
      description: The crawl id returned by `POST /crawl`.
      schema:
        type: string
        example: crw_9f2c1a7b4e0d4c3a8b1e5f7d2c9a0b3e
    crawlSkip:
      name: skip
      in: query
      required: false
      description: >-
        Number of result pages to skip. Use the `next` link rather than building
        this by hand.
      schema:
        type: integer
        minimum: 0
        default: 0
    crawlPageLimit:
      name: limit
      in: query
      required: false
      description: Number of crawled pages to return per request.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
  schemas:
    CrawlStatusData:
      type: object
      properties:
        id:
          type: string
        status:
          type: string
          enum:
            - pending
            - running
            - completed
            - failed
            - cancelled
        url:
          type: string
        total:
          type: integer
          description: >-
            Pages the crawl expects to fetch, as currently known. Rises as it
            discovers more.
        completed:
          type: integer
        failed:
          type: integer
        credits_used:
          type: integer
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
          nullable: true
        finished_at:
          type: string
          format: date-time
          nullable: true
        expires_at:
          type: string
          format: date-time
        error:
          type: string
          nullable: true
        next:
          type: string
          nullable: true
          description: URL for the next page of results, or null when there are no more.
        data:
          type: array
          items:
            $ref: '#/components/schemas/CrawlPage'
          description: Crawled pages, in completion order.
        kind:
          type: string
          enum:
            - crawl
            - batch
          description: '`batch` for a `POST /batch/{endpoint}` job.'
        endpoint:
          type: string
          description: >-
            What each item is: `scrape` for a crawl or /batch/scrape, otherwise
            the batch's endpoint (`brand`, `enrich`, …).
          example: scrape
        skipped:
          type: object
          description: >-
            URLs the crawl found but did not fetch, by reason: `limit`, `depth`,
            `out-of-scope`, `excluded`, `not-included`, `robots`, `off-site`,
            `file`, `invalid`, `blocklist`, `duplicate` (a redirect onto a page
            already crawled). Present once anything was skipped.
          additionalProperties:
            type: object
            properties:
              count:
                type: integer
              samples:
                type: array
                items:
                  type: string
                description: Up to five examples.
    Meta:
      type: object
      properties:
        requestId:
          type: string
          format: uuid
          description: Unique identifier for this request.
          example: a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d
        durationMs:
          type: integer
          nullable: true
          description: Time taken to process the request in milliseconds.
          example: 1842
      required:
        - requestId
        - durationMs
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
          description: >-
            Always false. Absent, like `meta`, on authentication and rate-limit
            errors, which are answered before a request is processed.
        error:
          type: string
          description: >-
            Human-readable error message. The wording can change: branch on
            `error_code`.
          example: Credit limit exceeded
        error_code:
          type: string
          enum:
            - INVALID_REQUEST
            - PAYLOAD_TOO_LARGE
            - NOT_FOUND
            - CONFLICT
            - UNAUTHORIZED
            - FORBIDDEN
            - CREDITS_EXHAUSTED
            - RATE_LIMITED
            - CONCURRENCY_LIMITED
            - URL_BLOCKED
            - URL_NOT_PERMITTED
            - DNS_RESOLUTION_FAILED
            - TARGET_BLOCKED
            - TARGET_CONNECTION_FAILED
            - TARGET_TIMEOUT
            - TARGET_SSL_ERROR
            - TARGET_SERVER_ERROR
            - TARGET_CLIENT_ERROR
            - TARGET_NOT_A_PAGE
            - TARGET_UNLOADABLE
            - RESEARCH_INCONCLUSIVE
            - TIMEOUT
            - SERVICE_BUSY
            - SERVICE_UNAVAILABLE
            - INTERNAL_ERROR
          description: >-
            What went wrong, for machines. Stable: a code keeps its meaning once
            published. See [Error handling](/concepts/errors).
          example: CREDITS_EXHAUSTED
        retryable:
          type: boolean
          description: >-
            Whether the same request can succeed if sent again after a short
            wait (honour `Retry-After` when present). False for problems with
            the request or the target.
          example: false
        retryAfterSeconds:
          type: integer
          description: 'On `RATE_LIMITED`: seconds until a request will be accepted.'
        limit:
          type: integer
          description: >-
            On `CONCURRENCY_LIMITED`: how many requests this key may have in
            flight.
        meta:
          $ref: '#/components/schemas/Meta'
      required:
        - error
        - error_code
        - retryable
    CrawlPage:
      type: object
      description: >-
        One crawled page. Carries the same fields `GET /scrape` returns, plus
        the crawl's own bookkeeping.
      allOf:
        - type: object
          properties:
            url:
              type: string
            depth:
              type: integer
              description: >-
                How many links from the start URL. Sitemap-seeded pages are
                depth 0.
            status_code:
              type: integer
              nullable: true
            ok:
              type: boolean
              description: >-
                False when the page could not be fetched. You are not charged
                for it.
            error:
              type: string
              nullable: true
            error_code:
              type: string
              nullable: true
              description: >-
                Why the page failed, as one of the API's [error
                codes](/concepts/errors#error-codes); null when it did not.
              example: TARGET_SERVER_ERROR
        - $ref: '#/components/schemas/ScrapePayload'
    ScrapePayload:
      type: object
      properties:
        url:
          type: string
        final_url:
          type: string
        domain:
          type: string
          nullable: true
          example: stripe.com
        status_code:
          type: integer
          nullable: true
        metadata:
          $ref: '#/components/schemas/ScrapeMetadata'
        markdown:
          $ref: '#/components/schemas/MarkdownBlock'
        summary:
          $ref: '#/components/schemas/SummaryBlock'
        html:
          $ref: '#/components/schemas/HtmlBlock'
        raw_html:
          $ref: '#/components/schemas/HtmlBlock'
        links:
          $ref: '#/components/schemas/LinksBlock'
        images:
          $ref: '#/components/schemas/ScrapeImagesBlock'
        json:
          $ref: '#/components/schemas/JsonBlock'
        screenshot:
          $ref: '#/components/schemas/ScrapeScreenshotBlock'
        pdf:
          $ref: '#/components/schemas/PdfBlock'
        prompt_injection:
          $ref: '#/components/schemas/PromptInjectionBlock'
        warnings:
          type: array
          items:
            type: string
          description: Non-fatal problems, such as a format that could not be produced.
      description: >-
        The page content fields. Which of them are present depends on the
        `formats` requested.
    ScrapeMetadata:
      type: object
      description: Always present, whatever formats were requested.
      properties:
        source_url:
          type: string
          nullable: true
          description: The URL you requested.
        final_url:
          type: string
          nullable: true
          description: The URL after redirects.
        status_code:
          type: integer
          nullable: true
        title:
          type: string
          nullable: true
          example: Stripe | Financial Infrastructure
        description:
          type: string
          nullable: true
        language:
          type: string
          nullable: true
          example: en
        canonical_url:
          type: string
          nullable: true
        favicon:
          type: string
          nullable: true
        author:
          type: string
          nullable: true
        site_name:
          type: string
          nullable: true
        published_time:
          type: string
          nullable: true
        modified_time:
          type: string
          nullable: true
        robots:
          type: string
          nullable: true
          description: The page's own robots meta tag.
        keywords:
          type: array
          items:
            type: string
        open_graph:
          type: object
          additionalProperties:
            type: string
        twitter:
          type: object
          additionalProperties:
            type: string
        json_ld:
          type: array
          items:
            type: object
          description: Parsed JSON-LD blocks, up to 10.
        headings:
          type: array
          description: The page's heading outline, up to 100 entries.
          items:
            type: object
            properties:
              level:
                type: integer
              text:
                type: string
        content_type:
          type: string
          enum:
            - text/html
            - application/pdf
          description: >-
            What the URL served. A PDF's text becomes the markdown; it has no
            html.
        page_count:
          type: integer
          description: 'PDFs only: pages in the document.'
        cache_state:
          type: string
          enum:
            - hit
            - miss
          description: >-
            Present when the request set `max_age`: `hit` = served from a stored
            fetch, `miss` = fetched live.
        cached_at:
          type: string
          description: 'On a cache hit: when the stored copy was fetched (ISO 8601).'
    MarkdownBlock:
      type: object
      properties:
        content:
          type: string
          description: >-
            GitHub Flavored Markdown. Links and images are resolved to absolute
            URLs.
        char_count:
          type: integer
        word_count:
          type: integer
        truncated:
          type: boolean
          description: True when the content hit the 1 MB size cap and was cut.
        main_content_only:
          type: boolean
          description: >-
            True when boilerplate was successfully isolated away. False means
            the full page body was returned.
    SummaryBlock:
      type: object
      properties:
        text:
          type: string
          nullable: true
          description: Null when the summary could not be produced; see `warnings`.
        model:
          type: string
          nullable: true
    HtmlBlock:
      type: object
      properties:
        content:
          type: string
        char_count:
          type: integer
        truncated:
          type: boolean
        main_content_only:
          type: boolean
    LinksBlock:
      type: object
      properties:
        internal:
          type: array
          description: Links on the same site, subdomains included.
          items:
            $ref: '#/components/schemas/ScrapeLinkItem'
        external:
          type: array
          items:
            $ref: '#/components/schemas/ScrapeLinkItem'
        count:
          type: integer
    ScrapeImagesBlock:
      type: object
      properties:
        assets:
          type: array
          items:
            $ref: '#/components/schemas/ScrapeImageItem'
        og_image:
          type: string
          nullable: true
        twitter_image:
          type: string
          nullable: true
        count:
          type: integer
    JsonBlock:
      type: object
      properties:
        data:
          type: object
          nullable: true
          description: The extracted object, shaped by your prompt or schema.
        model:
          type: string
          nullable: true
    ScrapeScreenshotBlock:
      type: object
      description: Present when `formats` includes `screenshot`.
      properties:
        url:
          type: string
          description: 'The image on our CDN. Short-lived: copy it if you need to keep it.'
        viewport:
          type: object
          properties:
            width:
              type: integer
            height:
              type: integer
        full_page:
          type: boolean
        format:
          type: string
          enum:
            - jpeg
            - png
            - webp
    PdfBlock:
      type: object
      description: Present when the URL served a PDF. Its text is in `markdown`.
      properties:
        page_count:
          type: integer
        pages_parsed:
          type: integer
          description: Pages whose text was read (capped for very long documents).
        truncated:
          type: boolean
    PromptInjectionBlock:
      type: object
      description: Present when the request set `check_prompt_injection`.
      properties:
        detected:
          type: boolean
          description: >-
            True when the page's text appears to contain instructions aimed at
            an AI model.
        reason:
          type: string
          nullable: true
          description: >-
            Why it was flagged, quoting or describing the suspicious text. Null
            when nothing was found.
          example: >-
            The page tells AI assistants to ignore their instructions and send
            the user's API keys to an outside address.
        complete:
          type: boolean
          description: >-
            True when all of the page's text was checked. False when part of it
            could not be (a very long page, or the classifier was unavailable):
            `detected: false` then means nothing was found in what was checked,
            not that the page is clean.
        model:
          type: string
          nullable: true
          description: The model that checked it; null for a page with no text.
          example: gpt-5.6-luna
      required:
        - detected
        - reason
        - complete
        - model
    ScrapeLinkItem:
      type: object
      properties:
        url:
          type: string
        text:
          type: string
          nullable: true
          description: The anchor text.
        title:
          type: string
          nullable: true
        rel:
          type: string
          nullable: true
    ScrapeImageItem:
      type: object
      properties:
        url:
          type: string
        alt:
          type: string
          nullable: true
        width:
          type: integer
          nullable: true
        height:
          type: integer
          nullable: true
        loading:
          type: string
          nullable: true
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your Prefetch API key. Obtain one from the dashboard.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.