If you run a page-watching job on Apify, there is a good chance it is the Content Checker Actor: a URL, a CSS selector, a screenshot selector, an e-mail address, and a schedule that runs it every hour or day. It is simple and it works, and thousands of people set it up that way.
I needed the same thing for a lot more pages: competitor pricing pages, a few terms-of-service pages, and release notes. Running one Content Checker task per page got messy fast, and I wanted Slack alerts and less noise from dates and "5 minutes ago" counters. So I built a change monitor that accepts the same input and adds what I was missing.
Migrate in one minute
Take your existing Content Checker input and paste it into Website Change Monitor unchanged:
{
"url": "https://www.apify.com/change-log",
"contentSelector": "article",
"screenshotSelector": "article",
"sendNotificationTo": "you@your-apify-account-email.com",
"informOnError": "true"
}
url, contentSelector, screenshotSelector, sendNotificationTo and informOnError all work as before. Keep your schedule, point it at this Actor, and you are done. The first run saves a baseline; every run after that compares with the previous one.
Then watch many pages in one run
The part that made me build it: one run can watch up to 5,000 pages, each with its own selector and name.
{
"urls": [
{ "url": "https://www.apify.com/change-log", "userData": { "selector": "article", "name": "Apify changelog" } },
{ "url": "https://example.com/pricing", "userData": { "selector": "#plans", "name": "Competitor pricing" } }
],
"monitorName": "my-watchlist",
"ignoreCommonNoise": true,
"watchKeywords": ["price", "out of stock"],
"screenshotOnChange": true,
"alertOnError": true,
"webhookUrl": "https://hooks.slack.com/services/...",
"notifyEmail": "you@your-apify-account-email.com"
}
-
ignoreCommonNoiseignores dates, times, "5 minutes ago" and view counters, so a page does not "change" on every visit. -
watchKeywordsalerts only when a changed line mentions one of your words. -
screenshotOnChangesaves a screenshot after each alerted change and links the previous one, so you get a before/after pair. - A Slack (or Discord) incoming-webhook URL gets a readable message; any other URL gets JSON, optionally signed with HMAC-SHA256.
What a change looks like
A real result (September 2026; httpbin.org/uuid returns a new ID on every request, which makes it a handy test page):
{
"url": "https://httpbin.org/uuid",
"status": "changed",
"addedCount": 1,
"removedCount": 1,
"added": ["\"uuid\": \"762816a2-8e92-4d9a-aa9a-05b68c05601e\""],
"removed": ["\"uuid\": \"e83ca153-a8dc-498e-b49c-80ddb4cfe18e\""],
"significant": true,
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/shot-...-20260929034729491.jpg",
"previousScreenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/shot-...-20260929034644443.jpg"
}
On a pricing page, number changes are pulled out for you: "numericChanges": [{ "before": "$19", "after": "$29", "context": "Pro plan $29/month" }].
A few things that kept my alerts honest:
-
Changing the selector does not fire a giant false alert. It saves a new baseline (
reason: "settings-changed") instead. -
A page that starts returning 404 or 410 is reported once as
removed, and asrestoredwhen it comes back. -
A page that keeps failing is reported after N failed runs in a row (
informOnError: "true"means after the first), so a monitor never dies silently. - Lines that only moved around are not reported as changes.
Content Checker vs. this Actor
| Content Checker | Website Change Monitor | |
|---|---|---|
| Your existing input | ✓ | ✓ (same fields) |
| Pages per run | 1 | up to 5,000, per-page selector and name |
| Alerts | e-mail, Slack, Discord, JSON webhook (HMAC) | |
| Screenshots | ✓ (screenshotSelector) |
✓ before and after, linked in alerts |
| Ignore dates and counters | – | ✓ |
| Keyword triggers, minimum change size | – | ✓ |
| Price / number changes extracted | – | ✓ |
| AI summary of the change | – | optional, $0.005 each |
| Removed pages (404/410) reported | – | ✓ |
| Actor fee | none (you pay platform usage for its browser runs) | $2 per 1,000 checks, failed checks free |
(Checked October 2026. E-mail in both uses Apify's send-mail Actor, which delivers to your Apify account's e-mail address; for anyone else, use Slack or a webhook to Zapier, Make or n8n.)
What it costs
$0.002 per page check, no start fee and no fee per detected change. Screenshots ($0.003 each) and AI summaries ($0.005 each) only if you turn them on. Pages that could not be read are not charged.
| Monitor | Checks per month | Cost per month |
|---|---|---|
| 1 page, every hour | 720 | $1.44 |
| 20 pages, once a day | 600 | $1.20 |
| 100 pages, once a day | 3,000 | $6.00 |
Higher Apify plans get a volume discount on the check price.
Set it up in three steps
- Paste the URLs (or your Content Checker input) and give the monitor a name.
- Run it once to save the baseline. The status message tells you so: "Baseline saved for N page(s). Next: create a schedule…"
- In Apify Console go to Schedules → Create, pick the Actor and your input, and choose e.g. every day at 9:00.
From then on, each scheduled run reports only what changed.
Actor: https://apify.com/tidytools/website-change-monitor
Disclosure: I built this Actor and earn from its usage on Apify. Content Checker is a separate Actor by another author; the comparison above reflects its public Store page and input fields as of October 2026.
Top comments (0)