Website Screenshot & Visual Change Monitor
Pricing
from $5.00 / 1,000 screenshots
Website Screenshot & Visual Change Monitor
Full-page screenshots and PDFs of any website with device presets, lazy-load scrolling and cookie-banner auto-dismiss. Optionally compares every capture with the previous run and reports which pixels and regions changed.
Pricing
from $5.00 / 1,000 screenshots
Rating
0.0
(0)
Developer
Dennis
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Accurate full-page screenshots and PDFs of any website — with the things that usually ruin a screenshot handled for you: lazy-loaded content is scrolled into view, cookie banners are dismissed, and rotating ads and chat widgets are blocked out. Turn on the visual diff and every run also tells you what changed compared to the previous run, down to the region of the page that moved.
When should an AI agent use this?
- "Take a full-page screenshot of https://example.com/pricing and tell me the page height."
- "Capture our landing page at mobile, tablet and desktop width and store the images."
- "Monitor these 12 URLs daily and only wake me up when a page actually looks different."
- "How much of the homepage changed since yesterday? Give me the percentage and which sections."
- "Turn these five web pages into A4 PDFs I can attach to a report."
- "Screenshot this page with the newsletter popup and the cookie bar hidden."
What this Actor does
- True full-page capture — the whole scrollable page, not just the first viewport.
- Lazy-load aware — scrolls the page in steps before capturing, so images and infinite-scroll sections that only load on approach are actually in the picture.
- Cookie-banner auto-dismiss — clicks the accept button of the common consent platforms (OneTrust, Cookiebot, Didomi, TrustArc, Usercentrics, Sourcepoint, CMPs and more) in a dozen languages, then hides anything that survives. It only ever accepts; it never clicks "reject" for you. If a banner refuses to go away, the record says so instead of quietly lying.
- Device presets — desktop (1920×1080), laptop (1366×768), tablet (768×1024) and mobile (390×844), with a real mobile user agent so responsive sites actually serve their mobile layout. Or set your own width, height and pixel ratio.
- Deterministic captures — blocks ad, analytics and chat-widget requests, freezes CSS animations and video, and hides scrollbars. Without this, a rotating banner or a mid-animation carousel makes every screenshot differ from the last one.
- Page preparation — click anything first (a "Show more" link, a language switcher, a tab), wait for a specific CSS selector, or hide sticky headers and overlays.
- PNG, JPEG or PDF — PNG for lossless screenshots and the best diffing, JPEG for small files, or a printable A4 PDF.
- Visual change detection — compares each capture with the baseline of the previous run, reports the percentage of changed pixels, the bounding regions that changed, and writes a diff image with the page faded out and the changes highlighted in red.
- Per-URL error isolation — one unreachable or broken URL produces an error record for that URL; the rest of the run continues.
- Apify Proxy — optional country and residential proxy configuration for sites that block datacenter IPs.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings | ["https://example.com"] | Absolute page URLs to capture. Duplicates are removed, invalid entries come back as an error record. |
viewport | enum | desktop | desktop, laptop, tablet, mobile or custom. |
viewportWidth / viewportHeight | integer | 1280 / 800 | Only used with custom. |
deviceScaleFactor | integer | 1 | Only used with custom. 2 gives a retina-density image. |
mobileUserAgent | boolean | true | Send a real mobile/tablet user agent for those presets. |
fullPage | boolean | true | Capture the whole scrollable page instead of one viewport. |
format | enum | png | png, jpeg or pdf. |
imageQuality | integer | 80 | JPEG quality, 1–100. |
waitUntil | enum | networkidle | load, domcontentloaded, networkidle or commit. |
waitForSelector | string | – | Wait for this CSS selector before capturing. |
waitForTimeout | integer | 0 | Extra fixed wait in ms. |
navigationTimeout | integer | 45000 | Per-URL navigation timeout in ms. |
scrollToBottom | boolean | true | Scroll in steps to trigger lazy-loaded content. |
scrollStepDelay | integer | 300 | Pause between scroll steps in ms. |
maxScrollSteps | integer | 40 | Safety cap; a truncated scroll is logged as a warning. |
dismissCookieBanners | boolean | true | Auto-dismiss known consent banners. |
cookieBannerSelectors | array of strings | [] | Extra selectors to try after the built-in list. |
clickSelectors | array of strings | [] | Elements to click before capturing. |
hideSelectors | array of strings | [] | Elements to make invisible before capturing. |
blockTracking | boolean | true | Block ad, analytics and chat-widget requests. |
disableAnimations | boolean | true | Freeze CSS animations, transitions and video. |
hideScrollbars | boolean | true | Hide browser scrollbars. |
visualDiff | boolean | false | Compare with the baseline of the previous run. |
diffThreshold | number | 0.1 | Per-pixel colour tolerance, 0–1. |
diffMinChangePercentage | number | 0.1 | Minimum share of changed pixels (%) before a page counts as changed. |
diffRegionCellSize | integer | 32 | Grid cell size in px used to group changed pixels into regions. |
diffMaxRegions | integer | 10 | Maximum number of reported regions per page. |
updateBaseline | boolean | true | Store this capture as the new baseline. |
maxPages | integer | 20 | Stop after this many URLs. |
proxy | object | – | Apify Proxy settings, e.g. {"useApifyProxy": true, "apifyProxyCountry": "NL"}. |
Output
One dataset record per URL. The captured file lives in the run's key-value store; screenshotUrl is a direct link to it.
{"startUrl": "https://example.com/pricing","url": "https://example.com/pricing","status": "ok","httpStatus": 200,"error": null,"capturedAt": "2026-09-28T19:33:12.157Z","title": "Pricing — Example","loadTimeMs": 1840,"pageWidth": 1280,"pageHeight": 4310,"imageWidth": 1280,"imageHeight": 4310,"bytes": 412330,"format": "png","fullPage": true,"viewport": { "preset": "desktop", "width": 1920, "height": 1080, "deviceScaleFactor": 1, "isMobile": false },"screenshotKey": "capture_6f1c2a90b7d4e5f6_example.com_0.png","screenshotUrl": "https://api.apify.com/v2/key-value-stores/AbCdEf123/records/capture_...?signature=...","cookieBannerDismissed": true,"cookieBannerStillVisible": false,"cookieBannerClicked": ["#onetrust-accept-btn-handler"],"clickedSelectors": [],"hiddenSelectors": [".sticky-header"],"blockedRequests": 14,"scrollSteps": 9,"scrollReachedBottom": true,"scrollTruncated": false,"hasBaseline": true,"changed": true,"changePercentage": 1.84,"diffReason": "changed","diffKey": "diff_6f1c2a90b7d4e5f6_example.com_0.png","diffUrl": "https://api.apify.com/v2/key-value-stores/AbCdEf123/records/diff_...?signature=...","changedRegions": [{ "x": 320, "y": 1184, "width": 640, "height": 256, "changePercentage": 22.4 }],"baselineScreenshotUrl": "https://api.apify.com/v2/key-value-stores/XyZ789/records/baseline_...?signature=...","baselineCapturedAt": "2026-09-27T06:00:04.221Z"}
diffReason is one of no-baseline (first run, baseline stored), identical, changed, size-mismatch (the page height or width changed, so a pixel comparison would be meaningless), image-too-large (the capture is above 25 megapixels, where a full decode would risk running the container out of memory), unreadable-baseline or disabled. The diff fields are only present when visualDiff is on, so an agent can branch on key presence.
scrollTruncated is true when maxScrollSteps cut the scroll short, which means a very long page may not be fully loaded in the capture. cookieBannerStillVisible is true when a consent overlay survived the auto-dismiss. cookieBannerDismissed is true only when something was actually dismissed and nothing is left — a page without any banner reports false together with cookieBannerStillVisible: false.
Visual change monitoring
Set visualDiff to true and schedule the Actor. Each run compares the fresh capture with the baseline stored by the previous run, then updates the baseline. The baseline lives in a dedicated named key-value store, so it survives across runs and is keyed by URL and viewport — a mobile baseline is never compared against a desktop capture.
Noise is the enemy of change detection, which is why blockTracking, disableAnimations and hideScrollbars default to on. If a page still contains a live counter or a rotating testimonial, raise diffMinChangePercentage rather than turning the diff off. Because the comparison is pixel-based, a page that grows taller is reported as size-mismatch instead of being force-cropped into a misleading percentage, and a capture above 25 megapixels is reported as image-too-large rather than risking an out-of-memory crash — the screenshot itself is still stored in both cases.
Use cases
- Visual regression monitoring — schedule a set of URLs and get a
changedflag plus a diff image only when something moved. - Price and content change alerts — combined with a price monitor, catch a competitor quietly rewriting their pricing page.
- Design review and archiving — full-page captures of your own pages over time, as a searchable visual archive.
- Responsive QA — capture the same page at four device presets in one run.
- PDF reports and archiving — turn web pages into A4 PDFs.
- Content extraction for AI datasets — screenshots of pages for vision-model training or evaluation.
- Client deliverables — a visual snapshot of a website for a review or handover document.
Pricing
This Actor uses Apify's Pay-Per-Event (PPE) pricing model.
- Actor Start: $0.00005 (Apify default)
- screenshot: $0.005 per captured page
- visual_diff: $0.002 per pixel comparison against the previous run
- changed_page: $0.005 per page flagged as visually changed
A run that only captures screenshots therefore costs $0.005 per page. Enabling the diff adds $0.002 per page, plus $0.005 for each page that actually changed.
Legal
This Actor renders and photographs only the pages you give it. It does not crawl, does not discover additional pages, does not extract personal data, and does not bypass authentication, paywalls or bot protection. You are responsible for having the right to capture the pages you submit, and for what you do with the resulting images — the same position you are in with any browser's screenshot tool. Consent banners are only ever accepted automatically, never rejected; if a site requires a specific privacy choice, turn dismissCookieBanners off and handle it yourself. Respect the terms of service of the sites you capture and the rights of the people depicted in them.
FAQ
Does the visual diff work on the very first run?
No. The first run stores a baseline and reports diffReason: "no-baseline". Every run after that compares against it.
Why did a page come back as size-mismatch instead of a percentage?
The page rendered at a different width or height than the baseline. Padding one image to match the other would invent pixels, so the Actor reports the finding instead of a misleading number.
The cookie banner is still in my screenshot.
Check cookieBannerStillVisible in the record. If it is true, the click did not take effect — add the banner's accept button to cookieBannerSelectors, or set dismissCookieBanners to false to keep the dialog in the picture on purpose.
Can I capture a site that blocks datacenter IPs?
Yes — pass an Apify Proxy configuration, for example {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"}.
Will screenshots differ slightly between two runs of the same page?
With the defaults (blockTracking, disableAnimations, hideScrollbars all on) they should not. Live counters, stock tickers and rotating content are the usual culprits — raise diffMinChangePercentage or hide them with hideSelectors.
How large can a full-page capture get?
A long page at a high pixel ratio produces a large image. Lower deviceScaleFactor or use format: "jpeg" if file size matters more than losslessness.
Related Actors
- Bulk Image Scraper — when you need the actual image files inside a page rather than a picture of the page.
- Universal Price Monitor — structured price and stock monitoring; pair it with this Actor to also see when the surrounding page layout changed.
- Google Ads Transparency Monitor — track the ads your competitors are running.
Keywords
website screenshot, screenshot generator, full page screenshot, website change monitor, visual regression, pixel diff, website archive, pdf from website, mobile screenshot, page snapshot, visual change detection, competitor monitoring, screenshot api, chrome screenshot
Changelog
0.1.0
- Initial release: full-page screenshots and PDFs, device presets, lazy-load scrolling, cookie-banner auto-dismiss, ad/analytics blocking, animation freezing, and pixel-diff change detection against the previous run.