Website Screenshot and PDF avatar

Website Screenshot and PDF

Pricing

from $2.00 / 1,000 screenshots

Go to Apify Store
Website Screenshot and PDF

Website Screenshot and PDF

Capture a batch of public web pages as PNG, JPEG, WebP or PDF: full page or viewport, one element by CSS selector, desktop, tablet and mobile presets, dark mode, hidden cookie banners. One result per URL with file URL and size; failed URLs are not charged.

Pricing

from $2.00 / 1,000 screenshots

Rating

0.0

(0)

Developer

Soso Pkhakadze

Soso Pkhakadze

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Turn a list of public web pages into PNG, JPEG or WebP screenshots or PDF documents in one run. Capture the visible screen or the whole scrollable page, a single element by CSS selector, on desktop, laptop, tablet or mobile, in light or dark mode, with cookie banners and other clutter hidden. Every URL gets its own result with a direct file link, the image size in pixels and a clear error code when something goes wrong. URLs that fail are not charged.

What you can do with it

  • Monitor pages over time. Schedule a run and keep a visual record of a pricing page, a landing page or a competitor's home page.
  • Check responsive layouts. Capture the same pages as desktop, tablet and mobile.
  • Archive pages as PDF. Print articles, documentation or receipts from public pages into A4 or Letter PDFs.
  • Make thumbnails and previews. WebP and JPEG at the quality you choose keep files small.
  • Grab one component. Capture only header, #pricing or any other element instead of the full page.
  • Give an AI agent eyes. Results are flat JSON with a fileUrl per page, so an agent calling this Actor through the Apify MCP server gets a link it can open or pass on.

Features

OptionWhat it does
Batch of URLsUp to 1,000 public URLs per run, 2 at a time by default (up to 5). Duplicates are captured once.
FormatsPNG, JPEG, WebP (quality 1 to 100) and PDF (A4, Letter, Legal, A3, Tabloid, portrait or landscape).
Full page or viewportFull page captures stop at a maximum height you set (15,000 px by default) and are marked truncated.
Element captureselector captures the first matching element only.
Device presetsDesktop 1920x1080, laptop 1366x768, tablet 800x1280 at 2x, mobile 412x915 at 2.625x, or your own width, height and pixel density.
Dark modeEmulates prefers-color-scheme: dark (or light, or no preference).
WaitingPage load, HTML parsed, network idle or first response; wait for a selector to become visible; extra delay up to 30 s. A page whose load event never arrives is still captured and marked pageLoaded: false, instead of failing.
Lazy contentOptional scroll through the page before capture so lazy images load.
Hide clutterHide any elements by CSS selector, and optionally the banners of common consent tools (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and others). Hiding is CSS only; nothing is clicked, accepted or refused.
LanguageSend an Accept-Language header to see a localised version of a site.
Error pagesPages that answer 404, 403, 500 and similar are reported as errors and not charged, unless you ask to capture them.
RetriesDropped connections and browser crashes are retried once by default. Timeouts are not retried.

What it does not do

This Actor captures what an anonymous visitor sees. It does not log in, accept cookies, solve captchas, rotate proxies or change its identity to get past bot protection. Pages that block automated browsers come back as an error or show the block page. URLs with credentials in them, localhost, private networks and non-web schemes are refused. Only the headers Accept-Language, Referer, DNT, Sec-GPC, Cache-Control and Pragma can be set.

Input

The only required field is urls. A minimal input:

{
"urls": ["https://apify.com", "https://example.com"],
"format": "png",
"fullPage": true
}

A mobile, dark mode WebP capture with banners hidden:

{
"urls": ["https://github.com"],
"format": "webp",
"device": "mobile",
"colorScheme": "dark",
"fullPage": true,
"hideCookieBanners": true,
"hideSelectors": ["#chat-widget"]
}

A German language PDF:

{
"urls": ["https://en.wikipedia.org/wiki/Tbilisi"],
"format": "pdf",
"pdfFormat": "A4",
"headers": { "Accept-Language": "de-DE" }
}

See the Input tab for every option with its limits.

Output

Files are stored in the run's default key-value store. The dataset has one record per input URL. fileUrl is a signed link (it ends in ?signature=...) that downloads the file without an API token, so you can hand it to another tool or an agent directly.

A successful capture:

{
"status": "ok",
"url": "https://example.com/",
"finalUrl": "https://example.com/",
"httpStatus": 200,
"pageTitle": "Example Domain",
"pageLoaded": true,
"fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/0002-example-com-a4df5e24d0.png",
"key": "0002-example-com-a4df5e24d0.png",
"format": "png",
"contentType": "image/png",
"bytes": 14723,
"width": 1920,
"height": 1080,
"device": "desktop",
"viewport": { "width": 1920, "height": 1080, "deviceScaleFactor": 1 },
"colorScheme": "light",
"fullPage": true,
"selector": null,
"truncated": false,
"pdfFormat": null,
"attempts": 1,
"durationMs": 3792,
"charged": true,
"capturedAt": "2026-09-14T00:59:05.820Z",
"errorCode": null,
"errorMessage": null
}

A failed URL has the same fields, with status: "error", fileUrl: null, charged: false and an errorCode:

errorCodeMeaning
timeoutThe HTML did not arrive within the navigation timeout, or the image took too long to render.
dns_not_resolvedThe domain does not exist.
http_error_statusThe page answered 400 or above; httpStatus has the code.
tls_errorThe site's certificate is invalid.
connection_refused, connection_resetThe server closed or refused the connection.
selector_not_found, wait_for_selector_timeoutThe CSS selector you gave matched nothing.
private_address, unsupported_scheme, credentials_in_url, invalid_urlThe URL was refused before any request.
browser_crashed, capture_failedThe browser could not render the page, usually a very heavy page.

width and height are the image size in pixels, so a mobile capture at 2.625x is 1082 pixels wide. For PDF they are null. A record with status: "skipped" means the run reached your maximum cost before that URL (see Pricing).

A run summary is stored as OUTPUT in the key-value store: totals of ok, error and skipped records and error counts by code. The run itself succeeds when every URL was handled, even if some of them failed, so check status per record.

Pricing

Pay per event, with browser compute included:

EventPrice
Actor start: once per run, $0.001 per GB of memory$0.002 at the default 2 GB
screenshot: one viewport or element image (PNG, JPEG or WebP) stored$0.002 ($2.00 per 1,000)
screenshot-full-page: one full page image stored$0.004 ($4.00 per 1,000)
pdf: one PDF stored$0.004 ($4.00 per 1,000)

Examples: 1,000 viewport screenshots in one run cost $2.002. A scheduled run that captures one full page every day costs $0.006 a day.

  • A charge is made only after the file is stored. URLs that fail, time out, answer with an error status or match no selector cost nothing.
  • The Actor respects your maximum cost per run. Before each capture it checks that the remaining budget covers it; when it does not, the remaining URLs are returned as skipped and nothing more is charged.
  • Stored files count toward your Apify storage like any other key-value store data, and unnamed run storage is removed after your plan's retention period. Download files you want to keep, or copy them to a named store.

Tips

  • The default of 2 pages at a time suits most sites. Light pages can go to 4 or 5; very tall, image heavy pages are safer at 1.
  • For pages that fade content in as you scroll, turn on scrollToBottom and add a delayMs of 1,000 to 2,000.
  • networkidle suits single page apps, but some sites never stop sending requests; the capture then waits for the whole navigation timeout before it is taken. Prefer load with waitForSelector when you know what to wait for.
  • WebP images are limited to 16,383 pixels on each side, so long full page WebP captures are shorter than PNG ones.

Using it from code or an AI agent

Run it through the Apify API, the JavaScript or Python client, or any integration. For agents, add it to the Apify MCP server (https://mcp.apify.com) and call it with a urls list; each result's fileUrl points at the stored file.

Support

Open an issue on the Issues tab with the URL, your input and the errorCode you got. Public pages only, please.