Clean Screenshot & Change Monitor
Pricing
from $1.00 / 1,000 screenshot takens
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Security
Limited permissionsShare
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 case | How |
|---|---|
| Monitor competitor prices and landing pages | Schedule daily with monitorMode: true and get notified when changedCount > 0. |
| Web page archive / compliance evidence | Save PDFs or full-page PNGs of terms, pricing pages or ads on a schedule. |
| Visual QA | Capture your site on desktop + mobile after each deploy and diff it against the previous release. |
| Clean screenshots for reports and decks | No cookie walls or chat bubbles covering the content. |
Input
| Field | Type | Default | Description |
|---|---|---|---|
urls | array | (required) | Pages to capture, max 500 per run. Also accepts a remote text file of URLs (requestsFromUrl). |
devices | array | ["desktop"] | Any of desktop (1920×1080), mobile (iPhone), tablet (iPad). |
fullPage | boolean | true | Whole scrollable page instead of the viewport only. |
format | string | png | png, jpeg or pdf (PDF is desktop only). |
cleanPage | boolean | true | Remove cookie banners, popups and chat widgets. |
hideSelectors | array | [] | Extra CSS selectors to hide (always applied). |
waitFor | string | networkidle | load, networkidle or selector. |
waitSelector | string | Selector to wait for when waitFor is selector. | |
delayMs | integer | 1000 | Extra wait before capturing (max 15000). |
monitorMode | boolean | false | Compare with the previous run. |
monitorStoreName | string | screenshot-monitor | Named key-value store holding the reference screenshots. Use different names for separate monitors. |
diffThresholdPercent | number | 1.0 | Pixel changes below this % count as "no change". A text change always counts. |
ignoreSelectors | array | [] | Areas to ignore in the comparison (both pixels and text). |
proxyConfiguration | object | no proxy | Optional 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 whenmonitorModeis on. On the first run there is nothing to compare with yet, sochangedisnulland 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 inerror. 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
- Save your input as a task (e.g. Competitor pricing monitor).
- In Schedules, create a schedule (e.g.
0 8 * * *, every day at 8:00) and add the task. - 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.SUCCEEDEDpointing 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 ifchangedCount > 0, then post the rows wherechangedistrue(with theirdiffImageUrl) to Slack, email or a ticket.
-
Pricing
Pay-per-event pricing: you pay only for successful results.
| Event | Price | When |
|---|---|---|
screenshot-taken | $0.001 | Each image or PDF saved successfully |
change-check | $0.003 | Each 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: trueogni run viene confrontato con il precedente. Ottienichanged, la percentuale di pixel cambiati,textChanged, un estratto delle differenze di testo e un'immagine con le modifiche evidenziate in rosso. UsaignoreSelectorsper 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.