Website Screenshot & Visual Change Monitor avatar

Website Screenshot & Visual Change Monitor

Pricing

Pay per event

Go to Apify Store
Website Screenshot & Visual Change Monitor

Website Screenshot & Visual Change Monitor

Screenshot many URLs in desktop, laptop, tablet and mobile viewports in one run: full page, viewport or one element, as PNG, JPEG or PDF. Built-in visual change detection shows the % changed and a highlighted diff image. Pay only for successful screenshots.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Jakob Jerič

Jakob Jerič

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

Take screenshots of any number of websites in desktop, laptop, tablet and mobile viewports in one run: full page, visible area or a single element, as PNG, JPEG or PDF. Turn on visual change detection and every run compares each page pixel by pixel with the previous run. You get the % of the page that changed and a diff image with the changes highlighted.

Use it for responsive design checks, website change monitoring, competitor tracking, visual regression testing, archiving pages, and thumbnails for link previews. It works with the Apify scheduler, API, webhooks, Zapier, Make, n8n and AI agents (MCP).

What you get

  • Several devices per URL in one run: desktop, laptop, tablet, mobile (touch and mobile user agent). Optional retina (2×) rendering.
  • Full page, visible viewport or a single element (CSS selector). Long pages are cut at a safety height.
  • Visual change detection built in: % of pixels changed, changed true/false against your threshold, and a diff image with the changes highlighted in red.
  • Clean captures: cookie banners hidden with CSS, your own elements to hide, dark mode, lazy-load scrolling.
  • One result row per capture, including failures, with a readable error message. One broken URL never fails the whole batch.
  • Robust loading: if a page never fires its final load event (heavy ads, long polling), it's captured as rendered so far instead of being dropped. Failed loads are retried once.
  • Fair billing: you pay only for successful screenshots. Failures and HTTP error pages (4xx/5xx) are free.

How to use

  1. Add your URLs (one per line, https:// optional).
  2. Pick the viewports (for example Desktop + Mobile).
  3. Optionally choose full page or element capture, format, delays, and elements to hide.
  4. Click Start. Screenshots appear in the Output tab with a preview, and the files are in the run's key-value store.

To monitor pages for changes: turn on Detect visual changes, keep the format as PNG, and create a Schedule (for example daily). The first run stores a baseline. Every later run reports changePercent and changed, and links a diff image. To get alerts, add a webhook or integration (Slack, email, Zapier) and filter on changed = true.

Input example

{
"urls": ["https://apify.com", "https://en.wikipedia.org/wiki/Web_scraping"],
"viewports": ["desktop", "mobile"],
"fullPage": true,
"format": "png",
"hideCookieBanners": true,
"hideSelectors": ["#chat-widget"],
"delayMs": 1000,
"compareWithPrevious": true,
"changeThresholdPercent": 0.1
}

All input fields have defaults. Only urls is required.

FieldWhat it does
urlsPages to capture. Duplicates and invalid URLs are skipped with a warning.
viewportsdesktop 1920×1080, laptop 1366×768, tablet 768×1024 (touch, tablet user agent), mobile 390×844 (touch, mobile user agent).
highDpiRender tablet and mobile at 2× pixel density, like real devices: sharper, but 4× the pixels.
fullPage, maxFullPageHeightWhole scrollable page, cut at a safety height (default 10,000 px).
selectorCapture only one element, e.g. #pricing.
formatpng (lossless), jpeg (quality 80, small) or pdf (A4, printable).
waitUntil, delayMs, waitForSelector, scrollToBottomControl when the capture happens (lazy-loaded images, animations).
hideCookieBanners, hideSelectors, darkModeClean, stable screenshots. Banners are only hidden with CSS. Nothing is clicked or accepted.
compareWithPrevious, monitorStoreName, changeThresholdPercentVisual change detection between runs.
navigationTimeoutSecsHow long to wait for each page. Failed loads are retried once.

Output example

You get one dataset row per URL × viewport. The fields are always the same; unused ones are null. This row is copied from a real run with change detection on (the second run, so a baseline existed):

{
"url": "https://news.ycombinator.com/",
"viewport": "laptop",
"viewportWidth": 1366,
"viewportHeight": 768,
"deviceScaleFactor": 1,
"format": "png",
"capturedAt": "2026-10-31T23:37:45.140Z",
"status": "ok",
"finalUrl": "https://news.ycombinator.com/",
"httpStatus": 200,
"pageTitle": "Hacker News",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/TSLhu0NwlcZrpaIs3/records/news-ycombinator-com-laptop-ee29656e.png",
"screenshotKey": "news-ycombinator-com-laptop-ee29656e.png",
"imageWidth": 1366,
"imageHeight": 1215,
"fileSizeBytes": 231237,
"loadTimeMs": 460,
"truncated": false,
"loadComplete": true,
"changePercent": 1.192,
"changed": true,
"previousCapturedAt": "2026-10-31T23:36:03.965Z",
"diffImageUrl": "https://api.apify.com/v2/key-value-stores/TSLhu0NwlcZrpaIs3/records/news-ycombinator-com-laptop-ee29656e-diff.png",
"errorMessage": null
}

A failed capture has status: "failed" and an errorMessage such as "Domain could not be resolved (DNS lookup failed). Check the URL." The run itself still succeeds, so one bad URL never breaks a batch. A run summary is saved to the OUTPUT record of the key-value store.

Pricing

Pay per event, with no monthly fee:

  • $0.002 per screenshot ($2 per 1,000). Each URL × viewport counts as one screenshot. Change detection and diff images are included.
  • $0.0025 per run start per GB of memory, so $0.005 with the default 2 GB.
  • Free: failed captures, pages that return an HTTP error (4xx/5xx), and captures skipped because of your cost limit.

Example: 100 pages in desktop and mobile = 200 screenshots = $0.405 with default memory. Apify platform compute is included in these prices. Set Maximum cost per run in the run options and the Actor stops capturing when it would exceed it.

Use cases

  • Website change monitoring: watch competitor pricing pages, terms of service, landing pages or your own site for unexpected changes.
  • Responsive design QA: see every page on desktop, tablet and phone side by side.
  • Visual regression testing after deployments (run it from CI through the API).
  • Archiving and compliance: timestamped full-page PNGs or PDFs of pages.
  • Thumbnails for directories, link previews and reports.
  • AI agents: give an agent a visual of a page through Apify's MCP server.

FAQ

Where are the image files? In the run's default key-value store. screenshotUrl is a direct link you can open, download or embed.

How does change detection work? Every PNG is compared with the baseline from the previous run with the same URL, viewport and capture settings. The baseline lives in a named key-value store in your account (monitorStoreName) and is replaced after every comparison. Antialiasing differences are ignored. If the page height changed, the extra area counts as changed.

Changes keep showing because of ads, carousels or chat widgets. Add their CSS selectors to Hide elements, raise Change threshold, or capture only the relevant part with Capture only this element.

Can it log in, solve CAPTCHAs or get past bot protection? No. The Actor opens public pages like a normal browser, with no logins, stealth plugins or proxies. Sites that block automated browsers return an error page or fail, and you aren't charged for those.

Why is a mobile screenshot wider than 390 px? Either High-DPI is on (2× density, so a 390 px viewport makes a 780 px image), or the page has no mobile viewport meta tag and is laid out at 980 px, as in a real mobile browser. Full-page captures also include content wider than the viewport.

A page loads forever. Will the run hang? No. After the navigation timeout (default 30 s) the page is captured as rendered so far and the row gets loadComplete: false. Pages that don't open at all are retried once, then reported as failed.

Do baselines cost anything? Baseline PNGs are kept in one named key-value store in your account (one file per URL × viewport) and replaced on every run, so storage stays small.

Is there a limit on page length? Full-page captures are cut at maxFullPageHeight (default 10,000 CSS px, max 16,000), and such rows have truncated: true. This protects you from huge images on infinite-scroll pages.

Can I call it from code? Yes. Use the Apify API or the apify-client package for JavaScript or Python, and read the results from the dataset.

Limits

  • Public http(s) pages only. Local and private network addresses are rejected.
  • PDF output uses one A4 render per URL (no device emulation) and ignores the element selector.
  • Change detection requires PNG format.
  • The Actor captures about one page in parallel per GB of memory (2 GB default = 2 pages). For big batches, raise the memory to go faster.

Questions or a missing feature? Open an issue on the Actor's Issues tab. Issues are answered there.