Web Page Change Monitor
Pricing
from $30.00 / 1,000 url changeds
Web Page Change Monitor
Monitor any web page for meaningful changes. Watch full pages or specific CSS selectors, filter noisy timestamps and tokens, and get diffs plus optional webhook alerts when content actually changes.
Pricing
from $30.00 / 1,000 url changeds
Rating
0.0
(0)
Developer
Alex Mercer
Actor stats
1
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Monitor any web page for changes. Get notified the moment prices, terms, or content shift.
Who it's for
- SEO agencies watching competitor pages and SERP-adjacent content.
- Procurement teams tracking pricing, terms, and vendor policy changes.
- Competitive intelligence teams monitoring launch pages and changelogs.
- Product managers following release notes, docs, and policy updates.
Why this Actor
- Selector-scoped monitoring lets you watch only the part of the page that matters.
- Noise filters strip dates, ads, rotating tokens, and other false-positive bait before diffing.
- Usage-based pricing is a better fit than flat SaaS plans for bursty or large monitoring fleets.
- Native Apify integrations mean dataset exports, webhooks, Make, Zapier, and n8n work immediately.
Use cases
1. Track a competitor pricing page
Watch only the pricing table instead of the whole page.
{"urls": [{"url": "https://apify.com/pricing","userData": {"selector": ".PricingHeader-plans"}}],"renderJs": true,"minChangedChars": 5}
2. Monitor a SaaS changelog
Focus on the newest changelog entry and ignore everything else.
{"urls": [{"url": "https://github.blog/changelog/","userData": {"selector": "main article:first-of-type"}}],"renderJs": true,"notifyOnNoChange": true}
3. Watch a government policy page
Monitor the full page while ignoring date stamps that update every publish.
{"urls": [{"url": "https://www.gsa.gov/website-information/website-policies"}],"renderJs": false,"ignorePatterns": ["\\\\d{4}-\\\\d{2}-\\\\d{2}"]}
Input reference
urls
One or more pages to monitor. Each entry can be a plain string or a full Apify request object. Use userData.selector to override the default selector per URL.
[{"url": "https://example.com"},{"url": "https://example.com/pricing","userData": {"selector": ".pricing-table"}}]
selector
Default CSS selector for all URLs unless overridden per request.
Example: "selector": "main article:first-child"
ignorePatterns
Regex strings applied line-by-line after extraction and before diffing.
Example:
{"ignorePatterns": ["\\\\d{4}-\\\\d{2}-\\\\d{2}","Last updated: .*","Ad served at .*"]}
renderJs
Enable browser rendering for JavaScript-heavy pages. This is the default.
Example: "renderJs": true
Cost note: JS rendering is roughly 10x more expensive than static checks. Use "renderJs": false for simple HTML pages whenever possible.
waitForSelector
Wait until a selector appears before extracting page content.
Example: "waitForSelector": ".loaded-state"
webhookUrl
Optional URL that receives a JSON payload for every detected change.
Example: "webhookUrl": "https://webhook.site/your-token"
notifyOnNoChange
Emit dataset rows for unchanged pages too. Helpful for audit trails and heartbeat monitoring.
Example: "notifyOnNoChange": true
minChangedChars
Minimum number of changed characters required before a diff is treated as a real change.
Example: "minChangedChars": 25
maxConcurrency
Optional per-run concurrency override. If omitted, the Actor uses APIFY_CONCURRENCY when set, otherwise 5.
Example: "maxConcurrency": 10
maxRequestRetries
Optional retry count for transient network failures before a page is marked as error.
Example: "maxRequestRetries": 2
Output reference
Dataset rows use this shape:
{"url": "https://example.com/pricing","selector": ".pricing-table","checkedAt": "2026-04-17T17:05:18.123Z","status": "changed","changedChars": 42,"diff": "*** content\\n--- before\\n+++ after\\n@@ -1 +1 @@\\n-Price: $49\\n+Price: $59\\n","before": "Starter\\nPrice: $49","after": "Starter\\nPrice: $59","errorMessage": null,"screenshotUrl": "https://api.apify.com/v2/key-value-stores/xxxx/records/snapshot-abc-change-2026-04-17T17-05-18-123Z.png"}
Status meanings:
initial: first snapshot stored for that URL and selector pair.changed: content changed and exceededminChangedChars.unchanged: content did not change, or changed below threshold whennotifyOnNoChangeis enabled.error: the page could not be fetched or the selector did not match.
Large before, after, and diff fields are truncated before being written to the dataset so oversized pages do not blow up row size limits.
If a diff field is truncated, treat it as an inspection aid rather than a patch you can apply directly, because truncation can cut through a unified-diff hunk.
Webhook payload
Webhook payloads are identical to dataset rows and are sent only for changed events.
{"url": "https://example.com/changelog","selector": "main article:first-child","checkedAt": "2026-04-17T17:07:44.000Z","status": "changed","changedChars": 128,"diff": "*** content\\n--- before\\n+++ after\\n@@ -1,2 +1,2 @@\\n-Added feature A\\n+Added feature B\\n","before": "Release 1.0\\nAdded feature A","after": "Release 1.1\\nAdded feature B","errorMessage": null,"screenshotUrl": "https://api.apify.com/v2/key-value-stores/xxxx/records/snapshot-def-change-2026-04-17T17-07-44-000Z.png"}
Pricing note
Store billing is usage-based through Apify events. In the current default setup, users are billed for Actor starts and for rows written to the default dataset.
Expected platform usage:
1 compute unit per checkwith JavaScript rendering enabled.0.1 compute unit per checkfor static HTML checks.
This Actor is a strong fit for teams that need occasional bursts, hundreds of URLs, or selector-specific monitoring without committing to a monthly seat-based tool.
Local development
Install dependencies:
$npm install
Run tests:
$npm test
Run locally with Apify storage:
$apify run --purge
Known limitations
- Infinite-scroll pages are not supported in v1.
- Auth-walled pages are not supported yet.
- CAPTCHA-walled pages are intentionally not supported.
- This version monitors text and text-derived structural changes, not pixel diffs.