Web and domains
Sitemap Monitor: Track New, Removed and Changed Pages
A site's sitemaps list every page it wants indexed, with last-modified dates. This Actor reads them, keeps a snapshot per site, and on each run reports which pages appeared, disappeared, changed their lastmod date or changed their content.
Website Change Monitor — Sitemap Monitor & Page Diff. Pay per result; see the Store page for current pricing.
The source and its limits
The Actor follows robots.txt Sitemap: lines, sitemap indexes, and plain, gzipped and text sitemaps, falling back to /sitemap.xml and /sitemap_index.xml. That is the sitemaps protocol sites already publish for search engines.
- Discover mode lists every page URL with
lastmod,changefreqandpriority. - Monitor mode keeps a snapshot per site and emits one record per change:
new-url,removed-url,lastmod-changed,content-changedandstatus-changed.
Content changes are detected without a browser. Each HTML page is scoped to a CSS selector (main, article, body by default), stripped of scripts, styles and whitespace noise, optionally stripped of numbers and dates, and hashed. A changed page gets a word-level preview of what was added and removed, and a severity of low, medium or high with a reason.
Limits worth knowing
- Only pages listed in the sitemaps are tracked.
maxPagescuts the list in sitemap order. In monitor mode set it above the site's page count, or the tail of the sitemap will look removed.- Pages are fetched as plain HTML (up to 1 MB, 20-second timeout), at about two requests per second per host, and
robots.txtDisallow rules are honored. JavaScript-rendered content is not executed. - The first monitor run is a baseline: every page becomes a
baselinerecord and changes appear from the second run on.
Fields you get
| Field | What it holds |
|---|---|
changeType | discovered, baseline, new-url, removed-url, lastmod-changed, content-changed, status-changed or error |
url, site, sitemapUrl | The page, the input site and the sitemap it came from |
lastmod, changefreq, priority | As listed in the sitemap |
status, title, contentHash | HTTP status, page title and the content hash |
changedFields | Every field that changed when several changed at once |
changedPreview | Added and removed word counts, previews and a similarity ratio |
severity, severityReason | low, medium or high, with a one-phrase reason |
before, after | Previous and current page snapshots |
Example output
A content-changed record from a monitor run (shape from the Actor's README; values illustrative, snapshots omitted):
{
"changeType": "content-changed",
"site": "https://example.com",
"url": "https://example.com/pricing",
"changedFields": [
"contentHash",
"lastmod"
],
"title": "Pricing — Example",
"lastmod": "2026-10-16",
"status": 200,
"contentHash": "3f9a1c…",
"changedPreview": {
"addedWords": 3,
"removedWords": 1,
"addedPreview": "SSO now included",
"removedPreview": "Add-on",
"similarity": 0.94,
"changedRatio": 0.06,
"numbersChanged": false
},
"severity": "low",
"severityReason": "6% of the text changed",
"detectedAt": "2026-10-16T12:00:09.000Z"
}
Use cases
New pages on a competitor's site
Monitor with checkContent: false for a lighter, sitemap-only diff that reports new and removed URLs.
Documentation or policy page changes
Narrow with includePatterns and a contentSelector such as main, and get content-changed records with a diff preview.
Full URL inventory
Discover mode lists every URL in a site's sitemaps with its last-modified date, for SEO audits or crawl planning.
How to run it
You need an Apify account and its API token (Console → Settings → API & Integrations). Each run is billed per result to your account; set a maximum total charge for the run to cap spend.
With curl
The sync endpoint starts a run, waits up to 300 seconds and returns the dataset items. Sitemap-level monitoring (new and removed pages, lastmod changes) for one site:
export APIFY_TOKEN=<your Apify API token>
curl -sS -X POST \
"https://api.apify.com/v2/acts/owlabee~website-change-monitor/run-sync-get-dataset-items" \
-H "Authorization: Bearer ${APIFY_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"sites": [
"https://www.sitemaps.org/sitemap.xml"
],
"mode": "monitor",
"checkContent": false,
"maxPages": 200,
"stateStoreName": "website-change-monitor-sitemaps-org",
"resetBaseline": false,
"notifyOnlyOnChanges": true
}'
From an AI agent (MCP)
Apify hosts an MCP server. This config exposes only this Actor to the agent:
{
"mcpServers": {
"owlabee-website-change-monitor": {
"url": "https://mcp.apify.com/?tools=owlabee/website-change-monitor",
"headers": {
"Authorization": "Bearer ${APIFY_TOKEN}"
}
}
}
}
Then ask, for example: Tell me which pages were added to or removed from sitemaps.org since the last check.
Python, Node.js and more examples
Runnable curl.sh, python.py, node.mjs and mcp.json files for this Actor are in examples/website-change-monitor on GitHub.
No code: Zapier, Make or n8n
Apify's official apps on these platforms can run this Actor and pass its results on. Step-by-step recipes: Website Change Alerts in Slack with n8n.
FAQ
Does it work with sitemap indexes and gzipped sitemaps?
Yes. Indexes are followed recursively, .xml.gz files are decompressed and plain-text sitemaps are accepted.
How do I avoid false positives from dates and counters?
Point contentSelector at the element with the real content and turn on ignoreNumbers.
How is severity decided?
A removed page or a page that starts failing is high, a new page is medium, a lastmod change with unchanged content is low, and a content change is scored by the share of words that changed.
Can I get alerts?
Set webhookUrl. By default it is called only when changes were found, with a run summary and up to 1,000 change records.
Does it render JavaScript?
No. Pages are fetched as plain HTML; use a selector that targets server-rendered markup.