Website Screenshot & PDF Capture
Pricing
from $2.50 / 1,000 screenshot captureds
Website Screenshot & PDF Capture
Capture bulk website screenshots (PNG, JPEG, WebP) or PDFs. Full page, single element, mobile and tablet presets, dark mode, cookie-banner hiding and lazy-image scrolling. Pay only for successful captures.
Pricing
from $2.50 / 1,000 screenshot captureds
Rating
0.0
(0)
Developer
Kiwi Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Turn a list of web pages into PNG, JPEG or WebP screenshots or PDF files in one run. Paste up to 1,000 URLs, pick a device and a format, and download one file per page. Full-page captures, single-element captures, mobile and tablet views, dark mode, and automatic hiding of cookie pop-ups are built in.
You pay only for files that were actually produced. Failed, blocked or skipped URLs are free.
What you can use it for
- Visual archives and "before/after" records of your own sites or landing pages
- Thumbnails and previews for directories, link lists and dashboards
- Checking how pages look on phones, tablets and desktops
- Turning articles, docs or reports into PDFs
- Feeding page images to AI or vision workflows (works well as a tool for AI agents)
Features
- Bulk: up to 1,000 URLs per run, captured in parallel
- Formats: PNG (lossless), JPEG and WebP (adjustable quality), or PDF (A4, Letter, Legal, A3, Tabloid; portrait or landscape)
- Devices: Desktop 1920×1080, Laptop 1366×768, Tablet 768×1024 @2x, iPhone 390×844 @3x, Android 412×915 @2.625x, or any custom width × height × pixel ratio
- Full page or just one element (CSS selector), e.g. a chart, a pricing table or a product card
- Lazy images: optional scroll-through before capturing so lazy-loaded images appear
- Cookie pop-ups hidden with a built-in ruleset for common consent tools (the overlay is hidden; no consent choice is made)
- Hide anything else (chat bubbles, promo bars) with your own CSS selectors
- Dark mode for sites that support it
- Wait options:
load,domcontentloadedornetworkidle, plus an extra delay - Safe by design: only public
http(s)addresses are captured; local, private-network andfile:addresses are refused, including after redirects - Optional ZIP with all files, and an optional proxy
How to use it
- Paste your URLs into URLs (one per line).
- Choose an Output format and a Device.
- Optionally switch on Full page, set an Element selector, or tweak the loading options.
- Click Start. Each file appears in the run's key-value store, and the dataset lists every URL with a direct link to its file.
Example: full-page mobile screenshots
{"urls": ["https://example.com", "https://example.org/pricing"],"format": "jpeg","quality": 80,"device": "iphone","fullPage": true,"scrollToBottom": true}
Example: capture one element
{"urls": ["https://example.com/dashboard"],"format": "png","selector": "#sales-chart","device": "laptop"}
Example: save pages as PDFs
{"urls": ["https://example.com/blog/post-1", "https://example.com/blog/post-2"],"format": "pdf","pdfFormat": "A4","pdfPrintBackground": true}
Example: dark mode WebP at a custom size
{"urls": ["https://example.com"],"format": "webp","device": "custom","width": 1440,"height": 900,"deviceScaleFactor": 2,"darkMode": true,"hideSelectors": [".chat-widget", "#promo-bar"]}
Input
| Field | Type | Default | Description |
|---|---|---|---|
urls | array of strings | (required) | Public URLs to capture, max 1,000. https:// is added if missing. |
format | png · jpeg · webp · pdf | png | Output format. |
quality | integer 1–100 | 85 | JPEG/WebP quality. |
device | desktop · laptop · tablet · iphone · android · custom | desktop | Viewport preset. |
width, height | integer | 1280, 800 | Custom viewport in CSS px (only with custom). |
deviceScaleFactor | number 0.5–3 | 1 | Custom pixel ratio (only with custom). |
fullPage | boolean | false | Capture the whole page height (capped, see Limits). |
selector | string | – | Capture only the first element matching this CSS selector (images only). |
waitUntil | load · domcontentloaded · networkidle | load | When the page counts as loaded. |
delayMs | integer 0–30000 | 0 | Extra wait before capturing. |
scrollToBottom | boolean | false | Scroll through the page first to trigger lazy images. |
hideCookieBanners | boolean | true | Hide common cookie/consent pop-ups. |
hideSelectors | array of strings | – | Extra CSS selectors to hide. |
darkMode | boolean | false | Request the site's dark theme (prefers-color-scheme: dark). |
pdfFormat | A4 · Letter · Legal · A3 · Tabloid | A4 | PDF paper size. |
pdfLandscape | boolean | false | Landscape PDF. |
pdfPrintBackground | boolean | true | Include background colours and images in PDFs. |
pdfUseScreenMedia | boolean | false | Use on-screen styles instead of the print stylesheet. |
timeoutSecs | integer 5–180 | 60 | Time limit per URL. |
maxConcurrency | integer 1–10 | 3 | Pages captured in parallel (about 1 GB memory per 2 pages). |
skipHttpErrors | boolean | true | Don't capture or charge for pages answering HTTP 4xx/5xx. |
zipOutput | boolean | false | Also store ALL_CAPTURES.zip with every file (free). |
proxy | proxy settings | off | Optional proxy. Proxy traffic is billed by the platform separately. |
Output
Files go to the run's default key-value store, named like shot-0001-example-com.png or pdf-0002-example-org-pricing.pdf.
Dataset: one row per URL (index is the position in your input list):
{"index": 0,"url": "https://example.com","finalUrl": "https://example.com/","httpStatus": 200,"title": "Example Domain","fileKey": "shot-0001-example-com.png","fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/shot-0001-example-com.png","format": "png","width": 1920,"height": 1080,"pages": null,"bytes": 80185,"truncated": false,"captureMethod": "viewport","capturedAt": "2026-10-18T09:51:45.619Z","charged": true,"blockedRequests": 0,"durationMs": 1240,"ok": true,"error": null}
Failed rows have "ok": false, "charged": false and a plain-English error such as Timed out after 60 s, Page returned HTTP 404 or Rejected URL: Address 10.0.0.1 is not a public IP.
Pricing
This Actor uses pay-per-event pricing. You are charged only after a file has been saved:
| Event | Price | When it is charged |
|---|---|---|
screenshot | US$0.0025 per image (US$2.50 per 1,000) | A PNG, JPEG or WebP file was saved |
pdf | US$0.003 per PDF (US$3.00 per 1,000) | A PDF file was saved |
| Actor start | small platform start fee | Once per run |
- Not charged: URLs that fail, time out, are refused by the safety check, return an HTTP error (with
skipHttpErrorson), or are skipped. - Spending limit: set Maximum cost per run in the run options. The Actor checks it before every capture and stops cleanly when the limit is reached; the remaining URLs are listed as skipped (not charged).
- The price already includes the compute the capture needs. Optional proxy traffic is billed separately by the platform.
- You can try it on the Apify Free plan; charges are taken from your plan's monthly usage credit.
Limits and good to know
- Page height is capped at 20,000 CSS px (and 32,000 device pixels; 16,383 px for WebP, a format limit). Taller pages are cut at the cap and marked
"truncated": true. - On a few very heavy pages the browser's one-shot full-page capture stalls; the Actor then reloads the page and stitches viewport tiles together (
"captureMethod": "stitched"). Fixed headers appear once at the top. - No logins: the Actor does not accept cookies, sessions or passwords, so pages behind a login can't be captured.
- Cookie pop-ups are hidden, not answered. Some sites redirect to a separate consent page instead of showing a pop-up; that page is what gets captured.
- Some sites block automated browsers or show a CAPTCHA. The Actor does not try to bypass such protections.
- PDFs use the browser's print engine, so sites with a print stylesheet look different from the screen; switch on
pdfUseScreenMediato use screen styles.
Responsible use
Only submit URLs you have the right to capture, and respect the terms of the websites you capture and any copyright in their content. This Actor visits each URL once, like a normal browser; it does not crawl links. It is an independent tool and is not affiliated with or endorsed by any website it captures.
FAQ
Can I call it from my own code or an AI agent? Yes. Like any Actor it can be started through the Apify API, the API clients, integrations, or the Apify MCP server, and its input schema describes every option.
Why did a URL fail with "Rejected URL"?
The safety check only allows public internet addresses. localhost, private networks (10.x, 192.168.x, etc.), cloud metadata addresses and file: links are always refused.
Are the files public? Files live in your run's key-value store and follow your storage settings and retention, like any other run output.