Website Screenshot & PDF Generator avatar

Website Screenshot & PDF Generator

Pricing

from $6.00 / 1,000 screenshots

Go to Apify Store
Website Screenshot & PDF Generator

Website Screenshot & PDF Generator

Screenshot any website or HTML as PNG, JPEG, WebP or PDF. Full page with lazy-loaded images, 13 devices in one run, cookie banners refused and hidden, ads blocked, real PDF layout options. Batch, sitemap or a live HTTP API.

Pricing

from $6.00 / 1,000 screenshots

Rating

0.0

(0)

Developer

WebThreenity

WebThreenity

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Capture any web page, or your own HTML, as a PNG, JPEG, WebP or PDF. Full page with lazy-loaded images, desktop and phone sizes in the same run, cookie banners refused and hidden, ads blocked. Run it as a batch, point it at a sitemap, or call it as a live HTTP API that returns the file in one request.

  • Clean pages. Refuses cookie pop-ups by clicking "Reject" or "Necessary only" on 300+ consent tools, then hides whatever is left. Blocks ads and trackers with EasyList, EasyPrivacy and uBlock Origin filters.
  • Whole pages. Lazy images are loaded before the capture, so long pages don't come out with grey boxes. Pages up to 60,000 px tall.
  • 13 devices in one run. Desktop, laptop, MacBook Retina, 2K, iPad, iPhone 16, iPhone 16 Pro Max, iPhone SE, Pixel 9, Galaxy S24, a 1200×630 social card, a square, or your own size. Every URL is captured on every device you pick.
  • Real PDFs. A4, Letter, Legal, A3, A5 or Tabloid. Portrait or landscape, margins, page numbers, print or screen look, or the whole site as one long page with no page breaks.
  • Your own HTML. Turn an invoice, a report or a social card template into a PDF or an image.
  • Built for code and AI agents. A single-URL run returns the file itself, Standby mode answers an HTTP request with the file, and you can put the file in the dataset as base64.
  • You don't pay for failures or bot walls. Failed pages are free, and so are pages a site answers with an error such as 403 Access Denied.

What you can do with it

  • Archive client websites or competitors every week (schedule the Actor).
  • Make responsive previews: one URL, desktop + tablet + phone, in one run.
  • Generate PDFs of reports, documentation or invoices from HTML.
  • Add website thumbnails to a directory, a CRM or a portfolio.
  • Capture an entire site from its sitemap for an audit or a redesign brief.
  • Give an AI agent eyes: it gets a clean image of the page, without the cookie wall.

Quick start

  1. Paste one or more URLs.
  2. Pick the devices and the format.
  3. Click Start. Files appear in the Output tab with a preview, and in the run's key-value store.

That's all most people need. Every other option has a sensible default.

Input examples

One page, full length, PNG

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

Responsive set: desktop, iPad and iPhone

{
"urls": ["https://stripe.com", "https://www.lemonde.fr"],
"devices": ["desktop", "ipad", "iphone"],
"format": "webp"
}

PDF with page numbers

{
"urls": ["https://en.wikipedia.org/wiki/Morocco"],
"format": "pdf",
"pdfFormat": "A4",
"pdfMargin": "15mm",
"pdfPageNumbers": true
}

The whole website as one long PDF page

{ "urls": ["https://apify.com"], "format": "pdf", "pdfSinglePage": true }

An invoice from your own HTML

{
"html": "<html><body><h1>Invoice INV-0042</h1><p>Total: 1,250.00 EUR</p></body></html>",
"format": "pdf",
"pdfFormat": "A4"
}

Every page of a sitemap, as phone screenshots

{ "sitemapUrl": "https://example.com/sitemap.xml", "maxSitemapPages": 200, "devices": ["iphone"] }

One element only

{ "urls": ["https://en.wikipedia.org/wiki/Morocco"], "selector": ".infobox" }

A page behind a login (session cookie)

{
"urls": ["https://app.example.com/dashboard"],
"cookies": [{ "name": "session", "value": "YOUR_SESSION", "domain": ".example.com" }]
}

Output

Each file goes to the run's key-value store, and one row per file goes to the dataset:

{
"url": "https://www.spiegel.de/",
"finalUrl": "https://www.spiegel.de/",
"device": "iphone",
"format": "png",
"fileUrl": "https://api.apify.com/v2/key-value-stores/.../records/spiegel-de-iphone-3e331591.png",
"width": 1179,
"height": 24000,
"sizeKb": 9861.3,
"statusCode": 200,
"title": "DER SPIEGEL | Online-Nachrichten",
"cookieBanner": "refused (sourcepoint-top)",
"truncated": true,
"loadTimeMs": 8120,
"capturedAt": "2026-10-20T18:42:11.204Z"
}
  • cookieBanner says what happened: refused (consent tool), accepted (…), 2 elements hidden or none found.
  • truncated is true when the page was taller than Max page height.
  • A page that fails gets a row with an error instead, and is not charged. The one exception is residential proxy traffic, which costs us the same whether the page works or not (see Pricing).
  • With residential proxies, each row also has residentialTrafficMb: the traffic charged for that page.
  • When you capture a single file, the run's OUTPUT record is the file itself. With several files, OUTPUT is a short summary with every file URL.

Use it from your code

One call, get the image back (the run's OUTPUT is the file):

curl -X POST "https://api.apify.com/v2/acts/webthreenity~website-screenshot-pdf/run-sync?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "device": "iphone"}' \
-o screenshot.png

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('webthreenity/website-screenshot-pdf').call({
urls: ['https://example.com'],
devices: ['desktop', 'iphone'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => i.fileUrl));

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("webthreenity/website-screenshot-pdf").call(run_input={"urls": ["https://example.com"], "format": "pdf"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["fileUrl"])

Live HTTP API (Standby)

Standby keeps a browser warm and answers each request with the file. Every input field works as a query parameter or as a JSON body field. Copy your Standby URL from the Standby tab.

# PNG of a phone screen
curl "https://webthreenity--website-screenshot-pdf.apify.actor/screenshot?url=https://example.com&device=iphone&fullPage=false&token=YOUR_TOKEN" -o phone.png
# PDF
curl "https://webthreenity--website-screenshot-pdf.apify.actor/pdf?url=https://example.com&pdfPageNumbers=true&token=YOUR_TOKEN" -o page.pdf
# Metadata and a stored file URL instead of the bytes
curl "https://webthreenity--website-screenshot-pdf.apify.actor/screenshot?url=https://example.com&response=json&token=YOUR_TOKEN"

Responses carry X-Width, X-Height, X-Final-Url, X-Status-Code, X-Cookie-Banner and X-Charged headers. Errors come back as JSON: 400 for invalid input, 422 when the page can't be captured as asked (private address, unknown domain, missing element), 502 when the site failed. None of them are charged. One URL and one device per request; use a normal run for batches.

SettingWhat happens
Refuse, then hide leftovers (default)Clicks "Reject all" or "Necessary only" using DuckDuckGo's open-source rules for 300+ consent tools (OneTrust, Didomi, Sourcepoint, Cookiebot, Usercentrics, Quantcast, TrustArc, Axeptio, tarteaucitron and many more). Anything still on screen is hidden with the EasyList Cookie and uBlock Origin cookie lists, and the page is unlocked if the banner had frozen scrolling.
Accept allClicks "Accept all". Use it when a site only shows its content after consent.
Hide onlyNever clicks. Banners are hidden and their scripts blocked.
Keep bannersThe page exactly as a first-time visitor sees it.

Refusing is the default because it is what a privacy-minded visitor does, and refused pages usually load fewer trackers and ads.

Pricing

Pay per event: you pay for each file delivered. Memory and run time are on us.

EventPrice
Screenshot (PNG, JPEG or WebP)$6.00 per 1,000
PDF$8.00 per 1,000
Residential proxy traffic (only if you pick residential proxies)$0.012 per MB

Example: 500 pages on desktop and iPhone = 1,000 screenshots = $6.00.

Not charged:

  • Pages that fail (timeout, unknown domain, missing element).
  • Pages the site answers with an error: a 403 bot wall, a 404, a 500. You still get the file, and its row says "charged": false.
  • Datacenter proxies.

Residential proxies are billed by the traffic they carry, because that is how they cost us: an ad-blocked page uses about 7 MB on average, so about $0.08. Ads and trackers are blocked before they reach the proxy. Each row shows its residentialTrafficMb. This traffic is charged even when the page then fails.

Standby (live API): Apify bills Standby's platform usage on top of the file price, because the browser stays warm between requests.

Good to know

  • Very long pages are cut at Max page height (20,000 px by default, up to 60,000). WebP files cannot exceed 16,383 px, so tall WebP captures are cut there. A one-page PDF can be up to 200 inches tall.
  • Sites that block robots (Cloudflare challenges, CAPTCHAs) are not bypassed. Residential proxies and session cookies help on some of them.
  • Private addresses (localhost, internal networks, cloud metadata) are refused.
  • Animations are stopped before the capture, and the caret is hidden.
  • Timeouts: a page that has shown content is still captured when its slowest requests never finish.
  • Files are kept for as long as your Apify plan keeps the run's storage. Download them or copy them to your own storage if you need them longer.

Coming from Apify's Website Screenshot Generator?

Your existing input works unchanged: urls as { "url": ... } objects, viewportWidth, scrollToBottom, delay, waitUntil (including networkidle2) and selectorsToHide are all accepted. You get full-page captures, cookie banner handling, devices, WebP and PDF on top.

FAQ

Can I capture pages that need a login? Yes. Pass session cookies in Cookies, or a token in Extra HTTP headers.

How do I get a sharper image? Pick MacBook Retina or a phone (2× to 3× pixel density), or set Custom pixel density to 2.

Can it click something first, like a tab or a "Load more" button? Yes, with Custom JavaScript: document.querySelector('.tab-2').click(). Add an Extra delay if the content takes a moment to appear.

Is it legal to screenshot websites? Capturing public pages is generally fine. Respect each site's terms of use and copyright when you publish or reuse what you capture.

Open-source components

DuckDuckGo autoconsent (MPL-2.0) for consent pop-ups, Ghostery adblocker (MPL-2.0) with EasyList, EasyPrivacy and uBlock Origin filter lists, and Playwright (Apache-2.0) with Chromium.

Support

Found a page that doesn't come out right? Open an issue on the Issues tab with the URL and your input. Made by WebThreenity.