Monitor the web
Stop polling. Firecrawl watches pages on your schedule, diffs every check against the last, and sends you, or your agent, only what actually changed.
From change to event
Stop polling the web
Firecrawl does the checking on your schedule and calls your webhook the moment something is different. No polling loop, no wasted runs.
Events carry exactly what was added, removed, or changed, in text and JSON. Up to 90% fewer tokens than re-ingesting the page.
Give each monitor a goal in plain English. The AI judge scores every diff against it, so copyright years, timestamps, and rotated testimonials never trigger an alert. Only changes that match your goal get through.
Watch a single URL, a batch, or an entire site by crawl, with paths to include or exclude. New and removed pages arrive as events too.
Prefer structure over text diffs? Give your monitor a schema for the fields you care about, like a plan name and its price, and every check extracts them as structured JSON. A stable, site-specific parser means the same page always yields the same fields, so a diff is always a real value change, never extraction noise.
Watch what matters
“Alert me when any plan price changes”
“Ping my agent when the API docs change”
“Flag content changes worth re-indexing”
“Watch for price drops and new products”
“Notify me when new roles are posted”
“Track changes to terms and policies”
Monitors on the job
Start using /monitor today
# pip install firecrawl-py from firecrawl import Firecrawl app = Firecrawl(api_key ="fc-YOUR-API-KEY") monitor = app.create_monitor( name ="Stripe pricing", schedule ={"text": "every 6 hours"}, targets =[{ "type": "scrape", "urls": ["https://stripe.com/pricing"] }], goal ="Alert when pricing changes", judge_enabled =True, webhook ={ "url": "https://hooks.example.com/monitor", "events": ["monitor.page"] } )
// npm install firecrawl import { Firecrawl } from 'firecrawl'; const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' }); const monitor = await firecrawl.createMonitor({ name: 'Stripe pricing', schedule: { text: 'every 6 hours' }, targets: [{ type: 'scrape', urls: ['https://stripe.com/pricing'] }], goal: 'Alert when pricing changes', judgeEnabled: true, webhook: { url: 'https://hooks.example.com/monitor', events: ['monitor.page'] } });
curl -X POST 'https://api.firecrawl.dev/v2/monitor' \ -H 'Authorization: Bearer fc-YOUR-API-KEY' \ -H 'Content-Type: application/json' \ -d '{ "name": "Stripe pricing", "schedule": { "text": "every 6 hours" }, "targets": [{ "type": "scrape", "urls": ["https://stripe.com/pricing"] }], "goal": "Alert when pricing changes", "judgeEnabled": true, "webhook": { "url": "https://hooks.example.com/monitor" } }'
# Install and authenticate (one-time) npm install -g firecrawl-cli firecrawl login --api-key fc-YOUR-API-KEY # Watch a page and get notified on change firecrawl monitor create \ --name "Stripe pricing" \ --page https://stripe.com/pricing \ --schedule "every 6 hours" \ --goal "Alert when pricing changes" \ --webhook-url https://hooks.example.com/monitor \ --email alerts@example.com
{
"success": true,
"type": "monitor.page",
"data": {
"monitorId": "019df960-06e7-7383",
"url": "https://stripe.com/pricing",
"status": "changed",
"diff": {
"text": "- Pro plan $20/mo\n+ Pro plan $25/mo"
},
"judgment": {
"meaningful": true,
"confidence": "high",
"reason": "Pro plan price increased"
}
},
"metadata": {
"monitorName": "Stripe pricing"
}
}