Website Screenshot API: Full Page, Mobile, No Cookie Banners
Pricing
from $4.00 / 1,000 full-page screenshots
Website Screenshot API: Full Page, Mobile, No Cookie Banners
Bulk full-page and mobile screenshots of any public URL. Lazy images loaded, sticky headers fixed, cookie banners and pop-ups hidden. Failed pages are never charged; each run has a small start fee.
Pricing
from $4.00 / 1,000 full-page screenshots
Rating
0.0
(0)
Developer
Daniil Kravchenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Website Screenshot API — Full Page, Mobile, No Cookie Banners
Capture clean screenshots of public web pages in bulk: the whole page or just the first screen, on desktop, tablet or mobile — with lazy-loaded images actually loaded, sticky headers not repeated, and cookie banners and sign-in pop-ups out of the way.
Failed screenshots are never charged. Pages that return an error, refuse automated access, show a bot
check, time out or render empty are reported in the dataset with charged: false. Each run also has a small
start fee (see Pricing), which applies even if every page fails.
Who it is for
- SEO and marketing agencies — weekly full-page snapshots of client and competitor landing pages.
- No-code automations (Make, n8n, Zapier) — "take a screenshot of this URL" as one reliable step.
- AI agents and QA — a visual of what a page really looks like, on desktop and mobile.
Example: an agency monitors 40 competitor pricing pages every Monday. It runs this Actor on a schedule with the
40 URLs in fullPage mode and gets 40 PNGs plus a table of which pages failed — failed pages are not billed.
What it fixes compared with a plain screenshot
| Problem | What this Actor does |
|---|---|
| Images below the fold are blank | scrolls the page to trigger lazy loading, then returns to the top |
| Sticky header repeated / covering content in full-page shots | turns fixed and sticky elements into normal page flow before capture |
| Cookie banner covers the page | hides known consent managers and consent overlays — nothing is accepted on your behalf |
| Sign-in / newsletter pop-ups | hides modal dialogs, dark backdrops and floating sign-in widgets (hidePopups) |
| Can't choose the height | viewport, fullPage (up to 20,000 px) or fixedHeight (top N px) |
| Emoji show as boxes | colour-emoji and CJK fonts are installed in the image |
| Stuck runs | hard timeout per URL (urlTimeoutSecs), failed pages are not charged |
Pricing
Pay per event. Prices are set in Apify Console; this table explains them.
| Event | Price | When |
|---|---|---|
| Full-page screenshot | $0.004 | per page captured successfully in fullPage or fixedHeight mode |
| First-screen screenshot | $0.002 | per page captured successfully in viewport mode |
| Actor start | $0.001 per GB of memory | once per run, charged by Apify at start: $0.004 with the default 4 GB, $0.002 with 2 GB |
Examples with the default 4 GB: 1 first-screen shot = $0.006; 40 full-page shots = $0.164; a run where every page fails = $0.004. Viewport-only runs work with 2 GB of memory (set it in the run options) and pay a $0.002 start fee. No separate platform-usage charge is added on top of these events.
Input
{"urls": ["https://www.bbc.com/news", "https://stripe.com", "https://en.wikipedia.org/wiki/Emoji"],"mode": "fullPage","device": "desktop","format": "png","hideCookieBanners": true,"hidePopups": true,"blockAds": true}
| Field | Default | Notes |
|---|---|---|
urls | — | 1–500 public http(s) URLs; duplicates are captured once; [{"url": ...}] objects also accepted |
mode | fullPage | viewport, fullPage (cut at 20,000 px), fixedHeight |
height | 1080 | CSS pixels, used with fixedHeight |
device | desktop | desktop 1280 px, tablet 820 px (2× density), mobile 390 px (3× density) |
format | png | png, jpeg, webp; JPEG/WebP files are 3–10× smaller |
quality | 85 | JPEG/WebP only |
waitMs | 0 | extra wait after load (animations) |
hideCookieBanners, hidePopups, blockAds | true | see table above |
hideSelectors | [] | your own CSS selectors to hide (chat widgets, promo bars) |
urlTimeoutSecs | 90 | per URL (5–300); slower pages are reported as failed and not charged |
Image width/height in the output are in device pixels (a 390 px wide mobile viewport at 3× density gives a 1170 px wide image).
Output
One dataset item per URL; images are stored in the run's key-value store and linked by screenshotUrl.
{"url": "https://www.bbc.com/news","finalUrl": "https://www.bbc.com/news","httpStatus": 200,"status": "ok","screenshotUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/screenshot-0001-….png","width": 1280, "height": 6541, "bytes": 3589541,"title": "BBC News - Breaking news, video and the latest top stories …","error": null, "mode": "fullPage", "device": "desktop", "format": "png","durationMs": 4135, "capturedAt": "2026-10-06T10:02:11+00:00", "charged": true}
status is ok, blocked (the site refused automated access, HTTP 401/403/429/451 or a bot check — never
bypassed) or error (DNS/TLS/timeout/HTTP error/empty page/invalid URL). Only ok items are charged.
Limits and honest notes
- Public pages only: no logins, no cookies/sessions, no proxies, no CAPTCHA solving. Sites that block automated
browsers return
blocked. - Cookie banners are hidden visually; the page is captured as a first-time visitor who has not consented, so some sites show reduced content.
- Very long pages are cut at 20,000 px; video is not loaded (poster frames only) when
blockAdsis on. - Very long documents are cut at 20,000 px before rendering, so even 100,000-px pages are captured in seconds.
- Emoji added in the newest Unicode release (16.0) may still show as boxes until the system fonts catch up.
- Default memory is 4 GB (heavy pages need more than 2 GB); for viewport-only runs 2 GB is enough.
- You are responsible for having the right to capture and use screenshots of the pages you submit.
Run locally
pip install -r requirements.txt && playwright install chromiummkdir -p storage/key_value_stores/default && cp example_input.json storage/key_value_stores/default/INPUT.jsonpython -m src