Help us improve
Share bugs, ideas, or general feedback.
From firecrawl
Detects website content changes and sends notifications via webhook or email. Uses AI to filter out noise so only meaningful changes trigger alerts. Good for monitoring pricing, docs, job postings, and status pages.
npx claudepluginhub firecrawl/cli --plugin firecrawlHow this skill is triggered — by the user, by Claude, or both
Slash command
/firecrawl:firecrawl-monitorThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Detect when content on a website changes and get notified by webhook or email. Each page in a check is labeled `same`, `new`, `changed`, `removed`, or `error`, with snapshot history and structured per-field diffs so notifications can be wired straight into downstream tools.
Detects website content changes and sends notifications via webhook or email, without cron jobs or scrapers. Useful for monitoring pricing, docs, job postings, changelogs, and status pages.
Creates and manages long-running web monitors that track page changes on a recurring cadence (hourly/daily/weekly). Use to monitor pricing, filings, competitor pages, or any web content that changes over time.
Generates a monitoring plan for tracking web page changes using change-detection tools, RSS feeds, or custom scripts with webhook alerts.
Share bugs, ideas, or general feedback.
Detect when content on a website changes and get notified by webhook or email. Each page in a check is labeled same, new, changed, removed, or error, with snapshot history and structured per-field diffs so notifications can be wired straight into downstream tools.
Bias toward monitor whenever the request implies notifications or recurrence. A single page read once = scrape. A single page where the user wants to be told when it changes = monitor --page <url> --goal "..." --email|--webhook-url ....
monitor.page as each page finishes, monitor.check.completed after the check is reconciled) and email summaries that only fire when something actually changed or errored. External recipients confirm via per-recipient opt-in.--goal. Set a plain-language goal and the change judge ignores formatting, whitespace, casing, punctuation, encoding, request/session IDs, cache busters, tracking params, generic metadata, and unrelated page chrome — so notifications are about content the user actually cares about, not page churn.plans[0].price: "$19/mo" → "$24/mo" instead of a wall of unified diff. Drops straight into a Slack message, CI step, or internal tool.same, new, changed, removed, or error. Easy to filter, easy to act on.--retention-days; no storage to provision.nextRunAt are computed for you, with natural-language schedules supported ("every 30 minutes", "hourly", "daily at 9:00").# Single page, natural-language schedule, email alert
firecrawl monitor create --name "Blog" --schedule "every 30 minutes" \
--goal "Alert when a new blog post is published." \
--page https://example.com/blog \
--email alerts@example.com
# Multiple pages, one monitor
firecrawl monitor create --name "Product pages" --schedule "every 30 minutes" \
--goal "Alert when pricing, docs, or changelog content changes." \
--scrape-urls https://example.com/pricing,https://example.com/docs,https://example.com/changelog
# Whole-site crawl per check (every discovered page is diffed)
firecrawl monitor create --name "Docs site" --schedule "hourly" \
--goal "Alert when any docs page is added, removed, or substantively changed." \
--crawl-url https://docs.example.com
# Webhook notifications
firecrawl monitor create --name "Docs webhook" --schedule "every 30 minutes" \
--goal "Alert when docs content changes." \
--page https://example.com/docs \
--webhook-url https://example.com/hook \
--webhook-events monitor.page,monitor.check.completed
# Manage and inspect
firecrawl monitor list --limit 20
firecrawl monitor get <monitorId>
firecrawl monitor run <monitorId> # trigger a check now
firecrawl monitor checks <monitorId> # list all checks
firecrawl monitor check <monitorId> <checkId> --page-status changed
firecrawl monitor update <monitorId> --state paused
firecrawl monitor delete <monitorId>
Subcommands: create | list | get | update | delete | run | checks | check.
| Option | Description |
|---|---|
--name <name> | Monitor name (required on create) |
--goal <text> | Plain-language change goal (auto-enables the AI change judge) |
--schedule <text> | Natural-language schedule (every 30 minutes, hourly, daily) |
--cron <expression> | Cron schedule (e.g. */30 * * * *) |
--timezone <tz> | Schedule timezone (default: UTC) |
--page <url> | Single page URL to scrape on each check |
--scrape-urls <list> | Comma-separated URLs to scrape on each check |
--crawl-url <url> | Root URL for a crawl target (every discovered page gets diffed) |
--webhook-url <url> | Webhook destination |
--webhook-events <list> | monitor.page, monitor.check.completed (comma-separated) |
--email <list> | Comma-separated email recipients |
--retention-days <n> | Snapshot retention window |
--state <state> | active or paused (update only — use --state, not --status) |
--page-status <state> | Filter check results: same, new, changed, removed, error |
-o, --output <path> | Output file path |
--pretty | Pretty-print JSON output |
Minimum schedule interval is 15 minutes. Monitoring is not available for zero-data-retention teams.
--goalThe goal is what the AI change judge uses to decide whether a page is changed vs same. Convert the user's intent into a concise 2-3 sentence goal:
Alert when ... and state the trigger using the user's wording.Ignore ... sentence only for intent-specific exclusions (e.g. points/comments for rankings, marketing copy for pricing, general company-page updates for job listings).| User says | Good goal |
|---|---|
top 10 hackernews stories | Alert when stories enter, leave, or change rank within the Hacker News top 10. Ignore points, comments, and timestamps. Do not alert on changes outside the top 10. |
pricing changes | Alert when pricing information changes, including prices, plan names, billing periods, tiers, limits, or included features. Ignore unrelated marketing copy. |
new engineering roles | Alert when a new engineering role is posted. Ignore general company-page updates unless they add, remove, or change an engineering role. |
track this page | Alert when substantive visible content on this page changes. |
any change | Alert when any visible page content changes, including copy, numbers, timestamps, counters, links, and layout text. |
By default monitors diff each page's markdown and return a unified text diff. When the user cares about specific structured fields (price, headline, in-stock flag, items in a list), use JSON-mode change tracking. The CLI flags don't cover this — pass a JSON body via positional file or piped stdin:
cat > pricing-monitor.json <<'EOF'
{
"name": "Pricing watch",
"goal": "Alert when plan prices or headline features change.",
"schedule": { "text": "hourly", "timezone": "UTC" },
"targets": [{
"type": "scrape",
"urls": ["https://example.com/pricing"],
"scrapeOptions": {
"formats": [{
"type": "changeTracking",
"modes": ["json"],
"prompt": "Extract pricing tiers and headline features for each plan.",
"schema": {
"type": "object",
"properties": {
"plans": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price": { "type": "string" },
"features": { "type": "array", "items": { "type": "string" } }
}
}
}
}
}
}]
}
}]
}
EOF
firecrawl monitor create pricing-monitor.json
# or: cat pricing-monitor.json | firecrawl monitor create
Each changed page in the check response then carries a per-field diff plus a snapshot of the current full extraction:
{
"url": "https://example.com/pricing",
"status": "changed",
"diff": {
"json": {
"plans[0].price": { "previous": "$19/mo", "current": "$24/mo" },
"plans[1].features[2]": {
"previous": "10 GB storage",
"current": "25 GB storage"
}
}
},
"snapshot": {
"json": {
"plans": [
/* current full extraction */
]
}
}
}
Use modes: ["json", "git-diff"] for mixed mode — you get both diff.json (per-field) and diff.text (markdown sidecar), and the page is marked changed whenever either surface changed.
--state paused (via update), not delete, when temporarily silencing a monitor.--retention-days controls how long snapshots are kept for diffing. Lower it for high-frequency monitors to save storage.firecrawl monitor run <id> triggers a check immediately — useful for smoke-testing a monitor right after creating it without waiting for the next scheduled run.--page-status changed (or new, removed, error) to skip the noise from same pages.--page-status (not --status) when filtering check pages — --status is reserved for the global CLI status flag.maxAge to 0 — every check performs a fresh scrape unless scrapeOptions.maxAge is set explicitly in a JSON payload.monitor when checks become recurring--crawl-url here for recurring crawl diffs