> ## 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

> A monitor's check history, newest first. Free.

## Overview

Lists the monitor's checks, newest first, with each one's status, page counts and credits. Pass `status` to filter — `status=skipped_no_credits`, say, to see when a key ran dry. Open any check with [`GET /monitor/{id}/checks/{checkId}`](/api-reference/endpoint/monitor-check) to see its pages.

Checks are kept for the monitor's `retention_days` (30 by default) and deleted after that.

## Example request

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

  ```javascript Node.js theme={"theme":"css-variables"}
  const res = await fetch(`https://api.prefetch.io/monitor/${monitorId}/checks?limit=10`, {
    headers: { "X-API-Key": process.env.PREFETCH_API_KEY },
  });
  const { data } = await res.json();
  for (const c of data.checks) console.log(c.finished_at, c.status, c.summary.changed);
  ```

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

  data = requests.get(
      f"https://api.prefetch.io/monitor/{monitor_id}/checks",
      params={"limit": 10},
      headers={"X-API-Key": os.environ["PREFETCH_API_KEY"]},
  ).json()["data"]
  for c in data["checks"]:
      print(c["finished_at"], c["status"], c["summary"]["changed"])
  ```
</CodeGroup>

## Example response

```json theme={"theme":"css-variables"}
{
  "success": true,
  "data": {
    "checks": [
      {
        "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"
      }
    ],
    "total": 1,
    "next": null
  },
  "meta": {
    "requestId": "b4f7d8e9-0a1b-4c23-a4d5-6f708192a3b4",
    "durationMs": 44
  }
}
```

## Streaks

Monitors keep no failure counter. To find out how long something has been going on, count the leading run of a status: the list is newest first, so the checks at the top that share a status are the current streak, and the first check with a different status ends it.

`actual_credits` is what each check was charged — 24 here: 18 pages fetched at 1 credit, plus the 3-credit surcharge on the one page tracking `json`, plus 3 pages judged at 1. Skipped checks are never charged.

## Related

<CardGroup cols={2}>
  <Card title="GET /monitor/{id}/checks/{checkId}" icon="code-compare" href="/api-reference/endpoint/monitor-check">
    What one check found, page by page.
  </Card>

  <Card title="POST /monitor/{id}/run" icon="play" href="/api-reference/endpoint/monitor-run">
    Run a check now.
  </Card>
</CardGroup>


## OpenAPI

````yaml GET /monitor/{id}/checks
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:
    get:
      tags:
        - Endpoints
      summary: List checks
      description: >-
        The monitor's checks, newest first, for as long as its `retention_days`
        keeps them. Free.
      operationId: listMonitorChecks
      parameters:
        - $ref: '#/components/parameters/monitorId'
        - $ref: '#/components/parameters/monitorListLimit'
        - $ref: '#/components/parameters/monitorListOffset'
        - $ref: '#/components/parameters/monitorCheckStatus'
      responses:
        '200':
          description: Checks.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/MonitorCheckListData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - success
                  - data
                  - meta
              example:
                success: true
                data:
                  checks:
                    - 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'
                  total: 1
                  next: null
                meta:
                  requestId: b4f7d8e9-0a1b-4c23-a4d5-6f708192a3b4
                  durationMs: 44
        '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 not found — or not yours. Monitor ids are unguessable, so
            another key's monitor is reported as not found rather than
            forbidden.
          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
    monitorListLimit:
      name: limit
      in: query
      required: false
      description: Items to return per request.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    monitorListOffset:
      name: offset
      in: query
      required: false
      description: Items to skip. Use the `next` link rather than building this by hand.
      schema:
        type: integer
        minimum: 0
        default: 0
    monitorCheckStatus:
      name: status
      in: query
      required: false
      description: Only checks with this status.
      schema:
        type: string
        enum:
          - queued
          - running
          - completed
          - failed
          - partial
          - skipped_overlap
          - skipped_no_credits
  schemas:
    MonitorCheckListData:
      type: object
      properties:
        checks:
          type: array
          items:
            $ref: '#/components/schemas/MonitorCheckData'
        total:
          type: integer
        next:
          type: string
          nullable: true
          description: URL for the next page of checks, 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
    MonitorSummary:
      type: object
      properties:
        total_pages:
          type: integer
        same:
          type: integer
        new:
          type: integer
        changed:
          type: integer
        removed:
          type: integer
        error:
          type: integer
  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.