Web Page Change Monitor avatar

Web Page Change Monitor

Pricing

from $30.00 / 1,000 url changeds

Go to Apify Store
Web Page Change Monitor

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

Alex Mercer

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

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 exceeded minChangedChars.
  • unchanged: content did not change, or changed below threshold when notifyOnNoChange is 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 check with JavaScript rendering enabled.
  • 0.1 compute unit per check for 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.