> ## 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 /monitor/{id}/checks/{checkId}

> What one check found, page by page: status, diff, and the judge's verdict. Free.

## Overview

Returns one check with a page of its per-page results. Each page carries its status, a diff when it changed, the judge's verdict when the monitor has a goal, and — in json mode — the full current extraction.

Pass `status=changed` to see only the pages that changed. Results are paginated: follow `next` until it is `null`.

## Example request

<CodeGroup>
  ```bash cURL theme={"theme":"css-variables"}
  curl "https://api.prefetch.io/monitor/mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c/checks/chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a?status=changed" \
    -H "X-API-Key: $PREFETCH_API_KEY"
  ```

  ```javascript Node.js theme={"theme":"css-variables"}
  const url = `https://api.prefetch.io/monitor/${monitorId}/checks/${checkId}?status=changed`;
  const res = await fetch(url, { headers: { "X-API-Key": process.env.PREFETCH_API_KEY } });
  const { data: check } = await res.json();

  for (const page of check.pages) {
    if (page.is_meaningful === false) continue; // the judge ruled it noise
    console.log(page.url, page.judgment?.reason);
    console.log(page.diff?.text ?? JSON.stringify(page.diff?.fields, null, 2));
  }
  ```

  ```python Python theme={"theme":"css-variables"}
  import os, requests

  check = requests.get(
      f"https://api.prefetch.io/monitor/{monitor_id}/checks/{check_id}",
      params={"status": "changed"},
      headers={"X-API-Key": os.environ["PREFETCH_API_KEY"]},
  ).json()["data"]

  for page in check["pages"]:
      if page["is_meaningful"] is False:
          continue
      print(page["url"], (page["judgment"] or {}).get("reason"))
  ```
</CodeGroup>

## Example response

```json theme={"theme":"css-variables"}
{
  "success": true,
  "data": {
    "id": "chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a",
    "monitor_id": "mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c",
    "status": "completed",
    "trigger": "scheduled",
    "scheduled_for": "2026-10-12T06:00:00.000Z",
    "started_at": "2026-10-12T06:00:04.112Z",
    "finished_at": "2026-10-12T06:01:27.930Z",
    "estimated_credits": 55,
    "actual_credits": 24,
    "summary": { "total_pages": 19, "same": 16, "new": 1, "changed": 1, "removed": 1, "error": 0 },
    "target_results": [
      { "target_id": "tgt_8d1e0f2a3b4c5d6e", "type": "scrape", "pages": 1, "checked": 1, "baseline": false },
      { "target_id": "tgt_1a2b3c4d5e6f7a8b", "type": "crawl", "discovered": 17, "limit": 25, "complete": true, "baseline": false }
    ],
    "error": null,
    "notifications": { "webhook": { "pending": 0, "delivered": 2, "failed": 0 } },
    "pages": [
      {
        "target_id": "tgt_8d1e0f2a3b4c5d6e",
        "url": "https://example.com/pricing",
        "status": "changed",
        "status_code": 200,
        "error": null,
        "title": "Pricing — Example",
        "previous_check_id": "chk_51b0c2d3e4f5a6b7c8d9e0f1a2b3c4d5",
        "is_meaningful": true,
        "judgment": {
          "meaningful": true,
          "confidence": "high",
          "reason": "The Starter plan's price went from $19 to $24 a month.",
          "meaningful_changes": [
            { "type": "changed", "before": "$19/mo", "after": "$24/mo", "reason": "A plan price changed." }
          ]
        },
        "diff": {
          "fields": { "plans[0].price": { "previous": "$19/mo", "current": "$24/mo", "change": "changed" } },
          "changed_fields": 1
        },
        "snapshot": {
          "json": {
            "plans": [
              { "name": "Starter", "price": "$24/mo", "features": ["3 seats", "Email support"] },
              { "name": "Pro", "price": "$49/mo", "features": ["Unlimited seats", "SSO"] }
            ]
          }
        }
      }
    ],
    "next": null
  },
  "meta": {
    "requestId": "c5a8e9f0-1b2c-4d34-b5e6-708192a3b4c5",
    "durationMs": 74
  }
}
```

## Check statuses

| Status | Meaning |
| - | - |
| `queued` | Waiting for a worker. |
| `running` | In progress — `pages` already holds what it has recorded. |
| `completed` | Every page was checked. |
| `partial` | Some pages errored, or the check stopped early on credits or its 30-minute limit. Its results are real but incomplete — `error` says why. |
| `failed` | No page could be checked. |
| `skipped_overlap` | The previous check was still running when this one came due. |
| `skipped_no_credits` | The key that owns the monitor had no credits left, or was revoked. Never charged. |

## Reading a page

| Field | Meaning |
| - | - |
| `status` | `same`, `new`, `changed`, `removed` or `error` — see [detecting changes](/api-reference/endpoint/monitor#detecting-changes). |
| `diff.text`, `diff.hunks` | Markdown mode: the unified diff, and the same hunks as structured lines. |
| `diff.fields` | Json mode: each changed field by JSON path, with `previous`, `current` and `change` (`added`, `removed` or `changed`). |
| `diff.truncated` | The diff was larger than the stored cap. `added_lines` and `removed_lines` still count all of it. |
| `is_meaningful`, `judgment` | The judge's verdict and its reasoning. `null` when the page was not judged. |
| `snapshot.json` | Json mode: the full current extraction, so you never need to re-fetch the page. |
| `previous_check_id` | The check whose snapshot this one was compared with. |

A page that is new since the first check carries its whole content as an all-added diff. Removed pages carry no diff.

## Related

<CardGroup cols={2}>
  <Card title="GET /monitor/{id}/checks" icon="list" href="/api-reference/endpoint/monitor-checks">
    Find a check id.
  </Card>

  <Card title="monitor.page webhook" icon="bell" href="/api-reference/endpoint/monitor-webhook-page">
    Get the same page objects pushed to you.
  </Card>
</CardGroup>


## OpenAPI

````yaml GET /monitor/{id}/checks/{checkId}
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:
  /monitor/{id}/checks/{checkId}:
    get:
      tags:
        - Endpoints
      summary: Get a check
      description: >-
        One check with a page of its per-page results: status, diff, the judge's
        verdict and, in JSON mode, the current extraction. Filter with
        `status=changed` to see only what changed, and follow `next` until it is
        null. Free.
      operationId: getMonitorCheck
      parameters:
        - $ref: '#/components/parameters/monitorId'
        - $ref: '#/components/parameters/monitorCheckId'
        - $ref: '#/components/parameters/monitorPageSkip'
        - $ref: '#/components/parameters/monitorPageLimit'
        - $ref: '#/components/parameters/monitorPageStatus'
      responses:
        '200':
          description: Check with page results.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/MonitorCheckDetailData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - success
                  - data
                  - meta
              example:
                success: true
                data:
                  id: chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a
                  monitor_id: mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c
                  status: completed
                  trigger: scheduled
                  scheduled_for: '2026-10-12T06:00:00.000Z'
                  started_at: '2026-10-12T06:00:04.112Z'
                  finished_at: '2026-10-12T06:01:27.930Z'
                  estimated_credits: 55
                  actual_credits: 24
                  summary:
                    total_pages: 19
                    same: 16
                    new: 1
                    changed: 1
                    removed: 1
                    error: 0
                  target_results:
                    - target_id: tgt_8d1e0f2a3b4c5d6e
                      type: scrape
                      pages: 1
                      checked: 1
                      baseline: false
                    - target_id: tgt_1a2b3c4d5e6f7a8b
                      type: crawl
                      discovered: 17
                      limit: 25
                      complete: true
                      baseline: false
                  error: null
                  created_at: '2026-10-12T06:00:00.513Z'
                  updated_at: '2026-10-12T06:01:27.930Z'
                  notifications:
                    webhook:
                      pending: 0
                      delivered: 2
                      failed: 0
                  pages:
                    - target_id: tgt_8d1e0f2a3b4c5d6e
                      url: https://example.com/pricing
                      status: changed
                      status_code: 200
                      error: null
                      title: Pricing — Example
                      previous_check_id: chk_51b0c2d3e4f5a6b7c8d9e0f1a2b3c4d5
                      is_meaningful: true
                      judgment:
                        meaningful: true
                        confidence: high
                        reason: The Starter plan's price went from $19 to $24 a month.
                        meaningful_changes:
                          - type: changed
                            before: $19/mo
                            after: $24/mo
                            reason: A plan price changed.
                      diff:
                        fields:
                          plans[0].price:
                            previous: $19/mo
                            current: $24/mo
                            change: changed
                        changed_fields: 1
                      snapshot:
                        json:
                          plans:
                            - name: Starter
                              price: $24/mo
                              features:
                                - 3 seats
                                - Email support
                            - name: Pro
                              price: $49/mo
                              features:
                                - Unlimited seats
                                - SSO
                    - target_id: tgt_1a2b3c4d5e6f7a8b
                      url: https://example.com/changelog/2026-10-11
                      status: new
                      status_code: 200
                      error: null
                      title: October 11 release
                      previous_check_id: null
                      is_meaningful: false
                      judgment:
                        meaningful: false
                        confidence: high
                        reason: A bug-fix release; no plan or price changes.
                        meaningful_changes: []
                      diff:
                        text: |
                          --- previous
                          +++ current
                          @@ -1,0 +1,4 @@
                          +# October 11 release
                          +
                          +- Fixed CSV export of invoices
                          +- Faster dashboard loading
                        added_lines: 4
                        removed_lines: 0
                        truncated: false
                        hunks:
                          - old_start: 1
                            old_lines: 0
                            new_start: 1
                            new_lines: 4
                            lines:
                              - type: added
                                content: '# October 11 release'
                              - type: added
                                content: ''
                              - type: added
                                content: '- Fixed CSV export of invoices'
                              - type: added
                                content: '- Faster dashboard loading'
                      snapshot: null
                  next: >-
                    /monitor/mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c/checks/chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a?skip=2&limit=2
                meta:
                  requestId: c5a8e9f0-1b2c-4d34-b5e6-708192a3b4c5
                  durationMs: 74
        '400':
          description: Invalid or missing parameters. The message names the field.
          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, blocklisted URL, monitor
            limit reached, or a RapidAPI subscription — monitors need a direct
            Prefetch API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Monitor or check not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Monitoring is temporarily unavailable. Retry shortly.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  parameters:
    monitorId:
      name: id
      in: path
      required: true
      description: The monitor id returned by `POST /monitor`.
      schema:
        type: string
        example: mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c
    monitorCheckId:
      name: checkId
      in: path
      required: true
      description: A check id, from `GET /monitor/{id}/checks` or `POST /monitor/{id}/run`.
      schema:
        type: string
        example: chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a
    monitorPageSkip:
      name: skip
      in: query
      required: false
      description: >-
        Page results to skip. Use the `next` link rather than building this by
        hand.
      schema:
        type: integer
        minimum: 0
        default: 0
    monitorPageLimit:
      name: limit
      in: query
      required: false
      description: Page results to return per request.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    monitorPageStatus:
      name: status
      in: query
      required: false
      description: Only pages with this status — `changed` to see just what changed.
      schema:
        type: string
        enum:
          - same
          - new
          - changed
          - removed
          - error
  schemas:
    MonitorCheckDetailData:
      allOf:
        - $ref: '#/components/schemas/MonitorCheckData'
        - type: object
          properties:
            notifications:
              type: object
              properties:
                webhook:
                  type: object
                  nullable: true
                  description: >-
                    Webhook deliveries for this check, by outcome. `null` when
                    the monitor has no webhook.
                  properties:
                    pending:
                      type: integer
                    delivered:
                      type: integer
                    failed:
                      type: integer
            pages:
              type: array
              items:
                $ref: '#/components/schemas/MonitorCheckPage'
            next:
              type: string
              nullable: true
              description: URL for the next page of results, or null.
    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
    MonitorCheckData:
      type: object
      properties:
        id:
          type: string
          example: chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a
        monitor_id:
          type: string
        status:
          type: string
          enum:
            - queued
            - running
            - completed
            - failed
            - partial
            - skipped_overlap
            - skipped_no_credits
          description: >-
            `partial`: some pages errored, or the check stopped early on credits
            or its time limit — its results are real but incomplete.
            `skipped_overlap`: the previous check was still running.
            `skipped_no_credits`: the owning key had no credits or was revoked.
            Skipped checks are never charged.
        trigger:
          type: string
          enum:
            - scheduled
            - manual
        scheduled_for:
          type: string
          format: date-time
          nullable: true
        started_at:
          type: string
          format: date-time
          nullable: true
        finished_at:
          type: string
          format: date-time
          nullable: true
        estimated_credits:
          type: integer
          nullable: true
          description: Upper bound, computed when the check was queued.
        actual_credits:
          type: integer
          description: >-
            What the check was charged: pages fetched at the `/scrape` rate,
            plus pages judged.
        summary:
          $ref: '#/components/schemas/MonitorSummary'
        target_results:
          type: array
          nullable: true
          items:
            type: object
          description: >-
            Per target: pages checked, and for crawls whether the crawl ran to
            completion. Only a complete crawl can report removed pages.
        error:
          type: string
          nullable: true
          description: >-
            Why the check is partial, failed or skipped, or what it could not
            do.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    MonitorCheckPage:
      type: object
      properties:
        target_id:
          type: string
        url:
          type: string
        status:
          type: string
          enum:
            - same
            - new
            - changed
            - removed
            - error
        status_code:
          type: integer
          nullable: true
        error:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        previous_check_id:
          type: string
          nullable: true
          description: The check the compared snapshot was taken in.
        is_meaningful:
          type: boolean
          nullable: true
          description: The judge's verdict, or `null` when the page was not judged.
        judgment:
          allOf:
            - $ref: '#/components/schemas/MonitorJudgment'
          nullable: true
        diff:
          allOf:
            - $ref: '#/components/schemas/MonitorDiff'
          nullable: true
          description: For changed pages, and for pages that are new since the first check.
        snapshot:
          type: object
          nullable: true
          properties:
            json:
              type: object
              nullable: true
          description: 'JSON mode: the full current extraction.'
    MonitorSummary:
      type: object
      properties:
        total_pages:
          type: integer
        same:
          type: integer
        new:
          type: integer
        changed:
          type: integer
        removed:
          type: integer
        error:
          type: integer
    MonitorJudgment:
      type: object
      properties:
        meaningful:
          type: boolean
        confidence:
          type: string
          enum:
            - high
            - medium
            - low
        reason:
          type: string
          example: The Starter plan's price went from $19 to $24 a month.
        meaningful_changes:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                  - added
                  - removed
                  - changed
              before:
                type: string
                nullable: true
              after:
                type: string
                nullable: true
              reason:
                type: string
                nullable: true
    MonitorDiff:
      type: object
      properties:
        text:
          type: string
          nullable: true
          description: 'Markdown mode: a unified diff of the page''s markdown.'
          example: |
            --- previous
            +++ current
            @@ -3,3 +3,3 @@
            -Starter — $19/mo
            +Starter — $24/mo
        hunks:
          type: array
          items:
            $ref: '#/components/schemas/MonitorDiffHunk'
          description: 'Markdown mode: the same diff as structured hunks.'
        added_lines:
          type: integer
        removed_lines:
          type: integer
        truncated:
          type: boolean
          description: >-
            The diff was larger than the stored cap. The line counts still cover
            all of it.
        too_large:
          type: boolean
          description: The page changed almost entirely, so no line diff was computed.
        fields:
          type: object
          description: >-
            JSON mode: changed fields keyed by JSON path, each `{ previous,
            current, change }`.
          example:
            plans[0].price:
              previous: $19/mo
              current: $24/mo
              change: changed
        changed_fields:
          type: integer
        fields_truncated:
          type: boolean
    MonitorDiffHunk:
      type: object
      properties:
        old_start:
          type: integer
        old_lines:
          type: integer
        new_start:
          type: integer
        new_lines:
          type: integer
        lines:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                  - added
                  - removed
                  - context
              content:
                type: string
  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.