Website Screenshot API — Full Page, Mobile, PDF, No Login avatar

Website Screenshot API — Full Page, Mobile, PDF, No Login

Pricing

from $33.50 / 1,000 screenshot checks

Go to Apify Store
Website Screenshot API — Full Page, Mobile, PDF, No Login

Website Screenshot API — Full Page, Mobile, PDF, No Login

Website screenshot API for URL lists: full page or first screen, desktop/tablet/phone presets, PNG/JPEG/WebP/PDF, dark mode, cookie-banner and ad hiding, wait/scroll/selector/clip controls. Image URL, final URL, status and SHA-256 per row. Pay per capture.

Pricing

from $33.50 / 1,000 screenshot checks

Rating

0.0

(0)

Developer

NexGen Watch

NexGen Watch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Take a website screenshot of any list of URLs in headless Chromium and get the image back with proof attached: a public image URL, final URL, HTTP status, page title, capture timestamp, browser build and SHA-256 hash. Full-page or first screen; desktop, laptop, tablet or phone presets; PNG, JPEG, WebP or PDF; dark mode; hide cookie banners, chat widgets and ads; wait for a selector, delay, scroll to load lazy content; capture one element or a clip. Pay per capture — blocked or unreachable pages are reported and never billed.

  • Batch: up to 100 URLs per run, one row and one stored image each.
  • Every capture is evidence: timestamp, final URL after redirects, HTTP status, browser version and SHA-256 on the row.
  • No login, no CAPTCHA solving: each site's robots.txt is checked first; the browser identifies itself with a contact User-Agent. Optional Apify Proxy for sites that block data-centre IPs.
  • Direct image links: image_url opens the stored PNG/JPEG/WebP/PDF straight from the run's key-value store.

Billing: $0.02 per run start, then $0.05 per completed capture (screenshot_check).

Who uses this

  • Compliance, legal and brand teams that need dated website screenshots as evidence.
  • QA, SEO and monitoring teams screenshotting page lists on a schedule (mobile and desktop, light and dark).
  • Agencies and researchers archiving how pages looked, or turning pages into PDFs.

📊 Sample Output

Website Screenshot API sample output — real capture rows (target_url, final_url, capture_timestamp, browser) from a Store-example run

Real rows from run cUFIUzrvtGqMjlhdw on build 0.1.36 (2026-10-18), the Quick start input below:

target_urloutcomehttp_statuspage_titledeviceformatwidth×heightimage_sha256
https://example.com/answer200Example Domaindesktoppng1280×800018344bad235b72b…
https://www.iana.org/answer200Internet Assigned Numbers Authoritydesktoppng1280×8006f08a23db67efe72…

The run finished with the status message: 2 URL(s): 2 capture(s) stored+charged, 0 unbilled (blocked/unreachable/unparseable) | screenshot_check charged=2

✅ What you get

One screenshot_evidence row per URL (every URL gets a row; only outcome: answer rows are billed):

  • target_url, final_url, http_status, page_title — what was asked for, where it landed, and what the page called itself.
  • image_url, image_key, image_bytes, image_sha256 — the stored capture (public URL in this run's key-value store) and its hash.
  • format (png/jpeg/webp/pdf), device, full_page, width, height, device_scale_factor — how it was captured.
  • capture_timestamp, browser, browser_version, load_time_ms — when and with what.
  • outcome — answer (captured, billed), blocked (robots / 403 / 429 / 5xx / private host — not billed), unreachable (DNS, timeout, navigation or capture fault — not billed), unparseable (not a usable URL — not billed), with outcome_reason.
  • render_warnings — e.g. a waitForSelector that never appeared, or an output truncated at the size cap.

⚙️ Sample inputs

1. Quick start — the Store example

{
"urls": ["https://example.com/", "https://www.iana.org/"],
"device": "desktop",
"blockCookieBanners": true,
"maxUrls": 10
}

About $0.12 on the Free tier ($0.02 start + 2 × $0.05).

2. Full-page mobile capture with lazy content loaded, as JPEG

{
"urls": ["https://www.iana.org/"],
"device": "iphone",
"fullPage": true,
"scrollToBottom": true,
"format": "jpeg",
"quality": 75
}

3. Page to PDF, dark mode, German locale

{
"urls": ["https://example.com/"],
"format": "pdf",
"colorScheme": "dark",
"locale": "de-DE",
"timezoneId": "Europe/Berlin"
}

4. One element only, after the app has settled, with widgets hidden

{
"urls": ["https://example.com/pricing"],
"waitUntil": "networkidle",
"waitForSelector": "#pricing",
"selector": "#pricing",
"hideSelectors": ["#intercom-container", ".newsletter-popup"],
"deviceScaleFactor": 2
}

5. Retina desktop-HD capture through Apify residential proxy

{
"urls": ["https://example.com/"],
"device": "desktop-hd",
"deviceScaleFactor": 2,
"blockAds": true,
"proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
}

Older inputs still work: viewport: "desktop" | "mobile" | "full".

🧾 JSON sample record

{
"target_url": "https://example.com/",
"final_url": "https://example.com/",
"http_status": 200,
"page_title": "Example Domain",
"viewport": "desktop",
"device": "desktop",
"format": "png",
"full_page": false,
"device_scale_factor": 1,
"load_time_ms": 82,
"capture_timestamp": "2026-10-18T22:04:25.809522+00:00",
"browser": "chromium",
"browser_version": "156.0.8078.4",
"image_key": "screenshot-0-example.com.png",
"image_url": "https://api.apify.com/v2/key-value-stores/UFzFi4JAeoyUMYV3S/records/screenshot-0-example.com.png",
"image_bytes": 71152,
"image_sha256": "018344bad235b72b58d300df236525ae98ba51b567899a10d5dbcad52e10fba5",
"width": 1280,
"height": 800,
"render_warnings": null,
"faults": null,
"record_type": "screenshot_evidence",
"source": "buyer-submitted page URLs",
"outcome": "answer",
"input": "https://example.com/",
"outcome_reason": null
}

🔧 How it works

Capture. Headless Chromium (Playwright) opens each URL in a fresh context with the chosen device size, pixel density, colour scheme, locale and timezone; waits for waitUntil (+ optional selector, scroll pass and delay); applies hide/custom CSS; then writes PNG/JPEG (Chromium), WebP (converted from a lossless PNG) or PDF (print to PDF with backgrounds). Captures above 12 MB are truncated with a warning — lower the size, scale or use JPEG.

Gates before the browser opens a URL. The host must resolve only to public addresses (no localhost, private ranges or cloud metadata), and the site's robots.txt must allow the path for our user agent. A disallowed or non-public target is a blocked row, never a capture.

Blocking. blockAds aborts requests to well-known ad/tracking hosts; blockImages skips image and media downloads; blockCookieBanners hides common consent containers by CSS — nothing is clicked, accepted or bypassed.

Proxy. Direct by default. proxyConfiguration turns on Apify Proxy (datacenter or residential groups, optional country) for sites that refuse data-centre IPs; no third-party proxies.

Billing. Each completed capture is pushed and charged in one call; a row that cannot be charged is not delivered. Blocked, unreachable and unparseable rows are delivered unbilled so you always see every URL's disposition.

Limits. 100 URLs per run; navigation timeout 3-90 s per page; a page that fails to load or capture is unreachable (not billed) and the run continues.

💰 Pricing example

EventFreeBronzeSilverGold
Actor Start (apify-actor-start)$0.02$0.02$0.02$0.02
Completed capture (screenshot_check)$0.05$0.045$0.04$0.0335
  • 2 captures: $0.02 + 2 × $0.05 = $0.12
  • 100 captures: $0.02 + 100 × $0.05 = $5.02

Blocked and unreachable URLs cost nothing beyond the start fee.

Captures public pages exactly as any visitor's browser would render them, checks each site's robots.txt first, identifies itself with a contact User-Agent and never logs in, solves CAPTCHAs or bypasses paywalls. Use the captures in line with each site's terms and your local law.

❓ FAQ

Q: Where is the image? A: image_url on each row is a direct link to the stored file in the run's key-value store (image_key is its name there). Files stay as long as the run's storage does (7 days on the Free plan, longer on paid plans) — download them if you need them permanently.

Q: Full page came out short / missing images. A: Turn on scrollToBottom (lazy-loaded sections render as the page scrolls) and, for single-page apps, waitUntil: "networkidle" plus a delayMs.

Q: The site shows a bot wall or 403. A: That URL is returned as blocked and not billed. Try proxyConfiguration with Apify residential proxy; the actor never solves CAPTCHAs.

Q: Can I capture only part of a page? A: Yes — selector for one element, or clip for a fixed rectangle.

Q: PDF? A: format: "pdf" prints the page with backgrounds; image_url then points to the PDF.

Q: What formats can I export? A: Rows download as JSON, CSV, Excel or XML from the Dataset tab or API; images via their image_url.

🆘 Troubleshooting

  • outcome = unreachable, "navigation failed: TimeoutError" → raise timeoutMs or use waitUntil: "domcontentloaded".
  • outcome = unreachable, "selector matched nothing" → check the CSS selector; use waitForSelector for late-rendered elements.
  • outcome = blocked, robots → the site disallows that path for crawlers; the actor will not capture it.
  • Run TIMED-OUT → many slow pages: lower maxUrls, shorten timeoutMs, or raise the run timeout.

⭐ Found this useful?

A quick review on the Apify Store helps other teams find it. Feature request? Open it from the Issues tab — every one is read.