Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/firecrawl-monitor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | -31% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -8% | 0% |
Detect when content on a website changes and get notified by webhook or email. Firecrawl handles fetching, diffing, judging, and notifying server-side. Each page in a check is labeled same, new, changed, removed, or error.
Pick a target mode by what you're watching:
| Mode | Flags | Watches | | ----------- | ------------------------------ | ------------------------------------------------------ | | Single page | --page <url> | one URL, for changes | | URL batch | --scrape-urls <url,url,...> | several URLs, for changes | | Whole site | --crawl-url <root-url> | every page a crawl discovers, for changes | | Web search | --queries <q,...> + --goal | the whole web, for _new_ results matching the goal |
The first three watch URLs you already have. Web search runs your queries each check and alerts on results it hasn't seen before (labeled new once, same on later checks); --goal is required with --queries.
bash# 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 # Web monitor — search the whole web for NEW results matching a goal firecrawl monitor create --name "Competitor launches" --schedule "daily at 9:00" \ --queries "competitor product launch,competitor funding round" \ --goal "Alert when a competitor announces a new product or raises funding." \ --search-window 7d --max-results 20 \ --email alerts@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. Run firecrawl monitor <subcommand> --help for the full option list.
Done when: create returns a monitor ID and a smoke-test run + check confirms the expected target, state, and notification configuration.
Read goals.md when writing or refining --goal (and --queries for web monitors). Read json-tracking.md when the user cares about specific structured fields (price, headline, stock flag) and wants per-field diffs.
update --state paused; reserve delete for monitors that are permanently done. (--state is an update flag; --status is the global CLI status flag.)--page-status changed (or new, removed, error) to skip the noise from same pages.firecrawl monitor run <id> triggers a check immediately — useful for smoke-testing a monitor right after creating it.--retention-days controls how long snapshots are kept for diffing. Lower it for high-frequency monitors to save storage.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| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | pass→pass | 17,556 | 9,704 | -45% | 1 | 1 | 0% | 2,041 | 2,030 | -1% | 0 | 0 | — |
case-10 | fail→pass | 21,443 | 9,686 | -55% | 1 | 1 | 0% | 2,685 | 1,857 | -31% | 0 | 0 | — |
case-01 | fail→pass | 16,223 | 8,707 | -46% | 1 | 1 | 0% | 1,602 | 1,947 | +22% | 0 | 0 | — |
case-02 | fail→pass | 21,381 | 11,342 | -47% | 1 | 1 | 0% | 2,277 | 2,184 | -4% | 0 | 0 | — |
case-03 | fail→fail | 16,950 | 8,393 | -50% | 1 | 1 | 0% | 1,993 | 1,823 | -9% | 0 | 0 | — |
case-04 | fail→pass | 20,833 | 11,018 | -47% | 1 | 1 | 0% | 2,909 | 2,201 | -24% | 0 | 0 | — |
case-05 | fail→pass | 19,676 | 10,991 | -44% | 1 | 1 | 0% | 2,542 | 2,346 | -8% | 0 | 0 | — |
case-06 | fail→pass | 20,996 | 10,607 | -49% | 1 | 1 | 0% | 2,285 | 2,312 | +1% | 0 | 0 | — |
case-07 | fail→pass | 18,116 | 8,655 | -52% | 1 | 1 | 0% | 1,978 | 1,799 | -9% | 0 | 0 | — |
case-08 | pass→pass | 18,053 | 8,379 | -54% | 1 | 1 | 0% | 2,014 | 1,689 | -16% | 0 | 0 | — |
case-09 | pass→pass | 19,587 | 10,756 | -45% | 1 | 1 | 0% | 2,531 | 1,988 | -21% | 0 | 0 | — |
case-12 | fail→pass | 38,189 | 7,424 | -81% | 1 | 1 | 0% | 5,836 | 1,579 | -73% | 0 | 0 | — |
case-13 | pass→pass | 32,540 | 7,901 | -76% | 1 | 1 | 0% | 4,836 | 1,759 | -64% | 0 | 0 | — |
case-14 | fail→pass | 22,276 | 7,568 | -66% | 1 | 1 | 0% | 3,110 | 1,567 | -50% | 0 | 0 | — |
case-15 | fail→pass | 13,319 | 3,193 | -76% | 1 | 1 | 0% | 2,185 | 1,682 | -23% | 0 | 0 | — |
case-16 | pass→pass | 10,949 | 7,519 | -31% | 1 | 1 | 0% | 2,017 | 1,493 | -26% | 0 | 0 | — |
case-17 | pass→pass | 11,763 | 9,570 | -19% | 1 | 1 | 0% | 1,954 | 1,865 | -5% | 0 | 0 | — |
case-18 | fail→pass | 10,260 | 5,587 | -46% | 1 | 1 | 0% | 1,800 | 2,289 | +27% | 0 | 0 | — |
case-19 | fail→pass | 14,867 | 2,166 | -85% | 1 | 1 | 0% | 2,094 | 1,568 | -25% | 0 | 0 | — |
case-20 | pass→pass | 10,952 | 6,197 | -43% | 1 | 1 | 0% | 1,639 | 2,288 | +40% | 0 | 0 | — |
case-21 | pass→pass | 14,790 | 2,807 | -81% | 1 | 1 | 0% | 1,683 | 1,646 | -2% | 0 | 0 | — |
case-22 | pass→pass | 16,340 | 8,678 | -47% | 1 | 1 | 0% | 1,860 | 1,832 | -2% | 0 | 0 | — |
case-23 | fail→pass | 43,176 | 19,093 | -56% | 1 | 1 | 0% | 2,534 | 3,055 | +21% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +57 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/23/2026 | +73% |
| gemini-3.6-flash | verified | 8/2/2026 | +74% |
| gemini-3.6-flash | verified | 7/24/2026 | +75% |
Other measured skills in the registry, with their headline benchmark lift.