Clean Screenshot & Change Monitor avatar

Clean Screenshot & Change Monitor

Pricing

from $1.00 / 1,000 screenshot takens

Go to Apify Store
Clean Screenshot & Change Monitor

Clean Screenshot & Change Monitor

Clean website screenshots without cookie banners, popups or chat widgets. Desktop, mobile and tablet in one run, PDF export, and a change monitor that tells you when a page changed (pixels + text).

Pricing

from $1.00 / 1,000 screenshot takens

Rating

0.0

(0)

Developer

Loris Barce

Loris Barce

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Security

Limited permissions

Share

Take clean screenshots of any public web page: no cookie banners, newsletter popups or chat bubbles. Capture desktop, mobile and tablet in a single run, export PDFs, and turn on the change monitor to find out when a page changed since the last run, with a pixel diff, a visible-text diff and a diff image that marks changes in red.

  • 🧹 Clean pages. The Actor clicks Reject (or Accept) on the most common consent managers: OneTrust, Cookiebot, Didomi, Iubenda, Quantcast, TrustArc, Usercentrics, CookieYes, Complianz and Osano. It then hides leftover overlays and the Intercom, Drift, Tawk, Zendesk, HubSpot, Crisp and LiveChat widgets.
  • 📱 Desktop + mobile + tablet in one run. Desktop is 1920×1080; mobile uses an iPhone 15 profile and tablet an iPad profile, both with real device pixel ratio, user agent and touch.
  • 📄 PDF export. The whole page becomes one tall PDF page that looks exactly like the screenshot.
  • 🔔 Change monitor. Each run is compared with the previous one: changed, % pixels changed, textChanged, a text diff snippet and a red-highlighted diff image. Dates, counters and rotating banners can be ignored with CSS selectors.
  • 💸 Pay only for results. You pay per saved screenshot and per change check. Failed URLs cost nothing.

Use cases

Use caseHow
Monitor competitor prices and landing pagesSchedule daily with monitorMode: true and get notified when changedCount > 0.
Web page archive / compliance evidenceSave PDFs or full-page PNGs of terms, pricing pages or ads on a schedule.
Visual QACapture your site on desktop + mobile after each deploy and diff it against the previous release.
Clean screenshots for reports and decksNo cookie walls or chat bubbles covering the content.

Input

FieldTypeDefaultDescription
urlsarray(required)Pages to capture, max 500 per run. Also accepts a remote text file of URLs (requestsFromUrl).
devicesarray["desktop"]Any of desktop (1920×1080), mobile (iPhone), tablet (iPad).
fullPagebooleantrueWhole scrollable page instead of the viewport only.
formatstringpngpng, jpeg or pdf (PDF is desktop only).
cleanPagebooleantrueRemove cookie banners, popups and chat widgets.
hideSelectorsarray[]Extra CSS selectors to hide (always applied).
waitForstringnetworkidleload, networkidle or selector.
waitSelectorstringSelector to wait for when waitFor is selector.
delayMsinteger1000Extra wait before capturing (max 15000).
monitorModebooleanfalseCompare with the previous run.
monitorStoreNamestringscreenshot-monitorNamed key-value store holding the reference screenshots. Use different names for separate monitors.
diffThresholdPercentnumber1.0Pixel changes below this % count as "no change". A text change always counts.
ignoreSelectorsarray[]Areas to ignore in the comparison (both pixels and text).
proxyConfigurationobjectno proxyOptional Apify Proxy or your own proxies.

Example: clean screenshots on desktop and mobile

{
"urls": [{ "url": "https://www.example.com" }, { "url": "https://www.example.org/pricing" }],
"devices": ["desktop", "mobile"]
}

Example: PDF archive

{
"urls": [{ "url": "https://www.example.com/terms" }],
"format": "pdf"
}

Example: daily price monitor

{
"urls": [{ "url": "https://competitor.example.com/pricing" }],
"devices": ["desktop", "mobile"],
"monitorMode": true,
"monitorStoreName": "competitor-pricing",
"ignoreSelectors": [".last-updated", "#visitor-counter", ".testimonial-carousel"],
"diffThresholdPercent": 0.5
}

Output

One dataset row per URL × device:

{
"url": "https://competitor.example.com/pricing",
"device": "desktop",
"format": "png",
"imageUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/3f2a9c1d7e4b8a60-desktop.png",
"width": 1920,
"height": 4210,
"bytes": 812345,
"title": "Pricing – Competitor",
"status": "ok",
"error": null,
"changed": true,
"pixelChangePercent": 2.84,
"textChanged": true,
"textDiffSnippet": "-$49 / month\n+$59 / month",
"diffImageUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/3f2a9c1d7e4b8a60-desktop-diff.png"
}
  • The monitor fields (changed … diffImageUrl) are only present when monitorMode is on. On the first run there is nothing to compare with yet, so changed is null and the screenshot becomes the reference.
  • The reference is replaced only when a change is detected, so slow drifts below the threshold still add up and get reported.
  • A failed URL gives status: "failed" with the reason in error. It never stops the other URLs.

The run summary is stored in the default key-value store under the OUTPUT key:

{ "total": 4, "succeeded": 4, "failed": 0, "changedCount": 1, "durationSec": 21.4, "skipped": 0, "stoppedBySpendLimit": false }

total, succeeded and failed count URL × device captures. The run succeeds if at least one capture succeeded.

Schedule a daily monitor with notifications

  1. Save your input as a task (e.g. Competitor pricing monitor).
  2. In Schedules, create a schedule (e.g. 0 8 * * *, every day at 8:00) and add the task.
  3. Get notified about changes. Pick one:
    • Slack / email integration (task → Integrations): notifies on every successful run. Open the dataset's Change monitor view to see what changed.

    • Only when something changed: add a webhook on ACTOR.RUN.SUCCEEDED pointing to Make, Zapier, n8n or your own endpoint, with this payload template:

      {
      "runId": {{resource.id}},
      "outputUrl": "https://api.apify.com/v2/key-value-stores/{{resource.defaultKeyValueStoreId}}/records/OUTPUT",
      "datasetUrl": "https://api.apify.com/v2/datasets/{{resource.defaultDatasetId}}/items?clean=true"
      }

      In your scenario, fetch outputUrl, continue only if changedCount > 0, then post the rows where changed is true (with their diffImageUrl) to Slack, email or a ticket.

Pricing

Pay-per-event pricing: you pay only for successful results.

EventPriceWhen
screenshot-taken$0.001Each image or PDF saved successfully
change-check$0.003Each comparison in monitor mode (not charged on the first run, when the reference is created)

Examples:

  • 1,000 clean screenshots: $1.00
  • Monitoring 50 pages × desktop + mobile, every day for 30 days: 3,000 × ($0.001 + $0.003) = $12.00

Failed URLs are never charged. If you set a maximum cost per run, the Actor stops cleanly once the next capture would exceed it. It saves OUTPUT with stoppedBySpendLimit: true, reports the skipped captures, and the run still finishes as SUCCEEDED.

FAQ

Can it capture pages behind a login? No. Login, sessions and user cookies are not supported, by design. Only public pages are captured.

Does it solve CAPTCHAs or bypass anti-bot protection or paywalls? No. If a site shows a CAPTCHA or blocks automated browsers, the screenshot will show that page. A proxy (proxyConfiguration) can help with geo-restricted content, but the Actor doesn't try to defeat bot protection.

Why does the Actor click "Reject" instead of "Accept"? Rejecting is privacy-friendly and usually loads fewer third-party scripts, so the screenshot shows the page as a new visitor sees it. If there is no reject button, it clicks accept. Any banner still left is hidden.

A banner or popup is still visible on my site. Add its CSS selector to hideSelectors. Consent managers change often, and the built-in list (src/consent_selectors.py) is updated regularly.

Why is the mobile screenshot 1179 px wide? Mobile and tablet use the real device pixel ratio (iPhone 15: 393 CSS px × 3), so images are as sharp as on the device.

Is there a limit on page length? Yes. A full-page capture is limited to about 40 megapixels: roughly 20,800 px of height on desktop and about 11,000 CSS px on mobile (at 3× pixel density). Longer pages, such as endless news homepages, are cut at that height, and the run log says so. Very tall pages are captured in slices and stitched together, so they don't crash the browser.

My monitor reports changes every day, but nothing important changed. Add the dynamic areas (dates, counters, carousels, ads) to ignoreSelectors, or raise diffThresholdPercent. Text changes always count, so put elements with changing text in ignoreSelectors.

Where are the reference screenshots? In the named key-value store monitorStoreName in your account. Delete or rename the store to start from scratch. Changing fullPage also resets the reference.

How long are the screenshot URLs valid? Screenshots are saved in the run's default key-value store, which follows your plan's data-retention period. Download or export what you want to keep.

Which URLs are refused? Only http/https URLs on public addresses are captured. Local files, localhost, private networks and cloud metadata addresses are refused for security.


🇮🇹 In breve (italiano)

Clean Screenshot & Change Monitor cattura screenshot puliti di qualsiasi pagina pubblica: senza banner dei cookie, popup e chat. In un solo run ottieni desktop, mobile e tablet, puoi esportare in PDF e attivare il monitoraggio delle modifiche.

  • Pulizia automatica: clicca "Rifiuta" (o "Accetta") sui consent manager più diffusi (OneTrust, Cookiebot, Didomi, Iubenda, Quantcast, TrustArc, Usercentrics…) e nasconde gli overlay rimasti e i widget di chat.
  • Monitor: con monitorMode: true ogni run viene confrontato con il precedente. Ottieni changed, la percentuale di pixel cambiati, textChanged, un estratto delle differenze di testo e un'immagine con le modifiche evidenziate in rosso. Usa ignoreSelectors per escludere date, contatori e caroselli.
  • Casi d'uso: monitorare prezzi e landing dei concorrenti, archiviare pagine (PDF), QA visuale dopo i deploy, screenshot puliti per report.
  • Prezzi: $0,001 per screenshot salvato e $0,003 per confronto. Gli URL falliti non si pagano. Al raggiungimento del limite di spesa il run si ferma in modo pulito e risulta comunque SUCCEEDED.
  • Limiti: niente pagine con login, niente risoluzione di CAPTCHA, nessun aggiramento di paywall o protezioni anti-bot.

Per un monitoraggio giornaliero: salva l'input come task, crea uno Schedule (es. ogni mattina alle 8) e aggiungi un'integrazione Slack/email oppure un webhook che invia una notifica solo quando changedCount > 0.