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.
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. |
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 showslast_status(baseline,unchanged,changed,error),last_error,next_run_at,checksandchanges.POST /v1/monitors/{id}/run— check now.GET /v1/monitors/{id}/changes— the changes, newest first (?cursor=fromnext_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 (your whsec_… secret) and retried on failure — verifying them in five languages:
{"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.