
changeTracking to your formats array to detect whether a page is new, unchanged, or modified, and optionally get a structured diff of what changed.
- Works with
/scrape,/crawl, and/batch/scrape - Two diff modes:
git-difffor line-level changes,jsonfor field-level comparison - Scoped to your team, and optionally scoped to a tag that you pass in
How it works
Every scrape withchangeTracking enabled stores a snapshot and compares it against the previous snapshot for that URL. Snapshots are stored persistently and do not expire, so comparisons remain accurate regardless of how much time has passed between scrapes.
The response includes these fields in the
changeTracking object:
Basic usage
Include bothmarkdown and changeTracking in the formats array. The markdown format is required because change tracking compares pages via their markdown content.
Response
On the first scrape,changeStatus is "new" and previousScrapeAt is null:
changeStatus reflects whether content changed:
Git-diff mode
Thegit-diff mode returns line-by-line changes in a format similar to git diff. Pass an object in the formats array with modes: ["git-diff"]:
Response
Thediff object contains both a plain-text diff and a structured JSON representation:
diff.json object contains:
files: array of changed files (typically one for web pages)chunks: sections of changes within a filechanges: individual line changes withtype("add","del", or"normal"), line number (ln), andcontent
JSON mode
Thejson mode extracts specific fields from both the current and previous version of the page using a schema you define. This is useful for tracking changes in structured data like prices, stock levels, or metadata without parsing a full diff.
Pass modes: ["json"] with a schema defining the fields to extract:
Response
Each field in the schema is returned withprevious and current values:
prompt to guide the LLM extraction alongside the schema.
JSON mode uses LLM extraction and costs 5 credits per page. Basic change tracking and
git-diff mode have no additional cost.Using tags
By default, change tracking compares against the most recent scrape of the same URL scraped by your team. Tags let you maintain separate tracking histories for the same URL, which is useful when you monitor the same page at different intervals or in different contexts.Crawl with change tracking
Add change tracking to crawl operations to monitor an entire site for changes. Pass thechangeTracking format inside scrapeOptions:
Batch scrape with change tracking
Use batch scrape to monitor a specific set of URLs:Scheduling change tracking
Change tracking is most useful when you scrape on a regular schedule. You can automate this with cron, cloud schedulers, or workflow tools.Cron job
Create a script that scrapes a URL and alerts on changes:check-pricing.sh
crontab -e:
Cloud and serverless schedulers
- AWS: EventBridge rule triggering a Lambda function
- GCP: Cloud Scheduler triggering a Cloud Function
- Vercel / Netlify: Cron-triggered serverless functions
- GitHub Actions: Scheduled workflows with
scheduleandcrontrigger
Workflow automation
No-code platforms like n8n, Zapier, and Make can call the Firecrawl API on a schedule and route results to Slack, email, or databases. See the workflow automation guides.Webhooks
For async operations like crawl and batch scrape, use webhooks to receive change tracking results as they arrive instead of polling.crawl.page event payload includes the changeTracking object for each page:
Configuration reference
The full set of options available when passing achangeTracking format object:
Data models
Important details
- Snapshot retention: Snapshots are stored persistently and do not expire. A scrape performed months after the previous one will still compare correctly against the earlier snapshot.
- Scoping: Comparisons are scoped to your team. Your first scrape of any URL returns
"new", even if other users have scraped it. - URL matching: Previous scrapes are matched on exact source URL, team ID,
markdownformat, andtag. Keep URLs consistent between scrapes. - Parameter consistency: Using different
includeTags,excludeTags, oronlyMainContentsettings across scrapes of the same URL produces unreliable comparisons. - Comparison algorithm: The algorithm is resistant to whitespace and content order changes. Iframe source URLs are ignored to handle captcha/antibot randomization.
- Caching: Requests with
changeTrackingbypass the index cache. ThemaxAgeparameter is ignored. - Error handling: Monitor the
warningfield in responses and handle thechangeTrackingobject potentially being absent (this can occur if the database lookup for the previous scrape times out).
Billing
Are you an AI agent that needs a Firecrawl API key? See firecrawl.dev/agent-onboarding/SKILL.md for automated onboarding instructions.

