Website Screenshot & URL to PDF API (Bulk, Full Page)
Pricing
from $2.00 / 1,000 screenshot captureds
Website Screenshot & URL to PDF API (Bulk, Full Page)
Capture website screenshots (PNG, JPEG, WebP) and PDFs from a list of URLs. Files are stored in the default key-value store with public URLs. Failures become error rows; the run never fails as a whole.
Pricing
from $2.00 / 1,000 screenshot captureds
Rating
0.0
(0)
Developer
Sunburst
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Capture full-page website screenshots and convert any URL to PDF, in bulk, from a list of URLs. Formats are PNG, JPEG, WebP and PDF. The Actor opens each page in headless Chromium, writes the files to the default key-value store, and returns one dataset row per URL × format with a public file URL.
A failure on one URL becomes an error row. The run continues and finishes successfully.
What you get
- Screenshots in PNG, JPEG, or WebP, plus print-style PDFs
- Full-page or viewport captures, or a single CSS element
- Device presets: desktop 1920×1080, laptop 1366×768, iPhone 390×844, iPad 820×1180
- Cookie-banner heuristic (CSS/JS only — no paid consent service)
- Optional lazy-load scroll and optional tracker blocking
- Works on the Apify FREE plan with proxy left off. Apify Proxy is used only if you enable it.
Input
| Field | What it does |
|---|---|
urls | List of page URLs. Default and prefill: https://example.com, https://docs.apify.com. |
startUrls | Optional Crawlee-style list ({ "url": "..." }). Merged with urls. |
outputs | One or more of png, jpeg, webp, pdf. Default: png and pdf. |
fullPage | Capture the full scrollable page for images. Default: true. |
devicePreset | desktop, laptop, iphone, ipad, or custom. |
viewportWidth / viewportHeight | Override the preset, or set size when devicePreset is custom. |
waitUntil | load, domcontentloaded, or networkidle. |
delayMs | Extra wait after load, banners, and scroll. |
selector | CSS selector to screenshot one element (images only). |
hideCookieBanners | Hide or click common consent banners. |
scrollToLoad | Scroll the page so lazy images can load. |
blockTrackers | Abort common analytics and ad-pixel hosts. |
imageQuality | JPEG/WebP quality, 1–100. PNG ignores this. |
pdfFormat | A4 or Letter. |
landscape | Landscape PDF. |
printBackground | Include CSS backgrounds in the PDF. |
timeoutSecs | Navigation timeout per URL. Timed-out navigations are retried once. |
maxConcurrency | Parallel pages. Keep at 1–2 on 1024 MB. |
proxyConfiguration | Defaults to no proxy. Enable Apify Proxy only if you need it. |
Every input field has a description in the Actor console.
Example
{"urls": ["https://example.com", "https://docs.apify.com"],"outputs": ["png", "pdf"],"fullPage": true,"devicePreset": "desktop","hideCookieBanners": true,"proxyConfiguration": { "useApifyProxy": false }}
iPhone screenshot of one element:
{"urls": ["https://example.com"],"outputs": ["png"],"devicePreset": "iphone","selector": "h1","fullPage": false}
Sample output
One dataset row per URL × format:
{"url": "https://example.com","finalUrl": "https://example.com/","statusCode": 200,"title": "Example Domain","format": "png","fileKey": "capture-0001-example.com.png","fileUrl": "https://api.apify.com/v2/key-value-stores/<STORE_ID>/records/capture-0001-example.com.png","previewUrl": "https://api.apify.com/v2/key-value-stores/<STORE_ID>/records/capture-0001-example.com.png","width": 1920,"height": 1080,"pageCount": null,"fileSizeBytes": 48210,"loadTimeMs": 1842,"capturedAt": "2026-10-31T17:10:00.000Z","status": "ok","error": null}
Error rows keep the same shape. File fields are null, status is "error", and error holds the message. Those rows are not charged.
The Output tab has an Overview view and an Errors view.
Pricing
Pay-per-event. Apify platform usage (compute) is included in the event prices, so you pay only for the events below. Error rows are free.
| Event | When it fires | Price |
|---|---|---|
run-start | Once when the run begins | $0.0001 |
screenshot | Each successful PNG, JPEG, or WebP | $0.002 |
pdf | Each successful PDF | $0.003 |
Set a maximum total charge on the run if you want a hard cap. The Actor stops new paid captures when that cap is reached.
Typical cost for the default input (two URLs × PNG + PDF): one run-start, two screenshots, two PDFs — $0.0101 in total, platform usage included.
Limitations
- Cookie-banner hiding is a heuristic. Some consent dialogs, especially those inside closed shadow roots or custom iframes, will remain.
- Sites that block datacenter IPs or detect headless Chromium may return a challenge page. Enabling Apify Proxy can help on paid plans; it is off by default so FREE-plan runs work.
- Very long full-page screenshots use more memory and produce large files. Prefer a selector or a viewport capture for endless feeds.
- Login walls, CAPTCHA, and bot-management interstitials are not solved.
networkidlecan time out on pages that keep sockets open. Preferloadunless you need the extra wait.- WebP is encoded from a PNG capture. Quality is controlled by
imageQuality. - The Actor memory range is 1024–2048 MB. High
maxConcurrencyon huge pages can run out of memory.
FAQ
Does this work on the Apify FREE plan?
Yes, with proxy left disabled (the default). Do not turn on Apify Proxy unless your account can use it.
What happens if one URL fails?
That URL × format is stored as an error row. Other URLs keep going. The run status stays succeeded.
How do I download the file?
Use fileUrl on the dataset row, or open the record key (fileKey) in the run’s default key-value store.
Can I capture only one element?
Set selector to a CSS selector. Image formats use that element. PDF still prints the full document.
Why is my screenshot blank or missing images?
Increase delayMs, turn on scrollToLoad, or switch waitUntil to networkidle. Some images never load without a logged-in session.
Will tracker blocking change the page?
It can, if the layout depends on those scripts. Leave blockTrackers off unless you want the speed tradeoff.
How is time measured?
Each row’s loadTimeMs is the time to produce that file after the page is ready. The log also prints per-capture durations.
More actors from this developer
- PDF to Markdown: DOCX, PPTX, XLSX, OCR & RAG Chunks: PDF, DOCX, PPTX, XLSX and HTML to clean Markdown and RAG-ready chunks.
- Google Trends Scraper & API: Interest, Related, Trending: interest over time, by region, and related queries from Google Trends.
- Google News Scraper: Full-Text Articles to Markdown: Google News articles as Markdown and RAG chunks for any topic or company.
- Greenhouse, Lever, Ashby & Workable Jobs API: one clean jobs feed from company job boards, with salaries when posted.
- Wayback Machine API: Snapshots & Archived Pages: every archived capture of a URL or domain, the snapshot closest to a date, and archived pages as Markdown.
Local development
Requires Python 3.10+ and Playwright Chromium.
pip install -r requirements-dev.txtplaywright install chromiumpytest
To run the Actor locally (writes to a local storage folder):
$python -m src
Without Apify input, the same defaults as the Store form are used: example.com and docs.apify.com as PNG + PDF, full page.
This Actor does not deploy itself. Publish it from your Apify account when you are ready.