Website Screenshot & PDF API – Full-Page, Mobile, Batch avatar

Website Screenshot & PDF API – Full-Page, Mobile, Batch

Pricing

from $0.80 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot & PDF API – Full-Page, Mobile, Batch

Website Screenshot & PDF API – Full-Page, Mobile, Batch

Pricing

from $0.80 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Batulzii Ulziikhuu

Batulzii Ulziikhuu

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Website Screenshot & PDF API – Full-Page, Mobile & Batch

Capture full-page or viewport screenshots of any list of URLs as PNG, JPEG, WebP or PDF – with desktop, tablet, mobile or custom viewports, dark mode, automatic cookie-banner hiding, lazy-image scrolling, element capture and batch concurrency. Every capture is saved to the run's key-value store and listed in a dataset with the page title, final URL, HTTP status, size and a direct file link.

You pay only for successful screenshots. Pages that answer with an HTTP error (4xx/5xx), time out, are blocked by robots.txt, point to non-public addresses or are invalid cost nothing.

What you get

FeatureDetails
Full-page and viewport capturesFull page up to maxFullPageHeight (default 10,000 px)
Device presetsDesktop, laptop, tablet, mobile, custom size, retina (1x–3x)
FormatsPNG, JPEG, WebP, PDF, JPEG/WebP quality setting
Cookie banners hidden≈45 consent managers hidden by CSS – nothing is clicked, no consent is given
Lazy-loaded imagesOptional auto-scroll before capturing
Single elementCapture only #pricing, header etc.
Timing controlsWait for selector, extra delay, network idle
BatchUp to 5,000 URLs per run, up to 10 pages in parallel
Clear per-URL error codesEvery failed URL gets a free error record
Pay per successful captureBudget-aware: stops when your max cost per run is reached

Apify's own Screenshot URL Actor also offers URL lists, PDF output, scrolling, delay/network-idle timing and selectors to hide. This Actor adds WebP output, device presets, built-in cookie-banner hiding, element capture and per-URL error codes with pay-per-success pricing – pick whichever fits your workflow.

Use cases

  • Visual monitoring – schedule daily screenshots of your site or competitors' landing pages.
  • SEO & client reports – mobile vs desktop above-the-fold captures for audits.
  • Archiving / compliance – save pages as PDF with backgrounds.
  • Link previews & thumbnails – small WebP/JPEG captures for directories and apps.
  • QA – check layouts in dark mode or on retina devices after each deploy.

Input example

{
"urls": [{ "url": "https://apify.com" }, { "url": "https://example.com" }],
"format": "webp",
"quality": 80,
"fullPage": true,
"device": "mobile",
"hideCookieBanners": true,
"darkMode": false,
"waitForSelector": "",
"delayMs": 0,
"maxConcurrency": 3
}

Empty input {} captures a full-page PNG of https://apify.com.

Main options: format (png, jpeg, webp, pdf), quality, fullPage, device (desktop, laptop, tablet, mobile, custom) + viewportWidth/viewportHeight/deviceScaleFactor, darkMode, hideCookieBanners, selectorsToHide, scrollToBottom, maxFullPageHeight (default 10,000 px), selector (element capture), waitUntil, waitForSelector, delayMs, navigationTimeoutSecs, PDF pdfPaper/pdfLandscape/pdfPrintBackground, maxConcurrency, maxRetries, maxScreenshots, captureErrorPages, ignoreRobotsTxt, proxyConfiguration.

Output

One dataset record per URL (successful and failed), plus the file in the key-value store:

{
"success": true,
"url": "https://apify.com",
"finalUrl": "https://apify.com/",
"status": 200,
"title": "Apify: Marketplace of ready-to-run tools for AI",
"format": "png",
"device": "desktop",
"width": 1366,
"height": 10000,
"truncated": true,
"fileSize": 939755,
"imageUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/0001-apify-com-b2cbecea.png",
"key": "0001-apify-com-b2cbecea.png",
"errorCode": null,
"error": null
}

Failed URLs get success: false and an errorCode such as TIMEOUT, DNS_ERROR, HTTP_404, HTTP_403, SELECTOR_NOT_FOUND, ROBOTS_DISALLOWED, BLOCKED_PRIVATE_ADDRESS, TOO_MANY_REDIRECTS or INVALID_URL. PDFs report pageCount; truncated: true means the height limit cut the capture. A run summary is stored as OUTPUT in the key-value store. Export everything as JSON, CSV or Excel, or fetch it via the Apify API.

Pricing (pay per event)

EventPrice
Screenshot captured (PNG/JPEG/WebP)$0.002 ($0.0015 Bronze, $0.001 Silver, $0.0008 Gold+)
PDF captured$0.003 ($0.0025 / $0.002 / $0.0015)
Actor start$0.00005 per GB of memory

1,000 full-page screenshots cost about $2 on the free plan, with platform compute included. Failed, blocked and skipped URLs are free. The run's maximum cost is respected: the Actor stops starting new captures when your limit is reached.

API usage

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('batuweb/website-screenshot').call({ urls: [{ url: "https://example.com" }], format: 'webp' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].imageUrl);
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("batuweb/website-screenshot").call(run_input={"urls": [{"url": "https://example.com"}], "device": "mobile"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["imageUrl"])

Responsible use

  • Only capture pages you are authorised to capture – your own sites, clients' sites with permission, or public pages whose terms allow it. You are responsible for the URLs you submit and for how you use the images (copyright, personal data / GDPR, the site's terms of use).
  • robots.txt is respected by default, including for every redirect hop. URLs disallowed for automated agents are skipped free of charge; if robots.txt is unreachable (server error, network error) the site is treated as fully disallowed, as RFC 9309 requires. The browser identifies itself with the token WebsiteScreenshotBot. ignoreRobotsTxt is meant only for sites you own or are explicitly allowed to capture.
  • Respecting robots.txt is not permission. robots.txt is a crawler courtesy signal, not access authorisation (RFC 9309), and it does not replace a site's terms, copyright or privacy law. The safeguards here reduce risk; they are not legal clearance for any particular use.
  • The Actor does not bypass logins, paywalls, CAPTCHAs or bot protection. Pages that answer with an HTTP error (e.g. HTTP_403) give a free error record. A block or CAPTCHA page served with HTTP 200 looks like a normal page and is captured as rendered. The proxy is off by default.
  • Only public websites: localhost, private networks, link-local/cloud-metadata addresses and their IPv6 / encoded variants are blocked – for the page, every redirect, every subresource and robots.txt alike. All browser traffic leaves through a local guard that checks each connection's resolved address.
  • Cookie banners are hidden visually; nothing is clicked or accepted on your behalf.

FAQ

How long can a capture be? maxFullPageHeight (500–16,000 CSS px, default 10,000) applies to every mode: full-page images and element captures are cut at that height, and PDFs get as many pages as fit into that length (at least one). Cut captures are marked truncated: true. WebP is additionally limited to 16,383 image pixels per side.

Why did a page fail with HTTP 403? The site blocks automated browsers. We don't try to get around that; such failures are free.

Why ROBOTS_DISALLOWED although the URL looks allowed? Either it redirects to a disallowed path, or the site's robots.txt returned a server error / could not be reached, which counts as "disallow everything".

Can I capture pages behind a login? No, this tool only captures publicly reachable pages.

More tools by batuweb

Built with Playwright (Apache-2.0), Chromium (BSD-3-Clause), proxy-chain (Apache-2.0), ipaddr.js (MIT) and sharp (Apache-2.0). Not affiliated with any of the websites you capture.