# Monitors

A monitor loads a page in a real browser on a schedule, compares what it shows with last time, and tells you what changed — by webhook, by email, and in its history. Prices, stock, terms of service, job boards, competitors' pages. Monitors come with every [paid plan](https://cdpfleet.com/upgrade).

```sh
curl -s https://cdpfleet.com/v1/monitors -H "x-api-key: $CDPFLEET_API_KEY" -H "content-type: application/json" \
  -d '{"url":"https://books.toscrape.com/","every":"1h","selector":".product_pod","ignore":["\\d{2}:\\d{2}"],
       "deliver":{"webhook":{"url":"https://example.com/hooks/cdpfleet"},"email":true}}'
```

## Fields

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `url` | string | required | A public http(s) page. |
| `every / cron` | string | one is required | `"15m"`, `"2h"`, `"1d"`, `"1w"`, or a 5-field cron in UTC (`"0 9 * * 1-5"`). Shortest: 5 minutes on dedicated plans, 15 on shared. |
| `format` | string | `"markdown"` | What is compared: `"markdown"`, `"text"` or `"html"`. |
| `selector` | string | whole page | Compare only this element. |
| `remove` | string\[\] | none | Elements dropped first (ads, "related" boxes, cookie banners). |
| `ignore` | string\[\] | none | Regular expressions removed from the text before comparing — dates, counters, rotating tokens. |
| `country, proxy, wait_for, actions, max_wait` | — | as in scrape | How each check loads the page — see [scrape](https://cdpfleet.com/docs/functions/scrape). |
| `deliver` | object | history only | `{"webhook": {"url": "https://…"}, "email": true}`. |
| `active` | boolean | `true` | `false` pauses it. |

Whitespace is normalised and empty lines dropped before comparing, so reflowed text isn't a change. The first check stores a baseline; later checks report a change only when the compared text differs.

## API

-   `POST /v1/monitors` · `GET /v1/monitors` · `GET` / `PATCH` / `DELETE /v1/monitors/{id}` — the monitor shows `last_status` (`baseline`, `unchanged`, `changed`, `error`), `last_error`, `next_run_at`, `checks` and `changes`.
-   `POST /v1/monitors/{id}/run` — check now.
-   `GET /v1/monitors/{id}/changes` — the changes, newest first (`?cursor=` from `next_cursor`); `GET /v1/monitors/{id}/changes/{change_id}` — the full diff and links to the text before and after.

## On a change

Webhooks are signed like [job webhooks](https://cdpfleet.com/docs/jobs#webhooks) (your `whsec_…` secret) and retried on failure — [verifying them in five languages](https://cdpfleet.com/docs/webhooks):

```
{"type": "monitor.change", "created_at": "…", "data": {
  "monitor_id": "…", "change_id": "…", "url": "https://books.toscrape.com/", "at": "…",
  "added": 2, "removed": 1,
  "diff": "--- before\n+++ after\n@@ -1,3 +1,4 @@\n …",
  "snapshot_url": "https://…/after.txt"}}
```

After three failed checks in a row you get one `monitor.error` (and an email if you asked for email); the monitor keeps trying at its interval.

## Billing and limits

Each check is one function call on your plan: it holds a thread while the page loads (a few seconds) and uses browser-minutes for that time. Up to 100 monitors per thread of your plan. History keeps 30 days of changes and the last 10 snapshots.

---
Source: https://cdpfleet.com/docs/monitors · Markdown: https://cdpfleet.com/docs/monitors.md · All docs for AI tools: https://cdpfleet.com/llms.txt
