Visual Website Change Detection: Screenshot Diff & Webhook avatar

Visual Website Change Detection: Screenshot Diff & Webhook

Pricing

from $5.00 / 1,000 successful page captures

Go to Apify Store
Visual Website Change Detection: Screenshot Diff & Webhook

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

russell tellez

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

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

  1. Add the URLs you want to watch.
  2. Optionally, add a CSS selector to watch one section, such as #pricing.
  3. Run it once. The first run saves the starting screenshot, so it reports no change.
  4. Create a schedule to run it hourly, daily or weekly.
  5. 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

ParameterDefaultDescription
urlsRequiredUp to 100 public HTTP or HTTPS URLs to watch per run.
viewportsdesktopdesktop (1280x800) or mobile (375x812).
fullPagefalseCapture the full page, up to 5,000 pixels high.
selectorNoneCSS selector of the section to watch.
waitForMs1000Extra wait after the page loads, up to 15,000 ms.
changeThresholdPercent0.5Percent of changed pixels needed to report a change.
webhookUrlNonePublic URL that receives an alert when a page changes.
retainSnapshots5Snapshots 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

CodeMeaning
blockedBlocked by robots.txt, an HTTP 403, a rate limit or a redirect to a forbidden address.
timeoutThe page took too long to load.
invalid_urlThe URL is malformed, contains credentials or uses another protocol.
forbidden_targetThe URL points to a local, private or cloud metadata address.
http_errorThe website returned a 4xx or 5xx status.
selector_not_foundThe CSS selector matched nothing on the page.
event_charge_limit_reachedThe 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 timeout and 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.