Website Screenshot & URL to PDF API (Bulk, Full Page) avatar

Website Screenshot & URL to PDF API (Bulk, Full Page)

Pricing

from $2.00 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot & URL to PDF API (Bulk, Full Page)

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

Sunburst

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

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

FieldWhat it does
urlsList of page URLs. Default and prefill: https://example.com, https://docs.apify.com.
startUrlsOptional Crawlee-style list ({ "url": "..." }). Merged with urls.
outputsOne or more of png, jpeg, webp, pdf. Default: png and pdf.
fullPageCapture the full scrollable page for images. Default: true.
devicePresetdesktop, laptop, iphone, ipad, or custom.
viewportWidth / viewportHeightOverride the preset, or set size when devicePreset is custom.
waitUntilload, domcontentloaded, or networkidle.
delayMsExtra wait after load, banners, and scroll.
selectorCSS selector to screenshot one element (images only).
hideCookieBannersHide or click common consent banners.
scrollToLoadScroll the page so lazy images can load.
blockTrackersAbort common analytics and ad-pixel hosts.
imageQualityJPEG/WebP quality, 1–100. PNG ignores this.
pdfFormatA4 or Letter.
landscapeLandscape PDF.
printBackgroundInclude CSS backgrounds in the PDF.
timeoutSecsNavigation timeout per URL. Timed-out navigations are retried once.
maxConcurrencyParallel pages. Keep at 1–2 on 1024 MB.
proxyConfigurationDefaults 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.

EventWhen it firesPrice
run-startOnce when the run begins$0.0001
screenshotEach successful PNG, JPEG, or WebP$0.002
pdfEach 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.
  • networkidle can time out on pages that keep sockets open. Prefer load unless 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 maxConcurrency on 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

Local development

Requires Python 3.10+ and Playwright Chromium.

pip install -r requirements-dev.txt
playwright install chromium
pytest

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.