Website Screenshot
Pricing
from $6.00 / 1,000 screenshots
Website Screenshot
Website screenshot API: bulk full-page or viewport screenshots of any URL as PNG/JPEG, or URL to PDF. Desktop, tablet, mobile; cookie banners removed, lazy images loaded. $2.50 per 1,000 screenshots; failed pages are free.
Pricing
from $6.00 / 1,000 screenshots
Rating
0.0
(0)
Developer
John Wilkinson
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Website Screenshot API: Bulk Full-Page Screenshots, Mobile, URL to PDF
URL in, screenshot out. Capture full-page or viewport screenshots of any list of URLs as PNG/JPEG, or convert URL to PDF, with cookie banners removed. $6 per 1,000 screenshots; failed pages are free.
Take screenshots of any website in bulk. Paste a list of URLs and get back full-page or viewport screenshots as PNG or JPEG, or a URL-to-PDF render, on desktop, laptop, tablet, iPhone, or Android viewports. Each result has a direct image URL you can download, embed, or pass to an AI agent.
It is built for clean captures. Cookie banners and consent popups are dismissed automatically (OneTrust, Cookiebot, Didomi, Usercentrics, Sourcepoint, Quantcast, TrustArc and generic ones). Lazy-loaded images are scrolled into view so the full page renders. You pay only for successful screenshots: failed pages, DNS errors and HTTP 4xx/5xx pages are free.
What it does
- Full-page screenshots of the whole scrollable page, or the visible viewport only.
- Device presets: desktop 1920×1080, laptop 1366×768, tablet (iPad, retina), mobile (iPhone 390×844 @3x), Android (Pixel), or any custom width, height and pixel density.
- PNG, JPEG, or PDF: get several formats in one run, e.g. a PNG plus a PDF of the same page.
- Cookie banner and popup removal: clicks "Accept" in 15+ languages, hides known consent platforms, and unlocks pages that a consent wall stops from scrolling.
- Lazy-load handling: scrolls the page before capturing so images and sections below the fold load.
- Element screenshots: capture a single CSS selector, e.g. a chart, pricing table, or tweet.
- Hide elements: remove chat widgets, ads, or sticky headers with CSS selectors.
- Wait controls:
waitUntil(load / networkidle),waitForSelector, and an extra delay for animations. - Dark mode (
prefers-color-scheme: dark) and a custom user agent. - Bulk and fast: one shared headless Chromium captures several pages in parallel. Typical pages take 2–10 s.
- Robust: a timeout still captures whatever had loaded (with a warning), one bad URL never fails the run, and each error is readable ("Domain does not resolve", "Page returned HTTP 404"…).
Use cases
- SEO and agency reporting: screenshot client homepages and landing pages every week.
- Visual QA and regression checks on desktop and mobile.
- Archiving and compliance: keep dated PDF or PNG captures of web pages, ads, and terms pages.
- Competitor monitoring: track pricing pages and homepages over time (pair it with an Apify schedule).
- AI agents and LLM vision: give a model "what this page looks like" via the image URL.
- Link previews and thumbnails for directories and dashboards.
Input
| Field | Default | Description |
|---|---|---|
urls | – | List of URLs: [{ "url": "https://…" }] |
device | desktop | desktop, laptop, tablet, mobile, android, custom |
fullPage | true | Whole page vs. visible viewport |
formats | ["png"] | Any of png, jpeg, pdf |
dismissCookieBanners | true | Accept or hide cookie/consent popups |
scrollToBottom | true | Scroll to trigger lazy-loaded content |
delayMs | 1000 | Extra wait after load |
waitUntil | load | load, domcontentloaded, networkidle |
waitForSelector | – | Wait for a CSS selector before capturing |
selector | – | Capture only this element |
hideSelectors | – | CSS selectors to hide |
width / height / deviceScaleFactor | preset | Custom viewport |
blockTrackers | true | Block analytics, ads, chat widgets and video (faster, cleaner) |
darkMode | false | Emulate dark color scheme |
jpegQuality | 80 | JPEG quality 1–100 |
pdfFormat | A4 | A4, Letter, Legal, A3, Tabloid |
maxFullPageHeight | 16384 | Very long pages are cut at this height (px) |
timeoutSecs | 45 | Navigation timeout per page |
maxRetries | 1 | Retries after a browser error |
maxConcurrency | 4 | Pages in parallel (auto-capped at 1 per GB of memory) |
includeHtml | false | Also return the rendered HTML |
Example input
{"urls": [{ "url": "https://apify.com" }, { "url": "https://www.bbc.co.uk" }],"device": "mobile","fullPage": true,"formats": ["png", "pdf"]}
Output
Images and PDFs are stored in the run's key-value store. The dataset has one item per URL:
{"url": "https://apify.com","status": "success","screenshotUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/apify.com-mobile-1a2b3c4d5e.png","pdfUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/apify.com-mobile-1a2b3c4d5e.pdf","files": [{ "format": "png", "key": "apify.com-mobile-1a2b3c4d5e.png", "url": "…", "bytes": 912345 }],"title": "Apify: Full-stack web scraping and data extraction platform","finalUrl": "https://apify.com/","httpStatus": 200,"device": "mobile","viewport": "390x844","fullPage": true,"pageWidth": 390,"pageHeight": 12771,"warnings": [],"elapsedSec": 7.4,"error": null}
status is success, httpError (the page answered 4xx/5xx; it is captured but not charged) or error (nothing captured, with a readable error).
Use it from code or an AI agent
curl -X POST "https://api.apify.com/v2/acts/jcwilk~website-screenshot/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"urls":[{"url":"https://example.com"}],"device":"desktop","formats":["png"]}'
The response has the screenshotUrl for each page. The Actor also works as a tool through the Apify MCP server: the input is a flat JSON object with a URL list, so it is easy for LLM agents to call.
Pricing (pay per event)
| Event | Price |
|---|---|
| Actor start (charged by Apify, per GB of run memory) | $0.003 per GB |
| Screenshot (PNG or JPEG) | $0.006 ($6 per 1,000) |
| Page saved as PDF | $0.015 |
Example: 1,000 full-page screenshots in one 4 GB run cost about $6.012. Failed pages, unreachable domains and HTTP error pages are free. Platform compute and browser time are included.
FAQ
Is this a ScreenshotOne / Urlbox / screenshotapi.net alternative? For bulk, pay-as-you-go captures without a monthly plan, yes: you call it through the Apify API, MCP server, Make, Zapier or n8n and pay per successful screenshot.
Does it remove cookie banners? Yes, by default. It clicks the "Accept" button when it can find one (English, German, French, Spanish, Italian, Portuguese, Dutch, Nordic, Polish, Czech, Turkish, Japanese…), hides the major consent platforms, and re-enables scrolling. Turn it off with dismissCookieBanners: false if you need the banner in the image.
Why is my screenshot cut off at the bottom? Pages taller than maxFullPageHeight (16,384 px by default) are cut to keep files usable. You can raise it up to 32,000 px.
Can it screenshot pages behind a login? No. It captures public pages only.
Does it work on sites with bot protection? Most public sites work without a proxy. Sites behind aggressive anti-bot walls (e.g. some Cloudflare challenges) may show the challenge page instead.
How long are image URLs valid? They live in your run's key-value store, so they follow your Apify data retention (unnamed storages are kept for 7 days on the free plan). Download them, or copy them to a named store, to keep them longer.
Can I schedule it? Yes. Use Apify Schedules to capture the same URLs daily or weekly for monitoring and archiving.
Limitations
- Public pages only, with no login or cookies input.
- Videos, canvas animations, and some WebGL content may look different from a real browser.
- A few consent walls that need a choice before any content loads (rare) may still appear.
- Maximum height of 32,000 px per full-page image. PDF output uses print layout, with background graphics on.
Run locally (no Apify account needed)
pip install -r requirements-dev.txt && playwright install chromiumpython -m pytest -q # unit + end-to-end tests against a local test sitepython scripts/smoke.py mobile # real-site smoke test, images in smoke-results/