# Page monitoring

> Watch known URLs and get alerted on meaningful page changes

import CreateScrapeCURL from "/snippets/v2/monitor/create/scrape/curl.mdx";
import CreateScrapeNode from "/snippets/v2/monitor/create/scrape/js.mdx";
import CreateScrapePython from "/snippets/v2/monitor/create/scrape/python.mdx";
import TargetScrape from "/snippets/v2/monitor/target/scrape.mdx";

Page monitoring watches URLs you already know about. Each check scrapes every URL in the target, diffs it against the last retained snapshot, and reports whether the page is `same`, `changed`, `new`, `removed`, or `error`. It's the right choice for pricing pages, changelogs, docs pages, job posts, status pages, or any known URL where a small change matters.

This page covers the `scrape` target. Scheduling, goals and judging, change tracking, notifications, and pricing are shared across all monitor types. See the [Monitoring overview](/features/monitoring).

## Create a page monitor

Create a monitor with a `scrape` target that lists one or more explicit URLs:

<CodeGroup>
  <CreateScrapePython />
  <CreateScrapeNode />
  <CreateScrapeCURL />
</CodeGroup>

You can also create monitors from the Firecrawl CLI:

```bash CLI
firecrawl monitor create --name "Hacker News AI" \
  --schedule "every 30 minutes" \
  --goal "Alert when a new Hacker News story related to AI enters the top 10. Ignore changes to stories that are not about AI. Do not alert on changes outside the top 10." \
  --page https://news.ycombinator.com
```

## Scrape target

A `scrape` target requires `type` and a `urls` array with at least one URL. Scrape options are passed through to the underlying scrape jobs. Monitor-triggered scrapes default `maxAge` to `0`, so each check performs a fresh scrape unless you explicitly set a different `maxAge`.

<TargetScrape />

## Detecting field-level changes

By default a page monitor diffs the page's markdown. To alert only when a **specific field** changes, such as a price, a headline, an in-stock flag, or the items in a list, add a `changeTracking` format to the target's `scrapeOptions`. See [Change tracking](/features/monitoring#change-tracking) for JSON mode and mixed mode.

## Shared configuration

- [Schedules](/features/monitoring#schedules): cron or natural-language cadence, minimum 5 minutes.
- [Goals and judging](/features/monitoring#goals-and-judging): alert only on meaningful changes.
- [Notifications](/features/monitoring#notifications): webhook and email delivery.
- [Check results](/features/monitoring#check-results): inspect each check and its per-page diffs.
- [Pricing](/features/monitoring#pricing): 1 credit per URL per check, plus optional judging.
