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

> List the monitors your API key owns, newest first. Free.

## Overview

Returns your monitors with their settings, next run, credit estimate and the summary of each one's last check. Results are paginated: follow `next` until it is `null`.

An API key sees only the monitors it created.

## Example request

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

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

  for (const m of data.monitors) {
    const last = m.last_check_summary;
    console.log(m.name, m.status, last ? `${last.changed} changed` : "no check yet");
  }
  ```

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

  data = requests.get(
      "https://api.prefetch.io/monitor",
      headers={"X-API-Key": os.environ["PREFETCH_API_KEY"]},
  ).json()["data"]

  for m in data["monitors"]:
      print(m["name"], m["status"], m["next_run_at"])
  ```
</CodeGroup>

## Example response

```json theme={"theme":"css-variables"}
{
  "success": true,
  "data": {
    "monitors": [
      {
        "id": "mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c",
        "name": "Competitor pricing",
        "status": "active",
        "schedule": { "cron": "0 9 * * 1-5", "timezone": "Europe/Athens", "text": "every weekday at 9am" },
        "next_run_at": "2026-10-13T06:00:00.000Z",
        "last_run_at": "2026-10-12T06:00:04.112Z",
        "last_check_summary": {
          "check_id": "chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a",
          "status": "completed",
          "finished_at": "2026-10-12T06:01:27.930Z",
          "total_pages": 19, "same": 16, "new": 1, "changed": 1, "removed": 1, "error": 0
        },
        "...": "the rest of the monitor, as in GET /monitor/{id}"
      }
    ],
    "total": 1,
    "next": null
  },
  "meta": {
    "requestId": "c9a2e3f4-5b6c-4d7e-9f80-1a2b3c4d5e6f",
    "durationMs": 47
  }
}
```

## Related

<CardGroup cols={2}>
  <Card title="GET /monitor/{id}" icon="eye" href="/api-reference/endpoint/monitor-get">
    One monitor in full.
  </Card>

  <Card title="POST /monitor" icon="plus" href="/api-reference/endpoint/monitor">
    Create a monitor.
  </Card>
</CardGroup>


## OpenAPI

````yaml GET /monitor
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:
    get:
      tags:
        - Endpoints
      summary: List monitors
      description: The monitors your API key owns, newest first. Free.
      operationId: listMonitors
      parameters:
        - $ref: '#/components/parameters/monitorListLimit'
        - $ref: '#/components/parameters/monitorListOffset'
      responses:
        '200':
          description: Monitors.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/MonitorListData'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - success
                  - data
                  - meta
              example:
                success: true
                data:
                  monitors:
                    - id: mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c
                      name: Competitor pricing
                      status: active
                      schedule:
                        cron: 0 9 * * 1-5
                        timezone: Europe/Athens
                        text: every weekday at 9am
                      next_run_at: '2026-10-13T06:00:00.000Z'
                      last_run_at: '2026-10-12T06:00:04.112Z'
                      current_check_id: null
                      goal: >-
                        Alert me when a plan price or its included features
                        change
                      judge_enabled: true
                      targets:
                        - id: tgt_8d1e0f2a3b4c5d6e
                          type: scrape
                          urls:
                            - https://example.com/pricing
                          scrape_options:
                            only_main_content: true
                            include_links: true
                            include_images: false
                            include_selectors: []
                            exclude_selectors: []
                          change_tracking:
                            modes:
                              - json
                            json_prompt: 'Each plan: name, monthly price, headline features'
                        - id: tgt_1a2b3c4d5e6f7a8b
                          type: crawl
                          url: https://example.com/changelog
                          crawl_options:
                            limit: 25
                            max_depth: 2
                            include_paths:
                              - ^/changelog/
                            exclude_paths: []
                            allow_subdomains: false
                            ignore_query_params: true
                            respect_robots_txt: true
                            use_sitemap: true
                            delay_ms: 0
                            concurrency: 2
                          scrape_options:
                            only_main_content: true
                            include_links: true
                            include_images: false
                            include_selectors: []
                            exclude_selectors: []
                          change_tracking:
                            modes:
                              - markdown
                      webhook:
                        url: https://you.example.org/hooks/prefetch
                        headers: {}
                        metadata:
                          env: production
                        events:
                          - monitor.page
                          - monitor.check.completed
                        secret: whsec_4f1c9e2a7b3d8e6f0a5c1b9d2e7f3a8c4b6d0e1f9a2c5b7d
                      retention_days: 30
                      estimated_credits_per_check: 55
                      estimated_credits_per_month: 1155
                      last_check_summary:
                        check_id: chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a
                        status: completed
                        finished_at: '2026-10-12T06:01:27.930Z'
                        total_pages: 19
                        same: 16
                        new: 1
                        changed: 1
                        removed: 1
                        error: 0
                      created_at: '2026-10-09T10:00:00.000Z'
                      updated_at: '2026-10-09T10:00:00.000Z'
                  total: 1
                  next: null
                meta:
                  requestId: c9a2e3f4-5b6c-4d7e-9f80-1a2b3c4d5e6f
                  durationMs: 47
        '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'
        '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:
    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
  schemas:
    MonitorListData:
      type: object
      properties:
        monitors:
          type: array
          items:
            $ref: '#/components/schemas/MonitorData'
        total:
          type: integer
        next:
          type: string
          nullable: true
          description: URL for the next page of monitors, 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
    MonitorData:
      type: object
      properties:
        id:
          type: string
          example: mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c
        name:
          type: string
        status:
          type: string
          enum:
            - active
            - paused
        schedule:
          type: object
          properties:
            cron:
              type: string
              description: >-
                The schedule the monitor runs on — always cron, whatever you
                submitted.
              example: 0 9 * * 1-5
            timezone:
              type: string
              example: Europe/Athens
            text:
              type: string
              nullable: true
              description: The phrase it was created from, if any.
              example: every weekday at 9am
        next_run_at:
          type: string
          format: date-time
          nullable: true
          description: '`null` while paused.'
        last_run_at:
          type: string
          format: date-time
          nullable: true
        current_check_id:
          type: string
          nullable: true
          description: The check running right now, if any.
        goal:
          type: string
          nullable: true
        judge_enabled:
          type: boolean
        targets:
          type: array
          items:
            $ref: '#/components/schemas/MonitorTarget'
          description: >-
            Normalised: every target has an id and every option its effective
            value.
        webhook:
          $ref: '#/components/schemas/MonitorWebhook'
        retention_days:
          type: integer
        estimated_credits_per_check:
          type: integer
          description: >-
            Upper bound: every page fetched, and judged when a goal is set. A
            real check costs less — only fetched pages are billed, and only
            changed ones judged.
        estimated_credits_per_month:
          type: integer
          description: '`estimated_credits_per_check` times the runs in an average month.'
        last_check_summary:
          allOf:
            - $ref: '#/components/schemas/MonitorSummary'
            - type: object
              properties:
                check_id:
                  type: string
                status:
                  type: string
                  enum:
                    - queued
                    - running
                    - completed
                    - failed
                    - partial
                    - skipped_overlap
                    - skipped_no_credits
                finished_at:
                  type: string
                  format: date-time
          nullable: true
          description: Counts from the most recent check, or `null` before the first one.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
          description: When the settings last changed. Checks do not touch it.
    MonitorTarget:
      oneOf:
        - $ref: '#/components/schemas/MonitorScrapeTarget'
        - $ref: '#/components/schemas/MonitorCrawlTarget'
      discriminator:
        propertyName: type
        mapping:
          scrape: '#/components/schemas/MonitorScrapeTarget'
          crawl: '#/components/schemas/MonitorCrawlTarget'
    MonitorWebhook:
      type: object
      nullable: true
      properties:
        url:
          type: string
        headers:
          type: object
          additionalProperties:
            type: string
        metadata:
          type: object
        events:
          type: array
          items:
            type: string
            enum:
              - monitor.page
              - monitor.check.completed
        secret:
          type: string
          description: Verifies the `X-Prefetch-Signature` header on every event.
          example: whsec_4f1c9e2a7b3d8e6f0a5c1b9d2e7f3a8c4b6d0e1f9a2c5b7d
    MonitorSummary:
      type: object
      properties:
        total_pages:
          type: integer
        same:
          type: integer
        new:
          type: integer
        changed:
          type: integer
        removed:
          type: integer
        error:
          type: integer
    MonitorScrapeTarget:
      type: object
      title: Scrape target
      description: >-
        Watches a fixed list of pages, each fetched the way `GET /scrape` would
        fetch it.
      required:
        - type
        - urls
      properties:
        id:
          type: string
          description: >-
            Stable target id. Generated when omitted; on update, a target
            watching the same URLs keeps its id — and its snapshots —
            automatically.
          example: tgt_8d1e0f2a3b4c5d6e
        type:
          type: string
          enum:
            - scrape
        urls:
          type: array
          items:
            type: string
          minItems: 1
          maxItems: 100
          description: The pages to watch.
          example:
            - https://example.com/pricing
        scrape_options:
          $ref: '#/components/schemas/MonitorScrapeOptions'
        change_tracking:
          $ref: '#/components/schemas/MonitorChangeTracking'
    MonitorCrawlTarget:
      type: object
      title: Crawl target
      description: >-
        Re-crawls a site on every check, so pages that appear or disappear are
        reported as well as pages that change.
      required:
        - type
        - url
      properties:
        id:
          type: string
          description: Stable target id. Generated when omitted.
          example: tgt_1a2b3c4d5e6f7a8b
        type:
          type: string
          enum:
            - crawl
        url:
          type: string
          description: Where each crawl starts.
          example: https://example.com/changelog
        crawl_options:
          $ref: '#/components/schemas/MonitorCrawlOptions'
        scrape_options:
          $ref: '#/components/schemas/MonitorScrapeOptions'
        change_tracking:
          $ref: '#/components/schemas/MonitorChangeTracking'
    MonitorScrapeOptions:
      type: object
      description: >-
        How each page is rendered before it is compared — the content-shaping
        options of `GET /scrape`.
      properties:
        only_main_content:
          type: boolean
          default: true
          description: >-
            Compare the main content only, ignoring navigation, sidebars and
            footers.
        include_links:
          type: boolean
          default: true
          description: Keep link URLs in the compared markdown.
        include_images:
          type: boolean
          default: false
          description: >-
            Keep images in the compared markdown. Off by default: image URLs
            carry cache-busting hashes that change on every deploy.
        include_selectors:
          type: array
          items:
            type: string
          description: CSS selectors to compare instead of the detected main content.
          example:
            - '#pricing'
        exclude_selectors:
          type: array
          items:
            type: string
          description: >-
            CSS selectors to leave out of the comparison — the way to silence a
            timestamp or a rotating banner.
          example:
            - .last-updated
            - .testimonial
    MonitorChangeTracking:
      type: object
      properties:
        modes:
          type: array
          items:
            type: string
            enum:
              - markdown
              - json
          default:
            - markdown
          description: >-
            `markdown` diffs the page text line by line. `json` extracts the
            fields described by `json_prompt` or `json_schema` on every check
            and diffs them field by field, so a page is `changed` only when a
            tracked field changes. Both together report `changed` when either
            surface changed.
        json_prompt:
          type: string
          description: 'For the `json` mode: the fields to track, in plain English.'
          example: 'Each plan: name, monthly price, headline features'
        json_schema:
          type: object
          description: 'For the `json` mode: a JSON Schema for the extraction.'
    MonitorCrawlOptions:
      type: object
      description: The crawl options `POST /crawl` takes, without `allow_external_links`.
      properties:
        limit:
          type: integer
          minimum: 1
          maximum: 500
          default: 25
          description: Most pages each check crawls. Every page is billed on every check.
        max_depth:
          type: integer
          minimum: 0
          maximum: 5
          default: 2
          description: How many links deep to follow from the start URL.
        include_paths:
          type: array
          items:
            type: string
          description: >-
            Regular expressions matched against a URL's path and query. A URL
            must match at least one to be monitored.
          example:
            - ^/changelog/
        exclude_paths:
          type: array
          items:
            type: string
          description: Regular expressions. A matching URL is skipped.
        allow_subdomains:
          type: boolean
          default: false
          description: Follow links onto subdomains of the start URL.
        ignore_query_params:
          type: boolean
          default: true
          description: Treat URLs that differ only by query string as one page.
        respect_robots_txt:
          type: boolean
          default: true
          description: Obey the rules in `robots.txt`.
        use_sitemap:
          type: boolean
          default: true
          description: Seed each crawl from the site's sitemap as well as from links.
        delay_ms:
          type: integer
          minimum: 0
          maximum: 30000
          default: 0
          description: Politeness delay between pages.
        concurrency:
          type: integer
          minimum: 1
          maximum: 5
          default: 2
          description: Pages fetched in parallel.
  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.