Website Screenshot API: URL and HTML to Image or PDF · Apify
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)

Website screenshot API: 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 and file size. 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

7

Total users

6

Monthly active users

14 hours ago

Last modified

Features

Limited permissions

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.

What people use it for:

  • Visual monitoring: a daily run of your own or competitors' pages builds a dated archive of how they looked.
  • Client and SEO reports: landing pages, ad destinations or search result pages captured in one batch.
  • Your own HTML: social cards, invoices, certificates and email previews, sent as HTML and returned as an image or PDF.
  • Device QA: iPhone, Pixel, Galaxy, iPad and desktop presets, in light and dark mode.
  • Archives and evidence: PDFs with selectable text and the time each page 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 you 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). In full-page captures, sticky headers, chat buttons and cookie bars show once, where they sit on the first screen, instead of repeating down the image; keepStickyElements captures them exactly as the page positions them.
  • 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.
  • Cookie banners: it clicks a button only inside 19 known consent platforms (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc and others) and prefers "reject". It hides the banners of about 30 platforms plus common cookie-banner elements. Buttons on unknown banners are never clicked.
  • Clean-up: 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. Colour emoji and Chinese, Japanese and Korean text render as real characters, not empty boxes.
  • Your own sites: cookies and headers for pages behind your own login (see below).

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

Pricing

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

  • 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. For your own sites, you can pass your own cookies or headers.
  • 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.

Your own sites: cookies and headers

For your own sites and sessions only: a staging site behind a password, a dashboard you are signed in to, a preview link that needs a token. Both inputs are optional and off by default.

  • cookies: a list of {"name", "value", "domain", "path"}. domain and path are optional; without a domain, a cookie goes to each page's own host.
  • headers: an object such as {"Authorization": "Bearer …"}. Headers go only to each page's own site (its host and subdomains), never to other sites the page loads from, such as CDNs or analytics.
{
"urls": ["https://staging.example.com/dashboard"],
"fullPage": true,
"cookies": [{ "name": "session", "value": "…", "domain": "staging.example.com" }],
"headers": { "Authorization": "Bearer …" }
}

Both fields are marked secret, so Apify stores them encrypted. The run keeps them in memory only, never logs them, and removes their values from every log line, error and status message. Use only cookies and tokens for sites and accounts you own or are allowed to use.

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 optional cookies and headers are for your own sites and sessions only. 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.