Website Screenshot & PDF Generator
Pricing
from $6.00 / 1,000 screenshots
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
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
- Paste one or more URLs.
- Pick the devices and the format.
- 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"}
cookieBannersays what happened:refused (consent tool),accepted (…),2 elements hiddenornone found.truncatedistruewhen the page was taller than Max page height.- A page that fails gets a row with an
errorinstead, 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
OUTPUTrecord is the file itself. With several files,OUTPUTis 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 ApifyClientclient = 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 screencurl "https://webthreenity--website-screenshot-pdf.apify.actor/screenshot?url=https://example.com&device=iphone&fullPage=false&token=YOUR_TOKEN" -o phone.pngcurl "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 bytescurl "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.
How cookie banners are handled
| Setting | What 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 all | Clicks "Accept all". Use it when a site only shows its content after consent. |
| Hide only | Never clicks. Banners are hidden and their scripts blocked. |
| Keep banners | The 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.
| Event | Price |
|---|---|
| Screenshot (PNG, JPEG or WebP) | $6.00 per 1,000 |
| $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
403bot wall, a404, a500. 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.