Visual Website Change Detection: Screenshot Diff & Webhook
Pricing
from $5.00 / 1,000 successful page captures
Visual Website Change Detection: Screenshot Diff & Webhook
Website change monitor that compares what a page looks like. Saves screenshots and a visual diff image, reports the percent of pixels changed, and can call your webhook. Watch a full page or one CSS section, on desktop or mobile. Failed captures are free.
Pricing
from $5.00 / 1,000 successful page captures
Rating
0.0
(0)
Developer
russell tellez
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
RALT Page Watch is a website change monitor that compares what a page looks like. Each run takes a screenshot, compares it with the previous one, and saves an image of the differences. If the page changed more than your threshold, it can call your webhook.
Use it to watch a whole page or only one section. It needs no code, and it works on public pages that don't require a login.
What you can watch
- Competitor pages: pricing, landing pages and homepages.
- Your own website: spot layout changes after a release, on desktop or mobile.
- Policies and terms: keep dated screenshots of each visible version.
- Stock and product pages: see when a page or one section looks different.
How to use it
- Add the URLs you want to watch.
- Optionally, add a CSS selector to watch one section, such as
#pricing. - Run it once. The first run saves the starting screenshot, so it reports no change.
- Create a schedule to run it hourly, daily or weekly.
- Optionally, add a webhook URL to send change alerts to your own system or to an automation tool that accepts webhooks.
Input example
{"urls": ["https://example.com/pricing"],"viewports": "desktop","selector": "#pricing","changeThresholdPercent": 0.5,"webhookUrl": "https://your-server.example/hook"}
Input
| Parameter | Default | Description |
|---|---|---|
urls | Required | Up to 100 public HTTP or HTTPS URLs to watch per run. |
viewports | desktop | desktop (1280x800) or mobile (375x812). |
fullPage | false | Capture the full page, up to 5,000 pixels high. |
selector | None | CSS selector of the section to watch. |
waitForMs | 1000 | Extra wait after the page loads, up to 15,000 ms. |
changeThresholdPercent | 0.5 | Percent of changed pixels needed to report a change. |
webhookUrl | None | Public URL that receives an alert when a page changes. |
retainSnapshots | 5 | Snapshots and diffs to keep per URL, from 1 to 50. |
Output
Each URL produces one record:
{"url": "https://example.com","finalUrl": "https://example.com/","status": "success","httpStatus": 200,"capturedAt": "2026-11-05T15:03:25.754Z","viewport": "desktop","screenshotKey": "snap_state_072eeb777b9444213950f256afc1f632_1793891006398.png","sha256": "d3a6e2e8ffecec9157b528f99dab3200cb9f75a2eb190e927bbbf81d43bdcbe1","previousSha256": "d3a6e2e8ffecec9157b528f99dab3200cb9f75a2eb190e927bbbf81d43bdcbe1","changed": false,"changePercent": 0,"diffKey": null,"title": "Example Domain","errorCode": null,"charged": true}
The webhook sends a JSON message with event: "page_changed", the URL, page title, capture time, viewport, hashes and changePercent. It doesn't include the images.
Where the images are stored
Screenshots and diffs are saved in a key-value store named ralt-page-watch-store in your Apify account, so the next run can compare against them. Apify storage charges for that store apply to your account. Use screenshotKey and diffKey to find each image, and retainSnapshots to limit how many are kept.
Error codes
| Code | Meaning |
|---|---|
blocked | Blocked by robots.txt, an HTTP 403, a rate limit or a redirect to a forbidden address. |
timeout | The page took too long to load. |
invalid_url | The URL is malformed, contains credentials or uses another protocol. |
forbidden_target | The URL points to a local, private or cloud metadata address. |
http_error | The website returned a 4xx or 5xx status. |
selector_not_found | The CSS selector matched nothing on the page. |
event_charge_limit_reached | The run stopped at your maximum cost per run. The record has status: "halted". |
Pricing
- Successful capture: $0.005, or $5.00 per 1,000.
- Run start: $0.00005 per GB of memory, or $0.0001 per run at the default 2 GB.
- Failed capture: free.
For example, watching 10 pages once a day for 30 days is 300 captures and 30 runs, which costs about $1.50. Apify storage charges are separate. Set a maximum cost per run if you want a spending limit: the run stops when it reaches it.
Limitations
- Visual comparison only: it compares pixels, not HTML or text, so it won't tell you which words changed.
- Changing content can trigger alerts: ads, carousels, clocks and cookie banners can look like changes. Use a CSS selector or a higher threshold to reduce them.
- Public pages only: it doesn't log in, solve CAPTCHAs, use proxies or try to get around blocks. Some websites will return
blocked. - Robots.txt: it follows the site's robots.txt. If that file can't be read, the capture continues.
- Slow pages: pages that don't load in time return
timeoutand aren't charged.
FAQ
Why does the first run show no change? There's nothing to compare yet. The first run saves the starting screenshot, and it's charged like any other successful capture.
Can I use the screenshots as legal evidence? Don't rely on them for that. The SHA-256 hash shows whether two saved files are identical. It isn't certified evidence or proof from a notary.
Is it allowed to monitor any website? You're responsible for having the right to capture each URL and for following that website's terms. Don't submit URLs that contain passwords, tokens or personal data.
Does it block internal addresses? Yes. It rejects localhost, private networks and cloud metadata addresses, including when a redirect points to them.