Website Change Monitor: Track Page Content Changes
Pricing
from $15.00 / 1,000 site checkeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
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
- In the Apify Console. Open the actor page and click Start — the
urlsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - 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"]}'
- 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:
| query | found | status | url | changed | changeType | changedSections | matchedKeywords | title | lang | wordCount | checkedAt | previousCheckedAt | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| https://en.wikipedia.org/wiki/Web_scraping | true | OK | <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 reportschanged: trueonly 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.
