Website Screenshot and PDF
Pricing
from $2.00 / 1,000 screenshots
Website Screenshot and PDF
Capture a batch of public web pages as PNG, JPEG, WebP or PDF: full page or viewport, one element by CSS selector, desktop, tablet and mobile presets, dark mode, hidden cookie banners. One result per URL with file URL and size; failed URLs are not charged.
Pricing
from $2.00 / 1,000 screenshots
Rating
0.0
(0)
Developer
Soso Pkhakadze
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Turn a list of public web pages into PNG, JPEG or WebP screenshots or PDF documents in one run. Capture the visible screen or the whole scrollable page, a single element by CSS selector, on desktop, laptop, tablet or mobile, in light or dark mode, with cookie banners and other clutter hidden. Every URL gets its own result with a direct file link, the image size in pixels and a clear error code when something goes wrong. URLs that fail are not charged.
What you can do with it
- Monitor pages over time. Schedule a run and keep a visual record of a pricing page, a landing page or a competitor's home page.
- Check responsive layouts. Capture the same pages as desktop, tablet and mobile.
- Archive pages as PDF. Print articles, documentation or receipts from public pages into A4 or Letter PDFs.
- Make thumbnails and previews. WebP and JPEG at the quality you choose keep files small.
- Grab one component. Capture only
header,#pricingor any other element instead of the full page. - Give an AI agent eyes. Results are flat JSON with a
fileUrlper page, so an agent calling this Actor through the Apify MCP server gets a link it can open or pass on.
Features
| Option | What it does |
|---|---|
| Batch of URLs | Up to 1,000 public URLs per run, 2 at a time by default (up to 5). Duplicates are captured once. |
| Formats | PNG, JPEG, WebP (quality 1 to 100) and PDF (A4, Letter, Legal, A3, Tabloid, portrait or landscape). |
| Full page or viewport | Full page captures stop at a maximum height you set (15,000 px by default) and are marked truncated. |
| Element capture | selector captures the first matching element only. |
| Device presets | Desktop 1920x1080, laptop 1366x768, tablet 800x1280 at 2x, mobile 412x915 at 2.625x, or your own width, height and pixel density. |
| Dark mode | Emulates prefers-color-scheme: dark (or light, or no preference). |
| Waiting | Page load, HTML parsed, network idle or first response; wait for a selector to become visible; extra delay up to 30 s. A page whose load event never arrives is still captured and marked pageLoaded: false, instead of failing. |
| Lazy content | Optional scroll through the page before capture so lazy images load. |
| Hide clutter | Hide any elements by CSS selector, and optionally the banners of common consent tools (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and others). Hiding is CSS only; nothing is clicked, accepted or refused. |
| Language | Send an Accept-Language header to see a localised version of a site. |
| Error pages | Pages that answer 404, 403, 500 and similar are reported as errors and not charged, unless you ask to capture them. |
| Retries | Dropped connections and browser crashes are retried once by default. Timeouts are not retried. |
What it does not do
This Actor captures what an anonymous visitor sees. It does not log in, accept cookies, solve captchas, rotate
proxies or change its identity to get past bot protection. Pages that block automated browsers come back as an
error or show the block page. URLs with credentials in them, localhost, private networks and non-web schemes
are refused. Only the headers Accept-Language, Referer, DNT, Sec-GPC, Cache-Control and Pragma can be set.
Input
The only required field is urls. A minimal input:
{"urls": ["https://apify.com", "https://example.com"],"format": "png","fullPage": true}
A mobile, dark mode WebP capture with banners hidden:
{"urls": ["https://github.com"],"format": "webp","device": "mobile","colorScheme": "dark","fullPage": true,"hideCookieBanners": true,"hideSelectors": ["#chat-widget"]}
A German language PDF:
{"urls": ["https://en.wikipedia.org/wiki/Tbilisi"],"format": "pdf","pdfFormat": "A4","headers": { "Accept-Language": "de-DE" }}
See the Input tab for every option with its limits.
Output
Files are stored in the run's default key-value store. The dataset has one record per input URL. fileUrl is a
signed link (it ends in ?signature=...) that downloads the file without an API token, so you can hand it to another
tool or an agent directly.
A successful capture:
{"status": "ok","url": "https://example.com/","finalUrl": "https://example.com/","httpStatus": 200,"pageTitle": "Example Domain","pageLoaded": true,"fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/0002-example-com-a4df5e24d0.png","key": "0002-example-com-a4df5e24d0.png","format": "png","contentType": "image/png","bytes": 14723,"width": 1920,"height": 1080,"device": "desktop","viewport": { "width": 1920, "height": 1080, "deviceScaleFactor": 1 },"colorScheme": "light","fullPage": true,"selector": null,"truncated": false,"pdfFormat": null,"attempts": 1,"durationMs": 3792,"charged": true,"capturedAt": "2026-09-14T00:59:05.820Z","errorCode": null,"errorMessage": null}
A failed URL has the same fields, with status: "error", fileUrl: null, charged: false and an errorCode:
| errorCode | Meaning |
|---|---|
timeout | The HTML did not arrive within the navigation timeout, or the image took too long to render. |
dns_not_resolved | The domain does not exist. |
http_error_status | The page answered 400 or above; httpStatus has the code. |
tls_error | The site's certificate is invalid. |
connection_refused, connection_reset | The server closed or refused the connection. |
selector_not_found, wait_for_selector_timeout | The CSS selector you gave matched nothing. |
private_address, unsupported_scheme, credentials_in_url, invalid_url | The URL was refused before any request. |
browser_crashed, capture_failed | The browser could not render the page, usually a very heavy page. |
width and height are the image size in pixels, so a mobile capture at 2.625x is 1082 pixels wide. For PDF they
are null. A record with status: "skipped" means the run reached your maximum cost before that URL (see Pricing).
A run summary is stored as OUTPUT in the key-value store: totals of ok, error and skipped records and error counts
by code. The run itself succeeds when every URL was handled, even if some of them failed, so check status per record.
Pricing
Pay per event, with browser compute included:
| Event | Price |
|---|---|
| Actor start: once per run, $0.001 per GB of memory | $0.002 at the default 2 GB |
screenshot: one viewport or element image (PNG, JPEG or WebP) stored | $0.002 ($2.00 per 1,000) |
screenshot-full-page: one full page image stored | $0.004 ($4.00 per 1,000) |
pdf: one PDF stored | $0.004 ($4.00 per 1,000) |
Examples: 1,000 viewport screenshots in one run cost $2.002. A scheduled run that captures one full page every day costs $0.006 a day.
- A charge is made only after the file is stored. URLs that fail, time out, answer with an error status or match no selector cost nothing.
- The Actor respects your maximum cost per run. Before each capture it checks that the remaining budget covers
it; when it does not, the remaining URLs are returned as
skippedand nothing more is charged. - Stored files count toward your Apify storage like any other key-value store data, and unnamed run storage is removed after your plan's retention period. Download files you want to keep, or copy them to a named store.
Tips
- The default of 2 pages at a time suits most sites. Light pages can go to 4 or 5; very tall, image heavy pages are safer at 1.
- For pages that fade content in as you scroll, turn on
scrollToBottomand add adelayMsof 1,000 to 2,000. networkidlesuits single page apps, but some sites never stop sending requests; the capture then waits for the whole navigation timeout before it is taken. PreferloadwithwaitForSelectorwhen you know what to wait for.- WebP images are limited to 16,383 pixels on each side, so long full page WebP captures are shorter than PNG ones.
Using it from code or an AI agent
Run it through the Apify API, the JavaScript or Python client, or any integration. For agents, add it to the Apify
MCP server (https://mcp.apify.com) and call it with a urls list; each result's fileUrl points at the stored file.
Support
Open an issue on the Issues tab with the URL, your input and the errorCode you got. Public pages only, please.