Website Screenshot API: Full Page, PDF & Mobile
Pricing
from $1.50 / 1,000 screenshots
Website Screenshot API: Full Page, PDF & Mobile
Capture any URL as PNG, JPEG, WebP or PDF: viewport, full page or one element. Desktop, laptop, tablet, iPhone & Android presets, dark mode, cookie banner & ad hiding. Pay only per successful screenshot.
Pricing
from $1.50 / 1,000 screenshots
Rating
0.0
(0)
Developer
Parth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Turn any list of URLs into clean website screenshots or PDFs, ready to share or feed into your pipelines. Choose PNG, JPEG, WebP or PDF, and capture the visible viewport, the full scrollable page, or a single element by CSS selector. Presets cover desktop, laptop, tablet, iPhone and Android, and you can also set a custom size, retina density or dark mode. Cookie banners are hidden automatically, and ads and trackers can be blocked too.
Every capture is saved as a file with a direct download link, and gets one dataset row with the final URL, HTTP status, page title, pixel size and file size. You pay a flat price per successful screenshot. Failed, timed-out or blocked pages produce a free error row.
What can it do?
- 📸 4 formats: PNG (lossless), JPEG and WebP (with a quality setting), and PDF (A4, Letter, Legal, A3 or Tabloid; portrait or landscape)
- 🖥️ 3 capture modes: viewport (above the fold), full page (the whole scrollable page, with lazy images loaded first) and element (just
#pricing,header,.product-cardand so on) - 📱 Device presets: Desktop 1920×1080, Laptop 1440×900, Tablet (iPad), iPhone 15 and Android (Pixel 7), each with the right user agent, touch and mobile emulation. Custom width and height and retina 2×/3× are also available.
- 🌙 Dark mode via
prefers-color-scheme: dark - 🍪 No cookie banners: 35+ consent tools (OneTrust, Cookiebot, Usercentrics, Quantcast, Didomi, TrustArc, Sourcepoint, CookieYes, Osano and more) are hidden and page scrolling is unlocked. You can add your own selectors to hide chat widgets, pop-ups or sticky headers.
- 🚫 Ad and tracker blocking (on by default, can be turned off): about 100 ad and analytics networks are blocked, so ad-heavy pages load up to 5× faster and look cleaner
- ⏱️ Wait control: wait for
load,networkidle(good for SPAs and dashboards) ordomcontentloaded, plus an extra delay for animations and charts - ⚡ Fast and cheap: one shared Chromium browser captures several pages in parallel. Slow third-party scripts can't stall a capture, and no proxy is used by default.
- 🧾 Fair billing: you are charged only when a file is saved. Errors, HTTP 4xx/5xx responses and bot-protection pages are free.
Input example
{"urls": ["https://apify.com","https://en.wikipedia.org/wiki/Web_scraping","https://news.ycombinator.com"],"format": "png","mode": "fullPage","device": "desktop","darkMode": false,"hideCookieBanners": true,"hideSelectors": ["#intercom-container"],"blockAdsAndTrackers": true,"waitUntil": "load","delayMs": 500,"timeoutSecs": 30}
| Field | What it does |
|---|---|
urls | Pages to capture, one per line (https:// is added if missing) |
format | png, jpeg, webp, pdf |
mode | viewport, fullPage, element |
selector | CSS selector for element mode |
device | desktop, laptop, tablet, iphone, android, custom |
viewportWidth / viewportHeight | Override the preset size (0 = preset) |
deviceScaleFactor | 1–3 for retina output (0 = preset) |
darkMode | Emulate dark color scheme |
hideCookieBanners | Hide consent pop-ups (default on) |
hideSelectors | Extra CSS selectors to hide |
blockAdsAndTrackers | Block ad and analytics requests (default on; turn off to capture ads) |
waitUntil | load, networkidle, domcontentloaded |
delayMs | Extra wait before capture |
quality | JPEG/WebP quality 1–100 |
maxFullPageHeight | Cut infinite feeds at N CSS px (default 15,000) |
pdfPageFormat / pdfLandscape / pdfMedia | PDF paper, orientation, screen or print CSS |
timeoutSecs | Page load timeout |
maxConcurrency | Pages captured in parallel (0 = auto, 1 per GB of memory) |
proxyConfiguration | Optional Apify Proxy or your own proxies (off by default) |
Output example
Each capture is stored in the run's key-value store, for example as 0001-apify.com.png. You also get one dataset row per URL:
{"inputUrl": "https://apify.com","url": "https://apify.com/","finalUrl": "https://apify.com/","statusCode": 200,"title": "Apify: Full-stack web scraping and data extraction platform","format": "png","mode": "fullPage","device": "desktop","width": 1920,"height": 9876,"viewportWidth": 1920,"viewportHeight": 1080,"deviceScaleFactor": 1,"darkMode": false,"pdfPages": null,"truncated": false,"fileSizeBytes": 2154312,"contentType": "image/png","key": "0001-apify.com.png","fileUrl": "https://api.apify.com/v2/key-value-stores/aBcD1234/records/0001-apify.com.png","loadTimeMs": 3120,"notes": null,"success": true,"error": null,"errorType": null,"capturedAt": "2026-10-21T08:00:00.000Z"}
A failed URL gives a row with "success": false, an error message and an errorType (invalid_url, dns, timeout, navigation_failed, http_error, blocked, selector_not_found, capture_failed). These rows are never charged.
The dataset has three views: Screenshots (with image previews), File links and Errors. You can export to JSON, CSV or Excel, or use fileUrl to download each file directly.
Pricing
Pricing is pay per event, a flat price per successful capture:
| Event | Price | Per 1,000 |
|---|---|---|
| Viewport or element screenshot (PNG/JPEG/WebP, any device) | $0.0015 | $1.50 |
| Full-page screenshot or PDF | $0.003 | $3.00 |
| Actor start (Apify's default start fee, once per run per GB of memory) | $0.00005 | $0.05 per 1,000 runs |
Failed, blocked and HTTP-error pages cost nothing. Set Max cost per run and the Actor stops cleanly once that budget is reached.
How this compares to Apify's Website Screenshot Generator (apify/screenshot-url)
| This Actor | apify/screenshot-url | |
|---|---|---|
| Billing | Flat price per successful capture | Platform compute (2 GB default memory) plus Apify Proxy traffic |
| Cost predictability | Known before you run | Depends on page weight, memory and run time |
| Proxy | Off by default (optional) | Apify Proxy on by default |
| Formats | PNG, JPEG, WebP, PDF | PNG, PDF |
| Capture modes | Viewport, full page, single element | Viewport or scroll to bottom |
| Device presets, retina, dark mode | ✅ Desktop, laptop, tablet, iPhone, Android | Viewport width only |
| Cookie banner hiding | ✅ Built-in list + your selectors | Your own selectors only |
| Ad and tracker blocking | ✅ On by default (can be turned off) | ❌ |
| Failed pages | Free error row | Compute is still billed |
apify/screenshot-url is a great open-source example Actor. This Actor is a production screenshot API with predictable per-capture pricing.
Use cases
- SEO and agency reports: capture client homepages, landing pages and SERP-ranked pages on desktop and mobile for monthly reports and audits
- Competitor monitoring: schedule daily full-page captures of competitors' pricing, home and feature pages to keep a visual history of every change
- QA and visual regression: screenshot staging and production on every device preset after a deploy, then diff them in your CI
- Archiving and compliance: keep timestamped PNG/PDF evidence of web pages, ads, terms and disclosures
- AI agents and LLM vision: give agents (via the Apify MCP server or API) a screenshot tool to "look" at pages, or feed captures into GPT-4o, Claude or Gemini vision for analysis
- No-code automation: connect to Zapier, Make or n8n. Send new URLs from a Google Sheet, Airtable or CRM, then post the resulting
fileUrlto Slack, Notion, Google Drive or email - Social and link previews: generate thumbnails and OG-style previews for directories, newsletters and link pages
How to use it via API
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"urls":["https://example.com"],"format":"png","mode":"fullPage"}'
The response contains the dataset rows. Each row's fileUrl points to the image or PDF. JavaScript and Python clients, schedules and webhooks all work the same way.
FAQ
Does it bypass Cloudflare, CAPTCHAs or logins?
No. It captures public pages as a normal browser sees them. Pages that show a bot-protection challenge, or return HTTP 4xx/5xx, produce a free blocked or http_error row instead of a screenshot of the challenge page.
Do I need a proxy? Usually not, and none is used by default. To see a country-specific version of a page, enable Apify Proxy (billed to your account as normal proxy usage) or add your own proxy URLs.
Why is a cookie banner or pop-up still visible? Some sites use custom consent dialogs. Add their CSS selector to Extra elements to hide and they will be removed. Banners are hidden with CSS and never accepted for you.
Which memory should I use?
Keep the default 2048 MB. 1024 MB works for simple viewport screenshots, but heavy news and SPA pages, and tall full-page captures, can crash the browser at 1 GB. Crashes give a free out_of_memory error row. The per-screenshot price is the same at any memory. Only the small Actor start fee scales with memory.
Very long pages?
Full-page captures are cut at maxFullPageHeight (15,000 CSS px by default) to avoid giant files from infinite feeds. Set it to 0 for no limit. To keep captures reliable, one image is also limited to about 36 megapixels. That is roughly 18,000 px tall at 1920 px wide, or about 10,000 CSS px on an iPhone at 3×. WebP is always limited to 16,383 px per side by the format. The truncated field and notes show when a cut happened.
Are the file links public?
fileUrl is the Apify key-value store record URL and works without an API token. If you restrict general resource access in your Apify account settings, the link carries a signature so it still opens. Files follow your plan's data retention.
How many URLs per run? As many as you like. Pages are captured in parallel in one shared browser, one per GB of memory by default (2 at the default 2048 MB). For big batches, raise memory to 4–8 GB and parallelism goes up automatically.
Legal note
Only capture pages you are allowed to access, and respect the website's terms, copyright and trademarks when you store or republish screenshots. Screenshots can contain personal data. If they do, you are responsible for handling it lawfully (for example under GDPR or CCPA). This Actor does not log in, solve CAPTCHAs or bypass access controls, and it refuses private and internal network addresses. This is not legal advice.
Support
Found a page that renders incorrectly, or want another device, format or option? Open an issue on the Actor's Issues tab with the URL and your input.