Website Screenshot and PDF API - PNG, JPEG, PDF from any URL
Pricing
from $2.80 / 1,000 screenshot captureds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
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
| Field | Type | Default | What it does |
|---|---|---|---|
urls | array | - | Public http(s) pages. Up to 100 per run. |
format | png / jpeg / pdf | png | Image or print-layout PDF. |
device | desktop / mobile / tablet | desktop | 1280x800 at 1x, 390x844 at 2x with touch, 820x1180 at 2x with touch. |
viewportWidth, viewportHeight | integer | preset | Override the preset's size (200-3840 by 200-4000). |
fullPage | boolean | false | Capture the whole scrollable page. Scrolls once first so lazy images load. Images only. |
maxFullPageHeight | integer | 12000 | CSS 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. |
waitUntil | load / domcontentloaded / networkidle | load | When navigation counts as done. |
delayMs | integer | 0 | Extra wait before capturing, up to 30000. |
waitForSelector | string | - | CSS selector that must be visible before capturing. Not found in time means the URL fails, uncharged. |
darkMode | boolean | false | Sets prefers-color-scheme: dark. |
timeoutSecs | integer | 30 | Per-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. |
captureErrorPages | boolean | false | Capture pages that answer 4xx/5xx instead of failing them. |
pdfFormat, pdfLandscape, pdfPrintBackground | A4, false, true | Paper 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 sentstatus ok | failed | blocked | skippederror why it is not ok, in one sentence; null when okfinal_url, title where the browser ended up, and the page titlehttp_status status of the main documentoutput_key, output_url the file in the key-value store, and its public URLcontent_type, output_byteswidth, 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 maxFullPageHeightwait_timed_out the wait condition was not met in time; captured as it stoodformat, device, viewport_width, viewport_height, full_pageblocked_requests sub-requests the page made at private addresses that were refusedbilled_event what this row was charged under; null if not chargednavigation_ms, capture_ms, total_ms
Billing
Pay per event: a small actor-start fee, then one charge per file produced.
screenshot-capturedfor a PNG or JPEG,pdf-renderedfor 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
skippedrow 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 address169.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.