Website Change Monitor: Track Page Content Changes avatar

Website Change Monitor: Track Page Content Changes

Pricing

from $15.00 / 1,000 site checkeds

Go to Apify Store
Website Change Monitor: Track Page Content Changes

Website Change Monitor: Track Page Content Changes

Website change detection: watch any webpage for content changes. Paste a competitor's pricing page, a changelog or a terms of service page and get an alert row only when the text actually changes. Cookie banners and widgets are stripped first. Track pricing page changes to Google Sheets or n8n.

Pricing

from $15.00 / 1,000 site checkeds

Rating

0.0

(0)

Developer

Adriana Voss

Adriana Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Share

Watch any webpage for content changes. Paste a competitor's pricing page, a changelog, or a terms-of-service page and get an alert row only when the text actually changes.

How to use

  1. In the Apify Console. Open the actor page and click Start — the urls field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~website-change-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"urls":["https://en.wikipedia.org/wiki/Web_scraping"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Input

{
"urls": [
"https://en.wikipedia.org/wiki/Web_scraping"
]
}

One URL per line. Each one is fetched, its main article content extracted, and compared against the last time this actor checked it. Accepted formats: https://example.com/pricing, https://example.com/changelog, https://example.com/terms-of-service.

{
"urls": ["https://example.com/pricing", "https://example.com/changelog"],
"deltaMode": true,
"keywordWatch": ["price", "security"],
"ignoreSelectors": [".related-articles", "#ad-banner"],
"diffGranularity": "section"
}

urls is the list of pages to watch. One dataset row is returned per URL; rows with "found": false are never charged. With deltaMode on (the default), the first check of a URL reports changeType: "first-check" and remembers the page; every check after that compares against what was last remembered.

What counts as a change

Before comparing, this actor strips the same noise url-to-markdown strips when extracting an article: cookie/consent banners (OneTrust, Cookiebot, Didomi, and a generic id/class-based fallback), nav/header/footer/script/style, and anything matched by your own ignoreSelectors. A rotating "related articles" widget, an ad slot, or a cookie banner that re-renders with a new timestamp every load is stripped before the diff runs — so you are never billed for, or alerted on, noise you didn't ask to watch.

The remaining article text is split into blocks (by section heading, or by paragraph if you set diffGranularity: "paragraph") and each block is hashed. A block whose hash disappears and a new one appears in roughly the same place is reported as a changed section with {before, after} snippets; a block that only moved position is treated as unchanged. If you set keywordWatch, a change is only reported (changed: true) when the added or removed text contains at least one watched term — a change that doesn't touch a watched term still updates the actor's memory of the page, but comes back as changed: false so you aren't alerted on noise you asked it to ignore.

A page that fails to load, is blocked, or doesn't exist comes back as an ordinary "found": false row (status: BLOCKED / NOT_FOUND / REQUEST_FAILED) — the same convention every other actor in this portfolio uses — rather than a changeType of its own, and is never charged.

Output

One row per item, for example:

queryfoundstatusurlchangedchangeTypechangedSectionsmatchedKeywordstitlelangwordCountcheckedAtpreviousCheckedAtscrapedAt
https://en.wikipedia.org/wiki/Web_scrapingtrueOK<change type (first-check / unchanged / changed)><what changed (before / after snippets)>1970-01-01T00:00:00.000Z

A miss comes back as a row with "found": false and is never charged.

Example runs

  • Watch a Wikipedia article for edits — urls: ["https://en.wikipedia.org/wiki/Web_scraping"], deltaMode: true. First check seeds the baseline; every scheduled check after it reports changed: true only when the article text itself was edited.
  • Watch a changelog for a specific kind of update — urls: ["https://docs.python.org/3/whatsnew/3.13.html"], keywordWatch: ["security", "deprecat"]. Only alerts when a watched term appears in the actual edit, not on every unrelated tweak to the page.
  • Watch a terms-of-service page for real policy changes — urls: ["https://www.mozilla.org/en-US/about/legal/terms/mozilla/"], ignoreSelectors: [".last-updated-banner"]. Strips a rotating "last updated" timestamp banner before diffing, so the actor only alerts on an actual wording change.

Pricing

  • Site checked: $30 per 1,000 page checks

Plus a $0.01 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~website-change-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"urls":["https://en.wikipedia.org/wiki/Web_scraping"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~website-change-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"urls":["https://en.wikipedia.org/wiki/Web_scraping"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~website-change-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"urls":["{{page check}}"]}, mapping the row's page check into the urls array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "website change monitor: track content changes" — the agent will find and run this actor.