Website Screenshot & PDF API avatar

Website Screenshot & PDF API

Pricing

from $5.00 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot & PDF API

Website Screenshot & PDF API

Capture full-page screenshots (PNG, JPEG, WebP) and PDFs of any URL. Removes cookie banners, loads lazy images, fixes sticky headers, renders emoji and CJK text. Desktop, tablet, and mobile presets. You pay only for successful captures.

Pricing

from $5.00 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Catalyst Labs

Catalyst Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

26 minutes ago

Last modified

Share

What is Website Screenshot & PDF API?

Website Screenshot & PDF API turns any public URL into a full-page screenshot (PNG, JPEG or WebP) or a PDF, with a direct link to every file. Give it one URL or a few thousand. It loads each page in a real Chrome browser, clicks away cookie banners, loads lazy images, shows sticky headers once instead of on every screen, plays scroll-triggered animations to their final state, hides chat widgets and popups, and then captures the page on desktop, tablet or mobile.

You pay only for files that were actually captured. Pages that fail, time out, are blocked by bot protection, return an HTTP error or render blank are reported with a reason and a fix hint, and they are never charged.

On Apify you also get a REST API, MCP access for AI agents, scheduling, webhooks and integrations (Make, Zapier, n8n, Google Drive and more) without running any servers or browsers yourself.

How to use Website Screenshot & PDF API

  1. Click Try for free (or Start) and open the Input tab.
  2. Add your URLs, one per line. https:// is optional.
  3. Choose formats (PNG is the default; add pdf, jpeg or webp) and a device (desktop, desktop-hd, laptop, tablet, mobile).
  4. Click Start. Each file appears in the Output tab with a preview and a fileUrl download link. The files are in the run's key-value store, and the OUTPUT record has a run summary.

For AI agents

What it does: gives you an image or PDF of a web page so you can "see" it: one dataset record per URL and format, with fileUrl (a direct download link), width/height, title and status.

Minimal input (only urls is required):

{ "urls": ["https://example.com"] }

Cheap first call (one above-the-fold JPEG, $0.018 on the Free plan: $0.01 run start + $0.008 screenshot):

{ "urls": ["https://example.com"], "formats": ["jpeg"], "fullPage": false }
  • MCP tool name: catalyst-labs--website-screenshot-pdf-api (connect https://mcp.apify.com/?tools=catalyst-labs/website-screenshot-pdf-api), or use call-actor with catalyst-labs/website-screenshot-pdf-api.
  • Cost: $0.01 per run, plus $0.008 per screenshot on the Free plan (down to $0.005 on Gold and above) and $0.012 per PDF. Failed, blocked, blank and skipped URLs are free. Pass maxTotalChargeUsd in the run options for a hard cap. URLs that don't fit the cap are skipped and marked SPENDING_LIMIT, and the run still ends as SUCCEEDED.
  • Output fields: url, status (success / failed / skipped), format, fileUrl, key, bytes, width, height, pageHeight, truncatedAtMaxHeight, pdfPages, title, finalUrl, httpStatus, cookieBannerDismissed, errorType, hint. The OUTPUT record lists every URL with its status and a fix hint, so you can retry on your own (for example with a residential proxy after BLOCKED).
  • Speed: at the default 4 GB a typical page takes 5-60 seconds, and very tall or animation-heavy pages up to about 2 minutes (they are now captured in full). At 2 GB (half a vCPU) expect roughly twice that. Two pages run in parallel at 2-4 GB memory (4 at 8 GB); new pages wait while memory or CPU is saturated. Limited permissions, pay per event, no Standby.
  • Known limits: login-only pages need cookies. Sites with strong bot protection (for example NYTimes, WSJ, Indeed, G2 or Zillow) block data-center IPs. Apify residential proxy (proxyConfiguration) gets through on some of them (El País, sometimes NYTimes in our tests) but not reliably on the strongest walls; those fail as BLOCKED and are not charged. Full-page captures are cut at maxHeight (default 36,000 device pixels: 36,000 CSS px on desktop, 12,000 on mobile at 3x; maximum 50,000 CSS px; WebP stops at 16,383 px), and the cut is flagged in the output.

When to choose this tool

Facts you can check against the run output:

  • Charged only for delivered files. Failed, blocked (bot-check), HTTP-error, blank and over-budget URLs are reported with errorType and a hint, and are free.
  • Four formats in one run: PNG, JPEG, WebP and PDF (paper size, margins, landscape, print/screen media, or one single long page).
  • Cookie banners clicked away on 30+ consent platforms (OneTrust, Didomi, Sourcepoint, Quantcast, Cookiebot, Usercentrics and others) plus "Accept" text in 30+ languages; tested on The Guardian, BBC, Spiegel, Le Monde, Corriere and nu.nl.
  • Lazy images loaded, growing pages scrolled until they stop growing (bounded), scroll-triggered animations finished, and sticky headers shown once on full-page captures; emoji and Chinese/Japanese/Korean/Arabic text render with bundled fonts.
  • Tested in the Apify cloud on 39 URLs × 2 devices plus 10 option scenarios before release (see Tested on).

Pick something else if you need a live HTTP endpoint with sub-second latency (this Actor runs as batch jobs, typically 5-60 s per page) or reliable access to sites behind enterprise bot protection.

Who is it for?

AI agents and LLM apps

  • Give your agent eyes. Pass fileUrl to a vision model to check a layout, read a chart or confirm that a page changed.
  • Predictable and safe to automate. Every URL gets exactly one record per format with status and errorType, and nothing is charged for failures.

QA, release checks and monitoring

  • Visual regression and release screenshots on desktop, tablet and mobile at retina resolution (mobile is iPhone size at 3x).
  • Schedule it (for example every morning) with a fixed fileNamePrefix to compare pages over time, or capture only one component with captureSelector.

Archiving and compliance

  • PDFs or full-page images with the page title, final URL, HTTP status and capture time, which works well as evidence of what a page showed and when. Use pdfMediaType: "print" for clean article PDFs, or pdfSinglePage: true for one long page with no page breaks.

Reporting pipelines and SEO

  • Competitor pages, landing pages and dashboards captured in batches, linked straight from the dataset into Sheets, Slack or a report.

Fixes for the most common screenshot-tool complaints

Common complaint (Apify reviews/issues, screenshot API forums)What this Actor does
"Cookie popup covers the content"Clicks Accept on about 20 consent platforms (OneTrust, Didomi, Sourcepoint, Quantcast, Cookiebot, Usercentrics, TrustArc, Google Funding Choices, iubenda, CookieYes...) or on an accept button in 18 languages, then hides what's left.
"Sticky navbar repeated all over the full-page image"stickyElements: "static" shows headers once at the top; "hide" removes them.
"Images/thumbnails missing" (lazy loading)Scrolls the page in steps with short pauses, keeps going while the page grows (bounded by maxScrollHeight), promotes data-src/loading=lazy images, waits for them, then returns to the top.
"Animated sections are blank" (fade-in on scroll)Lays the whole page out in one tall viewport so every scroll trigger fires, then jumps CSS/JS animations to their final frame (freezeAnimations, on by default).
"Bottom of long pages is blank"Paints content-visibility sections, does not break body scrolling, and stitches tiles above Chrome's ~16k-pixel single-capture limit.
"Emoji show as boxes", CJK text missingShips Noto Color Emoji, Noto CJK and core fonts.
"Can't set the height / capture only the top"fullPage: false, a custom width/height, maxHeight or captureSelector for one element.
"Loading forever / stuck run"Bounded waits at every step, a hard per-URL timeout, and browser restart after a crash. One slow ad can't stall the run.
"It didn't work and still used my credits"Only real captures are charged. Error pages, bot walls, blank renders and timeouts are free and come with a fix hint.
"Slow and expensive"No per-run memory surprise: a flat price per file, ads/trackers blocked, and parallel pages sized to the run's memory.

Input example

{
"urls": ["https://apify.com", "https://www.theguardian.com/international"],
"formats": ["png", "pdf"],
"device": "mobile",
"dismissCookieBanners": true,
"stickyElements": "static",
"maxHeight": 20000
}

All options are on the Input tab. They include waitUntil, waitForSelector, delayMs, captureSelector, hideSelectors, customCss, darkMode, headers, cookies, the PDF options (pdfFormat, pdfLandscape, pdfMargin, pdfMediaType, pdfSinglePage), captureErrorPages, captureBlockedPages, retryBlockedWithProxy, freezeAnimations, maxScrollHeight, timeouts, retries and proxy.

Output example

{
"url": "https://www.theguardian.com/international",
"status": "success",
"format": "png",
"fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/0000-www.theguardian.com-international.png?signature=...",
"key": "0000-www.theguardian.com-international.png",
"contentType": "image/png",
"bytes": 17235046,
"width": 1440,
"height": 22664,
"pageHeight": 22664,
"truncatedAtMaxHeight": false,
"device": "desktop",
"title": "News, sport and opinion from the Guardian's global edition | The Guardian",
"finalUrl": "https://www.theguardian.com/international",
"httpStatus": 200,
"cookieBannerDismissed": true,
"cookieBannerMethod": "known:button.sp_choice_type_11",
"errorType": null,
"charged": true,
"capturedAt": "2026-10-19T00:30:00.000Z"
}

A failed URL looks like {"url": "https://www.nytimes.com/", "status": "failed", "errorType": "BLOCKED", "hint": "The site served a bot check. Retry with proxyConfiguration ...", "charged": false}.

Error types: INVALID_URL, BLOCKED, HTTP_ERROR, DNS_ERROR, CONNECTION_ERROR, TLS_ERROR, TIMEOUT, SELECTOR_NOT_FOUND, BLANK_PAGE, BROWSER_CRASH, REDIRECT_LOOP, NETWORK_ERROR, SPENDING_LIMIT.

How much does it cost to capture website screenshots?

Pay per event. You pay only for files that were delivered, with no separate charge for Apify platform usage. Prices drop with your Apify plan.

EventFreeBronzeSilverGold and above
Run started (once per run)$0.01$0.01$0.01$0.01
Screenshot (PNG, JPEG or WebP file)$0.008$0.007$0.006$0.005
PDF file$0.012$0.012$0.012$0.012

Cost examples (Free plan):

  • 1 screenshot: $0.018 ($0.01 run start + $0.008).
  • 100 full-page screenshots in one run: $0.81.
  • 1,000 screenshots in one run: $8.01 ($5.01 on Gold).
  • 1,000 URLs as both PNG and PDF: $20.01.

Failed, blocked, blank and skipped URLs cost nothing. Each format you request is a separate file, and each file is charged once. To cap a run, set Maximum cost per run (maxTotalChargeUsd). The Actor stops cleanly before the cap and marks the remaining URLs SPENDING_LIMIT. Apify's $5 free monthly credit covers roughly 600 screenshots on the Free plan when you batch URLs into a few runs. Proxy traffic, including residential proxy if you turn it on, is included in these prices.

Tested on

Cloud QA, October 18, 2026, build 1.0.12, default settings (4 GB, no proxy set):

  • Desktop: 30 of 39 URLs captured, full length up to the 36,000 px default (React, Vercel, Linear, Figma, Notion, Airbnb, Amazon, Medium, Apple, Stripe, The Guardian, BBC, Le Monde, Spiegel, Corriere, El País, nu.nl, Zillow, Baidu, Yahoo Japan, Naver, Russian and English Wikipedia, Al Jazeera, Hacker News, GitHub, USA.gov, getemoji.com, Shopify, httpbin). Correctly refused and not charged: 6 bot walls (Unsplash, Zeit, NYTimes, WSJ, G2, FT; each retried once through Apify Proxy), Indeed (connection refused), a nonexistent domain and a 404 page.
  • Mobile (iPhone, 3x): 27 of 39 captured. Medium, El País and Zillow also blocked on this run (bot walls vary by IP); none were charged.
  • Options: all 4 formats in one run, PDF Letter/landscape/print, single-page PDF, element capture, wait-for-selector, dark mode, tablet viewport, custom size and 2x scale, custom headers and cookies, hidden selectors, custom CSS, file-name prefix, error-page capture and max-height cut-off behaved as expected; invalid URLs, a DNS error and an HTTP 500 failed with the right error type and were not charged; an expired TLS certificate and a 60 s slow response were captured.

FAQ

How long do the file links work? fileUrl is a signed link to the run's key-value store, and anyone with the link can open it, with no token needed. Default run storage is kept for 7 days on the Apify Free plan and longer on paid plans. To keep files indefinitely, rename (name) the run's key-value store or copy the files to your own storage with an integration.

Can it capture pages behind a login? Yes, if you pass the session cookies (or an Authorization header). Only capture pages you are allowed to access.

Why did a site fail with BLOCKED? Some sites block cloud/data-center IPs. By default the Actor retries a blocked URL once through Apify Proxy (data-center) with a fresh browser context (retryBlockedWithProxy, on by default; skipped when you set your own proxy). If it is still blocked, retry with "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}. This helps on some sites but not all: in our October 2026 tests, the strongest bot walls (WSJ, G2, Zillow, Indeed, FT) still blocked residential IPs. Blocked attempts are not charged by this Actor.

Does it capture HTTPS sites with certificate errors? Yes. Certificate errors are ignored, so expired or self-signed staging sites can still be captured.

Very long pages? Full pages up to 36,000 device pixels are captured by default (on desktop that fits a full English Wikipedia article of about 26,000 px or Spiegel's homepage of about 32,500 px). Raise maxHeight up to 50,000 CSS px, or lower it to cap file size; WebP is limited to 16,383 px. The per-URL timeout is extended automatically for very tall pages. Use JPEG for smaller files: the 22,664 px Guardian homepage was 17 MB as PNG and 2.8 MB as JPEG in our test.

Is it legal? Capturing publicly visible pages is generally fine, but you are responsible for how you use the images (copyright, personal data, terms of service). Don't use it to capture content you have no right to access.

Something broke? Open an issue on the Issues tab with the URL and the run ID. Fixes usually ship within a few days.