Website Screenshot & PDF API – Full-Page, Mobile, Batch
Pricing
from $0.80 / 1,000 screenshot captureds
Website Screenshot & PDF API – Full-Page, Mobile, Batch
Pricing
from $0.80 / 1,000 screenshot captureds
Rating
0.0
(0)
Developer
Batulzii Ulziikhuu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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
| Feature | Details |
|---|---|
| Full-page and viewport captures | Full page up to maxFullPageHeight (default 10,000 px) |
| Device presets | Desktop, laptop, tablet, mobile, custom size, retina (1x–3x) |
| Formats | PNG, 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 images | Optional auto-scroll before capturing |
| Single element | Capture only #pricing, header etc. |
| Timing controls | Wait for selector, extra delay, network idle |
| Batch | Up to 5,000 URLs per run, up to 10 pages in parallel |
| Clear per-URL error codes | Every failed URL gets a free error record |
| Pay per successful capture | Budget-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)
| Event | Price |
|---|---|
| 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 ApifyClientclient = 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.ignoreRobotsTxtis 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
- SEO Audit Tool – Site Crawler, Broken Links & Meta Checker
- Google Trends Scraper
- AI Search Visibility Checker
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.