Website Screenshot & PDF API - Full Page, Mobile, Bulk avatar

Website Screenshot & PDF API - Full Page, Mobile, Bulk

Pricing

from $2.50 / 1,000 screenshots

Go to Apify Store
Website Screenshot & PDF API - Full Page, Mobile, Bulk

Website Screenshot & PDF API - Full Page, Mobile, Bulk

Capture screenshots or PDFs of web pages. Input: URLs; format (PNG, JPEG, WebP, PDF), full page or viewport, device preset, element selector, dark mode. Returns per URL: file URL, title, HTTP status, size. Hides cookie banners, loads lazy images. Charged only for successful captures.

Pricing

from $2.50 / 1,000 screenshots

Rating

0.0

(0)

Developer

Bence Kadi

Bence Kadi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Website Screenshot & PDF API: full page, mobile, bulk

Turn any list of URLs into clean screenshots or PDFs (full-page or viewport PNG, JPEG, WebP, or printable PDF) with a real Chromium browser, hidden cookie banners and loaded lazy images, for $2.50 per 1,000 successful captures. Failed pages are free.

๐Ÿ“ธ What is Website Screenshot & PDF API?

Website Screenshot & PDF API opens each URL you give it in a real headless Chromium browser (Playwright), waits for the page to load, scrolls through it so lazy images appear, hides cookie banners and ads, and saves a screenshot or PDF. Every file goes into the run's key-value store with a public link, and you get one tidy dataset row per URL. It does not crawl: it only loads the exact URLs you supply.

  • ๐Ÿช No cookie banners. Pop-ups from 35+ consent tools (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, Sourcepoint, TrustArc, Google Funding Choices...) are hidden with CSS. Nothing is clicked, so no consent is given on your behalf.
  • ๐Ÿ–ผ๏ธ Lazy content loads, with no blank boxes and no doubled sticky headers.
  • ๐Ÿ“ฑ Device presets (desktop, laptop, tablet, mobile) with real user agents and 2x density, or a custom viewport and retina 1-3x.
  • ๐ŸŽฏ Element capture by CSS selector, ๐ŸŒ™ dark mode, wait-for-element, extra delay and network-idle waiting.
  • ๐Ÿ“„ PDF in A4/Letter/Legal/A3/A5/Tabloid, with screen or print styles.
  • ๐Ÿ’ธ Failures are free: timeouts, 404s, blocked pages and robots.txt skips are listed with the reason and not charged.

๐ŸŽฏ Use cases

  • Agencies and marketing teams: schedule daily screenshots of competitors' homepages and pricing pages, and keep a visual history.
  • Compliance and archiving: save dated PNGs or PDFs of pages, ads, terms or product listings.
  • Developers: generate link previews, directory thumbnails or portfolio images in bulk.
  • QA teams: check landing pages on desktop, tablet and mobile after each release, or in dark mode.
  • AI and LLM pipelines: feed screenshots to GPT-4o, Claude or Gemini for layout or content analysis. JPEG and WebP keep files small.
  • Reports and decks: capture a single chart, table or section with the CSS selector option.

๐Ÿ“‹ Output fields

One dataset row per URL (examples from a real run on 2026-10-05):

FieldDescriptionExample
urlThe URL as captured (https:// added)https://apify.com/
finalUrlThe URL after redirectshttps://apify.com/
statusHTTP status of the page200
titlePage titleApify: Marketplace of ready-to-run tools for AI
screenshotUrlPublic link to the image or PDFhttps://api.apify.com/v2/key-value-stores/<storeId>/records/screenshot-apify.com-b2cbeceab7.png
keyFile key in the key-value storescreenshot-apify.com-b2cbeceab7.png
formatpng, jpeg, webp or pdfpng
deviceDevice preset useddesktop
fullPageWhole page or viewport only (false for PDF and element)true
selectorElement selector, if anynull
widthImage width in pixels (null for PDF)1920
heightImage height in pixels (null for PDF)10036
bytesFile size in bytes1091958
pdfPagesNumber of PDF pages (null for images)null
truncatedPage was cut at the height limitfalse
cookieBannersHiddenExtra cookie overlays hidden by the generic check (known consent tools are hidden by CSS and not counted)0
durationMsTime spent on this URL (ms)12922
takenAtCapture time (UTC)2026-10-05T03:42:21Z
errorWhy the page failed, or null on successnull

Use cases: Developer tools (process & convert media, monitor & alert on website changes, browser automation and testing) ยท Brand monitoring ยท Research markets & competitors (track competitors).

๐Ÿš€ How to use it

  1. Open Website Screenshot & PDF API in Apify Store and click Try for free.
  2. Paste your URLs, one per line (or a CSV column).
  3. Choose the format, Full page on or off, and a device.
  4. Click Start. The prefilled example (3 sites) takes about 20 seconds.
  5. Open the Screenshots tab for thumbnails and links, or download the dataset. The files are in the run's key-value store.

๐Ÿ”ง Input guide

URLs (urls, required). Full URLs or bare domains (example.com becomes https://example.com/). One per line; commas and spaces also work, and lines starting with # are ignored. Duplicates are skipped. Max 50,000 URLs per run.

  • Good: https://example.com/pricing, apify.com
  • Bad: ftp://example.com (http/https only), https://user:pass@example.com (no logins), localhost or 192.168.1.10 (private addresses are rejected).

Format, full page and device

  • format: png (lossless, sharp text), jpeg or webp (much smaller files), pdf (printable, selectable text). Same price for all.
  • fullPage: whole scrollable page, or off for the visible viewport only. Ignored for PDF and element captures.
  • device: desktop 1920x1080, laptop 1366x768, tablet 820x1180 and mobile 412x915 (both 2x pixels, touch, Android user agent). viewportWidth (200-3840), viewportHeight (200-4320) and deviceScaleFactor (1-3) override the preset.

Element capture (selector). E.g. #pricing or table.results: only the first visible match is captured. If nothing matches within 10 s, the row is a free error. Plain CSS only (no braces, max 500 characters).

Page loading

  • waitUntil: load (default; load event capped at 8 s after the page is ready, plus up to 1.5 s for late requests), networkidle (up to 15 s, for heavy single-page apps) or domcontentloaded (fastest, may miss images).
  • delayMs (0-30,000): extra wait, e.g. 2000 for intro animations.
  • waitForSelector: wait until an element is visible (max 15 s). If it never appears, the row is a free error.
  • scrollToLoad (default on): scrolls the page (max 8 s) before full-page, element or PDF captures, then returns to the top.

Clean-up. hideCookieBanners and blockAds are on by default. hideSelectors takes up to 50 extra selectors (e.g. #intercom-container). darkMode works only on sites that support it. If the page itself is on the ad block list, the row says so: turn blockAds off.

Image and PDF options. quality 1-100 (JPEG/WebP, default 80). fullPageMaxHeight (500-30,000 CSS px, default 20,000) cuts very long pages and sets truncated: true. Warning: WebP is also limited to 16,383 px and JPEG to 65,500 px, divided by pixel density (a 2x WebP is cut at 8,191 CSS px). PDF: pdfFormat, pdfLandscape, pdfMargin (10mm, 0.5in, 0...), pdfPrintBackground, pdfUseScreenCss (off = the site's print stylesheet).

robots.txt (respectRobotsTxt, default on). Checked per RFC 9309 for the WebsiteScreenshot token or *. Disallowed pages are skipped for free. Crawl-delay is honoured per site (max 30 s). If robots.txt returns 429 or 5xx, the site counts as disallowed. Keep it on unless you own the site.

Limits & performance

  • maxConcurrency 0 = automatic: 2 GB memory gives 3 parallel tabs, 4 GB gives 6, 8 GB gives 12. Manual values are capped at 3 tabs per GB. More memory = faster, same price per screenshot.
  • navigationTimeoutSecs (5-120, default 45) and maxRetries (0-3, default 1). Timeouts, network errors and tab crashes are retried; HTTP errors like 403 or 404 are not.

Proxy. Usually not needed. Apify Proxy (datacenter) works; residential proxies are rejected as invalid input.

Full example input

{
"urls": ["https://example.com", "apify.com/pricing", "https://www.wikipedia.org"],
"format": "webp",
"fullPage": true,
"device": "mobile",
"quality": 80,
"waitUntil": "load",
"hideCookieBanners": true,
"blockAds": true,
"hideSelectors": ["#intercom-container"],
"fullPageMaxHeight": 20000,
"respectRobotsTxt": true,
"maxConcurrency": 0,
"navigationTimeoutSecs": 45,
"proxyConfiguration": { "useApifyProxy": false }
}

๐Ÿ“ฆ Output (real run on 2026-10-05)

One row per URL (screenshotUrl shown in its Apify platform form; the local test run wrote a file path):

{
"url": "https://www.wikipedia.org/",
"finalUrl": "https://www.wikipedia.org/",
"status": 200,
"title": "Wikipedia",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/screenshot-wikipedia.org-72e64cabc2.png",
"key": "screenshot-wikipedia.org-72e64cabc2.png",
"format": "png",
"device": "desktop",
"fullPage": true,
"selector": null,
"width": 1920,
"height": 1101,
"bytes": 149002,
"pdfPages": null,
"truncated": false,
"cookieBannersHidden": 0,
"durationMs": 6764,
"takenAt": "2026-10-05T03:42:15Z",
"error": null
}

A failed page is still listed, with error filled in and no file, for example "HTTP 403 - the site blocks automated access (not charged)", "Domain not found (DNS lookup failed)" or "robots.txt of this site does not allow automated access to this page - skipped (not charged)".

Dataset views: Screenshots shows a thumbnail, URL, title, HTTP status, size and error. Links and details adds the final URL, file link, format, device, truncated, PDF pages, overlays hidden, timing and date.

Key-value store:

  • The files, with keys like screenshot-<domain>-<hash>.<ext> (png, jpg, webp, pdf). The hash comes from the URL, so the same URL always gets the same key name.
  • RUN_SUMMARY: URLs requested, screenshots taken, failures by type (http, timeout, dns, robots, blocked...), invalid inputs and duplicates skipped, whether the charge limit was hit, parallel tabs, options, Chromium version and timing. The prefilled run: 3 of 3 in 14.8 s, 4.94 s wall time per screenshot.

Export: download the dataset as JSON, CSV, Excel, XML, RSS or an HTML table, or read it via the API. screenshotUrl links are public, so they work in Google Sheets (=IMAGE(...)), Airtable or Slack without logging in.

๐Ÿ’ต Pricing: $2.50 per 1,000 screenshots

Pay per event: $0.0025 per successful screenshot or PDF (event screenshot), plus Apify's $0.00005 per-run start fee. Browser compute is included.

Typical runCapturesCost
Prefilled example3$0.0075 + $0.00005
20 competitor homepages, daily for 30 days600$1.50 + 30 x $0.00005 = $1.5015
1,000 thumbnails1,000$2.50 + $0.00005
10,000 product pages10,000$25.00 + $0.00005
  • Format, device, full page and retina don't change the price.
  • Free: failed pages (timeouts, HTTP and DNS errors, bot challenges, downloads, missing selectors), robots.txt skips, invalid and duplicate URLs.
  • Max charge per run caps spending: the run stops cleanly at your limit.

Why this price? A real browser needs several CPU-seconds to render a modern page properly (waiting for images, scrolling lazy content, hiding banners). The price covers that compute.

๐Ÿ”Œ Use it via API

Replace YOUR_API_TOKEN with your token from Apify Console (Settings โ†’ API & Integrations).

JavaScript (npm install apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('kadi_bence/website-screenshot').call({
urls: ['https://example.com', 'apify.com/pricing'],
format: 'webp',
device: 'mobile',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.url, item.screenshotUrl ?? item.error);

Python (pip install apify-client)

from apify_client import ApifyClient
client = ApifyClient('YOUR_API_TOKEN')
run = client.actor('kadi_bence/website-screenshot').call(run_input={
'urls': ['https://example.com', 'https://www.wikipedia.org'],
'format': 'pdf',
'pdfFormat': 'Letter',
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item['url'], item['screenshotUrl'] or item['error'])

cURL (runs and returns the rows in one call; best for small batches)

curl -X POST "https://api.apify.com/v2/acts/kadi_bence~website-screenshot/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com"], "format": "jpeg", "fullPage": false}'

Apify CLI

apify call kadi_bence/website-screenshot --input '{"urls": ["https://example.com"]}'
apify call kadi_bence/website-screenshot -f input.json

MCP for AI agents (Claude, Cursor, VS Code and other MCP clients):

{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=kadi_bence/website-screenshot"}}}

๐Ÿ” Integrations & scheduling

Use Apify Schedules (cron) for recurring runs, webhooks to call your URL when a run succeeds, Zapier, Make or n8n to pass screenshotUrl links to other apps, Google Sheets export, and Slack or email integrations for notifications.

  1. Screenshot competitors' homepages daily. Save a task with their homepages and pricing pages (format: jpeg), schedule it every morning, and send the links to Slack. Each row has takenAt, and the key name stays the same per URL, so today's and yesterday's images line up.
  2. Mobile and desktop QA after a release. Start two runs from CI or a webhook (device: desktop and device: mobile) and scan the Screenshots tab.
  3. Archive pages as PDF. Use format: pdf and copy the files to your own storage with Make or n8n, because unnamed run storages are deleted after your plan's retention period.

Website due diligence

Content pipelines

โ“ FAQ

How does it work? Each URL opens in a fresh, isolated headless Chromium context (Playwright), is loaded, scrolled, cleaned up and captured. A crashed browser is relaunched and the page retried.

How fast is it? Simple pages take a few seconds and heavy modern pages 10-20 seconds, with several captured at the same time. With the default 4 GB of memory (6 parallel tabs), expect roughly 500-1,000 full-page screenshots per hour. More memory gives more parallel tabs at the same price per screenshot.

What are the limits? Up to 50,000 URLs per run. Full-page images are cut at 20,000 px by default (WebP at 16,383 px, a format limit), and the row then shows truncated: true. Each page has a 45 s load timeout with one retry. PDFs follow the browser's print layout.

A cookie banner or pop-up is still visible? Add its CSS selector to Hide these elements, and please open an issue with the URL so we can add it to the built-in list.

Some sites fail with 403 or a bot challenge? Large sites (Amazon, Etsy, NYTimes, Zalando...) sometimes block automated browsers. Those rows are free. You can try Apify Proxy (datacenter). Residential proxies are not supported, and challenges are never bypassed. Without a proxy, pages load from Apify's servers (mostly in the US), so sites may show their US version.

Which pages can I capture? Is it legal? Only capture pages you are allowed to: public pages, or your own sites. The Actor never logs in, doesn't bypass paywalls, CAPTCHAs or bot protection, and respects robots.txt by default. The captured content belongs to its owners: copyright and how you use the images or PDFs are your responsibility. Screenshots can contain personal data if the page shows it, so handle them under GDPR or your local laws. This is not legal advice.

Can I use it from my code or an AI agent? Yes: the API, clients, CLI, Make, Zapier, n8n or the MCP server (see above).

How much does a big job cost? $0.0025 per successful capture: 50,000 screenshots (the per-run maximum) cost $125 plus the $0.00005 start fee. Set Max charge per run to cap it.

What if something fails? A failed page gets a row with the reason in error and is not charged; RUN_SUMMARY counts errors by type. If a run fails or a result looks wrong, open an issue in the Issues tab with the run link.

๐Ÿ“ Changelog

  • 1.0 (2026-10-05): First release. PNG/JPEG/WebP/PDF, full page/viewport/element, device presets, dark mode, cookie-banner hiding, lazy-load scrolling, ad blocking, robots.txt, failed pages not charged.
  • 2026-10-05: Store page rewritten.

๐Ÿค Need a custom version?

I build custom scrapers, scheduled data feeds and integrations (CSV, Excel, Google Sheets, API, MCP for AI agents). Tell me the sites and fields you need:

More low-cost Actors by the same developer, built on official APIs and public data:

All my Actors: apify.com/kadi_bence