Website Screenshot and PDF API - PNG, JPEG, PDF from any URL avatar

Website Screenshot and PDF API - PNG, JPEG, PDF from any URL

Pricing

from $2.80 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot and PDF API - PNG, JPEG, PDF from any URL

Website Screenshot and PDF API - PNG, JPEG, PDF from any URL

Capture any public web page as PNG, JPEG or PDF with headless Chromium. Full-page, mobile and tablet presets, dark mode, wait-for-selector. One row per URL, private addresses refused, failed URLs never charged.

Pricing

from $2.80 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Security

Limited permissions

Share

Website Screenshot and PDF API

Give it URLs, get back a PNG, JPEG or PDF of each page, plus one structured row per URL saying what happened. Headless Chromium, no API key of your own, no browser to run, no machine-learning models.

Built to be called by scripts and AI agents: the input is a flat JSON object, the output is one dataset row per URL in the order you sent them, and every failure says why in a sentence.

Input

FieldTypeDefaultWhat it does
urlsarray-Public http(s) pages. Up to 100 per run.
formatpng / jpeg / pdfpngImage or print-layout PDF.
devicedesktop / mobile / tabletdesktop1280x800 at 1x, 390x844 at 2x with touch, 820x1180 at 2x with touch.
viewportWidth, viewportHeightintegerpresetOverride the preset's size (200-3840 by 200-4000).
fullPagebooleanfalseCapture the whole scrollable page. Scrolls once first so lazy images load. Images only.
maxFullPageHeightinteger12000CSS pixels. Taller pages are cut here and the row says truncated: true. Capped at 8192 for the 2x presets, which is Chromium's texture limit.
waitUntilload / domcontentloaded / networkidleloadWhen navigation counts as done.
delayMsinteger0Extra wait before capturing, up to 30000.
waitForSelectorstring-CSS selector that must be visible before capturing. Not found in time means the URL fails, uncharged.
darkModebooleanfalseSets prefers-color-scheme: dark.
timeoutSecsinteger30Per-page timeout, 5-120. If the load event is not reached in time but the document is there, the page is captured as it stands and the row says wait_timed_out: true. A page that never responds fails.
captureErrorPagesbooleanfalseCapture pages that answer 4xx/5xx instead of failing them.
pdfFormat, pdfLandscape, pdfPrintBackgroundA4, false, truePaper size, orientation and whether backgrounds print.

Output

The file goes to the run's key-value store and each dataset row carries its key and public URL. One row per input URL, always, in input order:

index, url position and the URL you sent
status ok | failed | blocked | skipped
error why it is not ok, in one sentence; null when ok
final_url, title where the browser ended up, and the page title
http_status status of the main document
output_key, output_url the file in the key-value store, and its public URL
content_type, output_bytes
width, height pixels of the delivered image (null for PDF)
pages page count of a PDF (null for images)
truncated a full-page capture was cut at maxFullPageHeight
wait_timed_out the wait condition was not met in time; captured as it stood
format, device, viewport_width, viewport_height, full_page
blocked_requests sub-requests the page made at private addresses that were refused
billed_event what this row was charged under; null if not charged
navigation_ms, capture_ms, total_ms

Billing

Pay per event: a small actor-start fee, then one charge per file produced.

  • screenshot-captured for a PNG or JPEG, pdf-rendered for a PDF.
  • Only a file that was produced, stored and is under the size limit is charged. A URL that fails, times out, answers 404, is refused as private, or whose selector never appears gets a row with the reason and costs nothing.
  • The run stops as soon as your spending limit is reached. URLs not reached get a skipped row so nothing silently goes missing.

What it will not fetch

This Actor renders pages for anyone who can start it, so it refuses to be a way into someone else's network. It only fetches public http and https URLs:

  • file:, chrome:, ftp:, data: and every other scheme are refused.
  • Loopback (localhost, 127.0.0.0/8, ::1), private ranges, link-local including the cloud metadata address 169.254.169.254, CGNAT, multicast and their IPv6 equivalents are refused - in every spelling a browser accepts, including decimal, hex and octal forms and IPv4-mapped IPv6.
  • A name that resolves to any private address is refused.
  • The check repeats for every redirect and for every request the page itself makes, so a public page cannot make the browser fetch an internal address, and the browser's connections go through a proxy that connects only to the address it checked, which defeats DNS rebinding.
  • Ports used by mail, databases, SSH and similar services are refused.

A refused URL gets status: blocked.

Limits

100 URLs per run, 25 MB per file, full-page height capped as above, one page timeout per URL. Pages that need a login, solve a CAPTCHA or sit behind a bot wall are captured as the wall, not bypassed.