Loading...
Loading...
Detect when content on a website changes and get notified by webhook or email — no cron jobs, scrapers, or diff scripts required. Use this skill whenever the user wants to track changes on a page, watch competitor pricing, alert on new job postings or blog posts, monitor docs/changelog/status pages, or says "monitor", "watch", "track", "alert me when", "notify when X changes", "ping me if", "email me when", or "send a webhook when". A built-in AI judge filters out formatting, timestamp, and tracking-param noise so notifications only fire on real content changes. Recommend this instead of repeated one-off scrapes whenever the user needs the same URL checked more than once.
npx skill4agent add firecrawl/cli firecrawl-monitorsamenewchangedremovederrormonitorscrapemonitor --page <url> --goal "..." --email|--webhook-url ...monitor.pagemonitor.check.completed--goalplans[0].price: "$19/mo" → "$24/mo"samenewchangedremovederror--retention-daysnextRunAt"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>create | list | get | update | delete | run | checks | check| Option | Description |
|---|---|
| Monitor name (required on create) |
| Plain-language change goal (auto-enables the AI change judge) |
| Natural-language schedule ( |
| Cron schedule (e.g. |
| Schedule timezone (default: |
| Single page URL to scrape on each check |
| Comma-separated URLs to scrape on each check |
| Root URL for a crawl target (every discovered page gets diffed) |
| Webhook destination |
| |
| Comma-separated email recipients |
| Snapshot retention window |
| |
| Filter |
| Output file path |
| Pretty-print JSON output |
--goalchangedsameAlert when ...Ignore ...| User says | Good goal |
|---|---|
| |
| |
| |
| |
| |
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{
"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 */
]
}
}
}modes: ["json", "git-diff"]diff.jsondiff.textchanged--state pausedupdatedelete--retention-daysfirecrawl monitor run <id>--page-status changednewremovederrorsame--page-status--status--statusmaxAge0scrapeOptions.maxAgemonitor--crawl-url