Website Screenshot API (Full Page, Mobile, PDF) avatar

Website Screenshot API (Full Page, Mobile, PDF)

Pricing

from $0.89 / 1,000 screenshots

Go to Apify Store
Website Screenshot API (Full Page, Mobile, PDF)

Website Screenshot API (Full Page, Mobile, PDF)

Capture screenshots or PDFs of up to 5,000 web pages or your own HTML per run. Each row gives a public image link, final URL, HTTP status, title, file size and the cookie banner it closed. Full page, one element, 11 device presets, dark mode. Failed pages free. $0.89 per 1,000 screenshots.

Pricing

from $0.89 / 1,000 screenshots

Rating

0.0

(0)

Developer

locaihost data

locaihost data

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

4

Monthly active users

9 days ago

Last modified

Share

Turn up to 5,000 URLs, or your own HTML, into PNG, JPEG, WebP or PDF files in one run, each with a public link, from a fresh browser that closes known cookie banners and blocks ads. No login, no API key.

  • Monitor pages visually: schedule a daily run of your own or competitors' pages and keep a dated archive of how they looked.
  • Client and SEO reports: batch-capture landing pages, ad destinations or search result pages for a report.
  • Render your own HTML: social cards, invoices, certificates and email previews, sent as HTML and returned as an image or PDF.
  • QA across devices: check pages on iPhone, Pixel, Galaxy, iPad and desktop presets, in light and dark mode.
  • Archive and evidence: save pages as PDFs with selectable text, with the time each was taken.

Quick start

Paste this into the JSON tab of the input and click Start:

{"urls": ["https://www.wikipedia.org", "https://news.ycombinator.com", "https://example.com"], "viewport": "desktop", "format": "png"}

You get 3 rows, each with a link to a 1440×900 PNG, in about 25 seconds (most of that is the browser starting). Bare domains like example.com work without https://, and duplicates are removed.

To render your own HTML as a 1200×630 social card:

{
"html": "<html><body style='margin:0;background:#0b3d2e;color:#fff;font:64px sans-serif;display:grid;place-items:center;height:630px'>Hello from my app</body></html>",
"viewport": "custom",
"viewportWidth": 1200,
"viewportHeight": 630
}

What data can I get?

Real records from this Actor's output: public pages captured at desktop size, with HTTP status, image size, the cookie banner it handled and the file link

One dataset row per page. The file itself sits in the run's key-value store, and screenshotUrl is its public link.

GroupFields
Pageindex (position in your input), source (url or html), url, finalUrl (after redirects), status (HTTP code), title
FilescreenshotUrl, key, format, width, height (null for PDF), bytes
CapturefullPage (charged at the full-page price), truncated (page taller than maxHeight), cookieBanner (the consent platform it handled), takenAt
Errorserror (why a page failed; null on success)

One real row (run on 2026-10-18, signature shortened):

{
"index": 0,
"source": "url",
"url": "https://www.wikipedia.org/",
"finalUrl": "https://www.wikipedia.org/",
"status": 200,
"title": "Wikipedia",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/83DeOGbJoTHAld34l/records/0001-wikipedia-org-72e64cab.png?signature=…",
"key": "0001-wikipedia-org-72e64cab.png",
"format": "png",
"width": 1440,
"height": 900,
"bytes": 251454,
"fullPage": false,
"truncated": false,
"cookieBanner": null,
"takenAt": "2026-10-18T05:38:36.949Z",
"error": null
}

The Overview view shows each screenshot as a thumbnail next to its URL, status and size. Export the rows to JSON, CSV, Excel or HTML, or fetch the files through the Apify API. The run's SUMMARY record counts pages captured, failed and not run, lists invalid inputs, and says why the run stopped.

What you can control:

  • Area: first screen (default), full page (fullPage), one element (selector, e.g. #pricing) or an exact rectangle (clip, which can reach below the first screen).
  • Device: 11 presets with real screen size, pixel density, touch and mobile user agent (Desktop 1440×900, Full HD 1920×1080, Laptop 1366×768, MacBook Pro 14", iPhone 15/16, iPhone SE, iPhone 16 Pro Max, Pixel 8, Galaxy S24, iPad Air, iPad Pro 12.9"), or a custom size from 240 to 3840 px wide, at up to 3× density.
  • Format: PNG, JPEG or WebP (with quality, and a transparent background option for PNG and WebP), or PDF in A4, Letter, A3 or Legal.
  • Clean-up: cookie banners (it clicks a button only inside 19 known consent platforms such as OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics and TrustArc, preferring "reject", and hides the banners of about 30 platforms plus common cookie-banner elements; buttons on unknown banners are never clicked), ad and tracker blocking (on by default), hideSelectors, blurSelectors to redact parts of a page, and customCss.
  • Timing: waitForSelector for single-page apps, waitUntil, delayMs, and timeoutSecs (each page is retried once on a timeout or dropped connection).
  • Browser: darkMode, locale (e.g. de-DE), timezone (e.g. Asia/Tokyo) and userAgent.

API callers can also send a single url, device names such as iphone_15, pixel_7 or galaxy_s23, and colorScheme: "dark".

How much does it cost?

You pay per screenshot taken. There is no charge for Apify platform usage on top.

RowFree and StarterScaleBusiness
Screenshot (first screen, element, region, your own HTML, or a PDF)$0.89 per 1,000$0.89 per 1,000$0.89 per 1,000
Full-page screenshot of a web page (fullPage on)$2.00 per 1,000$2.00 per 1,000$2.00 per 1,000

Plus $0.00005 per run start. Apify's free $5 monthly credit covers about 5,600 screenshots (or about 2,500 full-page ones). Free-plan runs stop at 50 screenshots each, and the log says how many pages were not run; any paid Apify plan removes the cap.

With fullPage on, element and region captures, HTML documents and PDFs are still charged as a normal screenshot. Each row's fullPage field shows which price applied. Format, device and quality don't change the price.

What's free: pages that fail (timeouts, DNS errors, a missing selector or waitForSelector element, direct file links), invalid URLs, duplicates, and pages not reached before the run's time limit. A page that loads with an error status, such as a 404 page, is captured and charged, because you get its screenshot; its status shows the code. To cap a run's spend, set Maximum cost per run in the run options: the run stops cleanly and never starts a page it can't charge for.

Limits, stated up front

  • Up to 5,000 URLs and 100 HTML documents per run (each HTML document up to 5,000,000 characters). Extra URLs are skipped and counted in SUMMARY.
  • Full-page captures stop at maxHeight (16,000 CSS pixels by default) and never go past the 16,383-pixel image limit divided by the scale factor. Those rows have truncated: true. Use PDF for longer pages.
  • Login-only or bot-protected pages are captured as the public sees them: a login page, or a challenge page if the site blocks automated browsers. This Actor does not get around logins or bot protection.
  • WebGL (3D scenes, some maps and charts) is off by default because software rendering is slow; most sites show a normal fallback. Turn on webgl for pages that need it.
  • Pages run 3 at a time at the default 2 GB memory (2 at a time for full-page and PDF captures). More memory runs more pages in parallel, up to 8, at the same price per screenshot.
  • If the run's time limit is reached, it stops cleanly, keeps what it captured and counts the rest as not run (not charged).
  • Files are kept for your Apify plan's storage retention period. Copy them to your own storage if you need them longer.

Schedules

Save your URL list as a task, then add a daily or weekly schedule under Schedules in Apify Console. Each run captures every page fresh, so you build a dated visual archive; takenAt records the exact time of each capture.

Integrations: API, n8n, Make and AI agents

API. Run it and get the rows back in one call (synchronous runs wait up to 5 minutes; use the asynchronous run endpoint for large batches):

curl -X POST "https://api.apify.com/v2/acts/locaihost~screenshot/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com", "https://www.wikipedia.org"], "format": "webp", "quality": 75}'

Python, with pip install apify-client:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("locaihost/screenshot").call(run_input={"urls": ["https://example.com"], "fullPage": True})
for shot in client.dataset(run["defaultDatasetId"]).iterate_items():
print(shot["url"], shot["status"], shot["screenshotUrl"] or shot["error"])

n8n, Make, Zapier, Google Sheets, Slack, webhooks. Apify's built-in integrations send each run's rows, with their image links, wherever you need them.

AI agents (MCP). Add this Actor to Claude, Cursor or any MCP client with https://mcp.apify.com/?tools=locaihost/screenshot, then ask something like "Take a mobile screenshot of the pricing section on example.com and tell me which plans are shown." The agent gets back a screenshotUrl it can open or pass to a vision model. A minimal agent input is {"url": "https://example.com", "device": "iphone_15", "selector": "#pricing"}.

FAQ

How much does it cost to screenshot a website?

$0.89 per 1,000 screenshots and $2.00 per 1,000 full-page screenshots, the same on every Apify plan. Failed pages are free. Apify's free $5 monthly credit covers about 5,600 screenshots.

Can I use it through the API or from Python?

Yes. Use the run-sync-get-dataset-items call above, or Apify's Python and JavaScript clients. Every run's rows are also available as JSON, CSV or Excel from its dataset.

Can I use it from an AI agent?

Yes. Through the Apify MCP server (https://mcp.apify.com/?tools=locaihost/screenshot) any MCP client can send a URL and read back the image link.

The Actor loads public pages the way any visitor's browser does. It never logs in and does not get around bot protection. The dataset records technical facts (URL, status, title, size) and the image, and a screenshot shows whatever the page shows, so avoid pages that display other people's personal details, or blur them with blurSelectors. You are responsible for having the right to capture and use each page, and for following each site's terms.

It prefers "reject". It clicks a button only inside a consent platform it recognises, hides banners it can't close, and never clicks buttons on banners it doesn't recognise. cookieBanner names the platform it handled.

Why are some fields empty?

width and height are null for PDFs. A failed page has no file: screenshotUrl is null and error says why, for example Timeout 45000ms exceeded, Element not found or not visible: #pricing or a DNS error such as net::ERR_NAME_NOT_RESOLVED. cookieBanner is null when no known banner appeared. HTML input has url null and source: "html".

A page timed out or shows a "verify you are human" page. What can I do?

Raise timeoutSecs, give the run more memory, or set waitUntil to domcontentloaded. A challenge or login page means the site blocks automated browsers or needs an account; this Actor captures it as it is and does not try to get around it.

More from locaihost data

Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

Support

Something not working, a page that doesn't capture well, or a cookie banner we don't close? Open an issue on the Issues tab with the URL: we answer issues within 24 hours.