Website Change Monitor — Diff, Screenshot & AI Summary avatar

Website Change Monitor — Diff, Screenshot & AI Summary

Pricing

from $2.00 / 1,000 page checkeds

Go to Apify Store
Website Change Monitor — Diff, Screenshot & AI Summary

Website Change Monitor — Diff, Screenshot & AI Summary

Watch pricing pages, product availability, terms, docs or any URL. Get only what changed since the last run — added/removed text, change %, screenshot — plus an optional AI summary of what the change means.

Pricing

from $2.00 / 1,000 page checkeds

Rating

0.0

(0)

Developer

Al Moutasem Nabil

Al Moutasem Nabil

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Website Change Monitor — Track Any Page for Changes, with Diff, Screenshot & AI Summary

Watch pricing pages, product availability, terms, docs or any URL. Get only what changed since the last run — added/removed text, change %, screenshot — plus an optional AI summary of what the change means. Schedule it and route alerts to Slack or email.

Who it's for

  • Product marketers watching competitors' pricing and plan pages.
  • E-commerce and procurement teams watching stock status, prices and tender portals.
  • Legal and compliance watching terms, privacy policies and regulatory pages.
  • Developers watching API docs, changelogs and status pages.
  • Analysts and journalists watching government announcements and published figures.

What makes it different

  • Only what changed. Each run compares against the last one and returns the changed pages, not a fresh copy of everything.
  • A real diff. Added and removed lines, plus a changePercent, so you can tell a new pricing tier from a reworded footer at a glance.
  • Noise control that actually works. Nav, footers and cookie banners are stripped before comparing; ignorePatterns neutralises timestamps and counters; minChangePercent sets a floor; and a CSS selector narrows the watch to a single price or status line.
  • Keyword alerts. "Sold out" appearing or "In stock" disappearing is reported however small the edit, regardless of the change threshold.
  • AI meaning, not just text. An optional summary says what the change means, categorises it (price, availability, legal, content, outage) and scores importance 1–5, so you can route only the 4s and 5s to a human. Arabic summaries are written in Modern Standard Arabic.
  • Screenshots of changed pages, stored with the run.

Input

This is the Console prefill. It watches two public pages, reports them on the first run with a screenshot each, and turns on AI summaries for later runs. It finishes in about 20 seconds and costs about $0.03:

{
"pages": [
{
"url": "https://www.gov.uk/government/announcements",
"name": "GOV.UK announcements"
},
{
"url": "https://nodejs.org/en/blog",
"name": "Node.js blog"
}
],
"trackingId": "my-watch",
"mode": "changes",
"ignorePatterns": ["Last updated:.*", "\\d{1,2}:\\d{2}\\s*(AM|PM)?"],
"emitBaselineAsChanged": true,
"screenshotOnChange": true,
"aiSummary": true,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Run it again (or schedule it) with the same trackingId and you get only what changed since the previous run: the added and removed lines, changePercent, a screenshot and an AI summary. Diffs and AI summaries start from the second run, because they need a previous version to compare with.

To watch one element instead of the whole page, pass a CSS selector, for example { "url": "https://www.apify.com/pricing", "name": "Apify pricing", "selector": ".pricing-table" }, and add watchKeywords such as ["Sold out", "Discontinued"] for keyword alerts.

With emitBaselineAsChanged off, the first run is a silent baseline: it records the pages and returns a single free no_changes row saying so, so your first alert is a real change.

Output

One item per page. Every field is documented in .actor/dataset_schema.json; the Console shows Changes and All pages views. A real changed-page record from a test run (a page whose content changes on every visit, watched with aiSummary on):

{
"url": "https://httpbin.org/uuid",
"name": "uuid",
"status": "changed",
"httpStatus": 200,
"checkedAt": "2026-09-13T01:46:44.173Z",
"lastChangedAt": "2026-09-13T01:46:44.173Z",
"changePercent": 100,
"diff": {
"added": ["\"uuid\": \"5ff3010a-9ac0-405f-967c-d0a2dff1e0b9\""],
"removed": ["\"uuid\": \"be192262-6064-465b-bfaa-f6ec4daee41d\""]
},
"keywordHits": null,
"contentHash": "949a01c54519b5b4583956fbbe3801f319dd7345",
"wordCount": 4,
"pageTitle": null,
"screenshotUrl": null,
"aiSummary": {
"summary": "The UUID value changed from \"be192262-6064-465b-bfaa-f6ec4daee41d\" to \"5ff3010a-9ac0-405f-967c-d0a2dff1e0b9\".",
"category": "content_update",
"importance": 2
},
"error": null,
"truncated": false
}

Pages that could not be fetched come back with status: "error" and the reason in error, and are never charged. When nothing changed, changes mode returns one free row with status: "no_changes" that says so. If an AI summary was requested but could not be produced, the changed page says why in error.

Sample output

Real items verified on the Apify platform in September 2026: a changed page from a second run (diff and AI summary), and a page reported on the first run of the example input (with its screenshot link). Long text and lists are shortened for this page; field names and values are otherwise exactly as the Actor returns them.

[
{
"url": "https://httpbin.org/uuid",
"name": "uuid",
"status": "changed",
"httpStatus": 200,
"checkedAt": "2026-09-13T01:46:44.173Z",
"lastChangedAt": "2026-09-13T01:46:44.173Z",
"changePercent": 100,
"diff": {
"added": ["\"uuid\": \"5ff3010a-9ac0-405f-967c-d0a2dff1e0b9\""],
"removed": ["\"uuid\": \"be192262-6064-465b-bfaa-f6ec4daee41d\""]
},
"keywordHits": null,
"contentHash": "949a01c54519b5b4583956fbbe3801f319dd7345",
"wordCount": 4,
"pageTitle": null,
"screenshotUrl": null,
"aiSummary": {
"summary": "The UUID value changed from \"be192262-6064-465b-bfaa-f6ec4daee41d\" to \"5ff3010a-9ac0-405f-967c-d0a2dff1e0b9\".",
"category": "content_update",
"importance": 2
},
"error": null,
"truncated": false
},
{
"url": "https://www.gov.uk/government/announcements",
"name": "GOV.UK announcements",
"status": "new",
"httpStatus": 200,
"checkedAt": "2026-09-13T02:13:20.778Z",
"lastChangedAt": "2026-09-13T02:13:20.778Z",
"changePercent": 100,
"diff": null,
"keywordHits": null,
"contentHash": "6ba78701980a9c6f0c013efae8d2d7d845522f75",
"wordCount": 4192,
"pageTitle": "News and communications - GOV.UK",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/kmCilLuOeuVuJXUjZ/records/screenshot-www.gov.uk-government-announcements-2026-09-13T02-13-20-778Z?signature=1lRhOgN8jRDapro7VWRSn",
"aiSummary": null,
"error": null,
"truncated": false
}
]

Schedule it and get alerts

  1. Fill in the input and Save as task.
  2. Add a Schedule to the task — daily at 07:00 is typical; hourly for stock or status pages.
  3. Open the task's Integrations tab and add Slack, Email, Webhook, Make or Zapier on Run succeeded. In changes mode a quiet run contains only a single no_changes row, so filter on status = changed to hear from it only when something actually moved.
  4. For Slack, map name, url, changePercent and aiSummary.summary into the message — that is usually all a human needs to decide whether to look.

n8n and Make

Use the Apify node with Run Actor and get dataset, then branch on aiSummary.importance >= 4 to page someone, and log the rest. Filtering on category lets you send price_change to sales and legal_policy to legal.

Use as an API (Standby)

The Actor runs in Standby mode, so a workflow or an AI agent can check one page per HTTP request:

GET https://almoutasem-nabil--page-change-monitor.apify.actor/?url=https://example.com/pricing&trackingId=my-watch&aiSummary=1
Authorization: Bearer <your Apify token>

Parameters mirror the input (url, selector, trackingId, renderJs, aiSummary, summaryLanguage, screenshotOnChange, minChangePercent, watchKeywords). The response is JSON with items, charged with the same events as a normal run. GET /health returns {"ok":true}.

Pricing

Pay-per-event. You pay for pages checked and changes found.

EventPriceWhen
Page checked$0.002Per page fetched and compared. A page that could not be fetched is free.
Change detected$0.01Per page reported as changed or new.
AI change summary$0.02Per AI summary produced.
Screenshot$0.005Per screenshot captured.
  • 50 pages checked daily: 50 × $0.002 × 30 = $3.00 a month, plus $0.01 per change.

  • A typical month with ~30 changes: about $3.30. With AI summaries on those changes, under $1 extra.

  • The example input above, first run: 2 × $0.002 + 2 × $0.01 + 2 × $0.005 = $0.034.

Default memory is 2048 MB, which covers the headless browser used for screenshots and JS-heavy pages. Apify's start fee scales per GB, so with screenshotOnChange and renderJs off you can run at 1024 MB.

Limitations

  • Login-walled pages are not supported. The Actor never logs in and sends no cookies.
  • Very large pages are truncated at 300 KB of text; truncated: true says so.
  • JS-heavy pages need a browser. Pages whose HTML comes back as an empty shell are retried in one automatically; set renderJs per page to force it.
  • Rotating content (adverts, "related articles", A/B tests) will report changes until you exclude it with ignoreSelectors or ignorePatterns. A selector is the most reliable fix.
  • Changing your own settings — selector, ignorePatterns, textOnly — changes what is compared, so the next run legitimately reports a change.
  • ../hiring-signals-monitor — track companies' career pages and get new, removed and changed roles.
  • ../ad-library-intelligence — track competitors' live ads on Google and LinkedIn, and top ads on TikTok.
  • ../mena-jobs-aggregator — four MENA job boards in one deduplicated feed.

The Actor reads publicly accessible pages — the same content any visitor sees — and never logs in or sends cookies. It stores a normalized text snapshot of each page purely so the next run has something to compare against; nothing is republished. It extracts no personal data: no emails, no phone numbers, no names are pulled into fields. Requests are paced and concurrency is capped. Use it in line with each site's terms and the laws that apply to you.