[cdpfleet](https://cdpfleet.com/) / Monitoring

For price, stock and uptime watching

# Check the page *the way a visitor sees it*.

Load the page in a real browser, read the price, the stock line or the button that must be there, and compare it with last time. Sessions are billed per second, so a check costs seconds, not an hour of a server.

[Case: a price watch](https://cdpfleet.com/docs/cases/price-watch)[Start free](https://cdpfleet.com/community)

-   **~15 s**billed for a two-snapshot watch (case 50)
-   **120**free browser-minutes a day on Community
-   **per second**billing

## Or let cdpfleet run the checks: Monitors

No program or scheduler of your own: a [monitor](https://cdpfleet.com/docs/monitors) loads the page in a real browser on a schedule, compares what it shows with last time and tells you what changed.

-   **A schedule:** every 15 minutes or more on shared plans (5 on dedicated), up to weekly — or a cron expression in UTC.
-   **What counts as a change:** the page's Markdown, text or HTML — the whole page or one element (`selector`), with `remove` for banners and `ignore` regular expressions for dates and counters; whitespace is normalised first.
-   **Told how you like:** a signed `monitor.change` webhook with the diff, an email, and 30 days of history; three failed checks in a row send one `monitor.error`.
-   **Billed per check:** each check is one function call — a few seconds of a thread. Paid plans, up to 100 monitors per thread.
-   **Changes as they happen:** a [watch job](https://cdpfleet.com/docs/jobs#watch) stays on a page and streams its XHR and fetch calls, WebSocket messages and changes to an element over SSE and webhooks — for prices, scores or order books that move every second.

## Pay for the reading, not the waiting

-   **Short sessions:** launch, read, close. Two snapshots of a watch that took more than two minutes billed about 15 seconds of browser time; keeping one browser open in between would have billed every second ([case 50](https://cdpfleet.com/docs/cases/price-watch)).
-   **Small watches fit the free plan:** Community has 2 threads with 60 browser-minutes each a day and a proxy included. Sessions last up to 15 minutes, which is plenty for a check ([Community plan](https://cdpfleet.com/community)).
-   **Run it from your scheduler:** cron, a CI schedule or a queue starts the same program; keep the last snapshot in a file or a database row. For many URLs, read them in one session per round, or in parallel sessions up to your threads ([case 10](https://cdpfleet.com/docs/cases/worker-pool)).
-   **Cap every check:** `overall_timeout` ends a stuck check on time, so a hung page can't burn minutes ([overall\_timeout](https://cdpfleet.com/docs/options/overall_timeout)).

```js
// One check: read the fields, compare, alert only on what changed.
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'domcontentloaded' });
const now = {
  price: await page.locator('.price_color').first().innerText(),
  stock: (await page.locator('.availability').first().innerText()).trim(),
};
const changed = Object.keys(now).filter((k) => now[k] !== last[k]);
if (changed.length) await alert(changed.map((k) => `${k}: ${last[k]} → ${now[k]}`));
await browser.close(); // ends the session and its billing
```

## What to compare

-   **Fields, not pages:** comparing whole pages flags every rotating ad and timestamp. Read the price, the stock text or the element you care about and diff those ([case 50](https://cdpfleet.com/docs/cases/price-watch)).
-   **Validate at the source:** parse each price to a number and fail the run when a field is missing, so a layout change shows up on day one instead of as silent nonsense ([case 28](https://cdpfleet.com/docs/cases/structured-extraction)).
-   **Visual checks:** a screenshot of one element is a fraction of a full-page one and makes a steady baseline; PDFs work on the Chromium-based browsers ([case 29](https://cdpfleet.com/docs/cases/screenshot-and-pdf)).
-   **Prices by country:** a country-pinned residential exit shows the price that market sees ([geo testing](https://cdpfleet.com/geo-testing)).

## When a check fails

-   **Watch the video:** headful sessions are recorded by default. A failed scrape was explained by its recording — the browser was on the last page, not facing a broken selector ([case 41](https://cdpfleet.com/docs/cases/replay-a-failed-run), [recordings](https://cdpfleet.com/recordings)).
-   **Back off when a site pushes back:** honour `Retry-After` and move to another exit; the crawler that retried at once was challenged ([case 53](https://cdpfleet.com/docs/cases/soft-block-backoff)).
-   **At your thread cap:** a launch gets `429 threads_exceeded`; the SDKs wait and retry for you ([case 76](https://cdpfleet.com/docs/cases/sdk-vs-plain-playwright)).

## Long-running watches

-   **Keep one browser for hours** on dedicated threads with `keep_alive`: your monitor can restart and reconnect to the same browser; pages and storage in its default context are still there ([keep\_alive](https://cdpfleet.com/docs/options/keep_alive), [dedicated threads](https://cdpfleet.com/dedicated-threads)).
-   **Logged-in pages:** keep the login in a [persistent profile](https://cdpfleet.com/profiles) on a paid plan instead of signing in on every check.

## Related

Cases, recipes, posts and comparisons about this — updated as new ones are published.

### Reference docs

The details, options and errors.

-   [Sessions & billing](https://cdpfleet.com/docs/sessions)Thread-seconds, timeouts and limits.
-   [overall\_timeout](https://cdpfleet.com/docs/options/overall_timeout)A hard time budget per check.
-   [Session recording](https://cdpfleet.com/docs/recordings)The video of every headful session.
-   [Monitoring examples](https://cdpfleet.com/docs/cases#for-monitoring)Examples and benchmarks for this use, filtered.

### Cases 5

Real problems solved end to end, run on production in five languages.

-   [Case 89: Watch a page live: its XHR calls, DOM changes and WebSocket messages over SSE and a signed webhook](https://cdpfleet.com/docs/cases/watch-a-page-live)Keep a Chrome of yours on a page that updates itself (the ISS position, polled about once a second), and get every matching XHR response and every change to one…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/89-watch-a-page-live)
-   [Case 88: A monitor end to end: create it, trigger a change, verify the signed webhook, read the diff and history](https://cdpfleet.com/docs/cases/monitor-end-to-end)Watch one element of a page that changes on every load, trigger checks with `POST …/run`, receive the `monitor.change` webhook and verify its HMAC signature, check…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/88-monitor-end-to-end)
-   [Case 53: Surviving a soft block: honour Retry-After, then move to another exit without losing the login](https://cdpfleet.com/docs/cases/soft-block-backoff)Two crawlers against the same rate-limited site. The one that retries a 429 straight away is challenged and gets 3 of 8 pages. The one that waits as told and moves…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/53-soft-block-backoff)
-   [Case 50: A price watcher in one program: two snapshots minutes apart, diffed, billed only while reading](https://cdpfleet.com/docs/cases/price-watch)Take a snapshot of a catalogue price and a live market price, wait two minutes, take another and diff them field by field. Each snapshot is its own short session, so…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/50-price-watch)
-   [Case 29: Visual capture: full-page screenshot, element crop and PDF in one session](https://cdpfleet.com/docs/cases/screenshot-and-pdf)Four captures from one page load — viewport, full page, a single element and a PDF — rendered in the remote browser and saved on your machine, with their sizes and…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/29-screenshot-and-pdf)

## Read next

[Community plan →](https://cdpfleet.com/community)[Web scraping →](https://cdpfleet.com/web-scraping)[Recordings →](https://cdpfleet.com/recordings)[Geo testing →](https://cdpfleet.com/geo-testing)

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