Skip to main content
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.

Create a page monitor

Create a monitor with a scrape target that lists one or more explicit URLs:
from firecrawl import Firecrawl

firecrawl = Firecrawl(
  # Monitor endpoints require an API key:
  api_key="fc-YOUR-API-KEY",
)

monitor = firecrawl.create_monitor(
    name="Hacker News AI monitor",
    schedule={"text": "every 30 minutes", "timezone": "UTC"},
    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."
    ),
    targets=[
        {
            "type": "scrape",
            "urls": ["https://news.ycombinator.com"],
        }
    ],
    notification={
        "email": {
            "enabled": True,
            "recipients": ["alerts@example.com"],
            "includeDiffs": True,
        }
    },
)

print(monitor.id)
You can also create monitors from the Firecrawl CLI:
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.
Scrape target
{
  "type": "scrape",
  "urls": ["https://example.com/pricing"],
  "scrapeOptions": {
    "formats": ["markdown"],
    "maxAge": 0
  }
}

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 for JSON mode and mixed mode.

Shared configuration