Website Screenshot API avatar

Website Screenshot API

Pricing

from $1.20 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot API

Website Screenshot API

Website Screenshot — Full Pages, Elements, HTML & PDF Prints: `screenshot-captured` previous/requested $0.0015; `pdf-rendered` previous/requested $0.003; `browser-started` requested $0.001 (only if active); active Apify record sets fees; usage included; start extra; failed results uncharged.

Pricing

from $1.20 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Logan Parker

Logan Parker

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

7 days ago

Last modified

Features

Limited permissions

Share

Website screenshot captures permitted public pages or supplied HTML as PNG, JPEG, WebP or PDF, with full-page, viewport, element and clip options, device presets and dark mode. AI agents can call and pay through Apify MCP.

The active Apify pricing record determines your bill; for the previous/requested schedules, screenshot-captured previous/requested $0.0015; pdf-rendered previous/requested $0.003; browser-started requested $0.001 (only if active); usage is included and failed results are free.

Example result

Example record for the minimal input under How to use it, as this Actor returned it in its deploy check on 2026-10-16 (the signature on outputUrl, a read grant for that one file, is shortened to … here):

{
"url": "https://docs.apify.com/platform/actors/publishing/monetize",
"finalUrl": "https://docs.apify.com/actors/publishing/monetize",
"ok": true,
"status": 200,
"title": "Monetize Actors | Platform | Apify Documentation",
"format": "png",
"width": 1280,
"height": 4010,
"key": "screenshot-000-f7f775a538.png",
"outputUrl": "https://api.apify.com/v2/key-value-stores/kAhMa5nfRVExhhgNl/records/screenshot-000-f7f775a538.png?signature=…",
"warnings": ["blocked_subresources"]
}

How to use it

Start a run in Apify Console, by API or from an agent with an input like this one — it is the input Apify runs every day to test this Actor:

{"urls": ["https://docs.apify.com/platform/actors/publishing/monetize"], "format": "png"}

Start with the minimal JSON example above, then adjust the fields in the table below. Read the Example result and Output fields sections for the returned record, Errors for failure codes, and Events and prices for result events and the separate platform start.

FieldTypeRequiredDefaultMeaning
urlsarray of stringsone of—Page URLs, 1–50 per run.
htmlstringone of—Raw HTML to render instead of URLs (≤ 2 MB).
formatenum png · jpeg · webp · pdfnopngpdf prints the page.
qualityintegerno85JPEG and WebP quality, 1–100.
omitBackgroundbooleannofalsePNG and WebP: transparent where the page sets no background.
fullPagebooleannotrueCapture the whole scroll height.
deviceenum desktop · desktop-hd · desktop-1440 · laptop · square · tablet · ipad-pro · mobile · iphone · iphone-se · androidnodesktopViewport preset: 1280×800, 1920×1080, 1440×900, 1366×768, 1080×1080; mobile-type 820×1180, 1024×1366, 390×844, 393×852, 375×667, 412×915.
widthintegerno—Custom viewport width, 240–3,840 CSS pixels, over the preset's.
heightintegerno—Custom viewport height, 240–4,320 CSS pixels, over the preset's.
deviceScaleFactorintegerno11, 2 or 3: retina-style images with 2× or 3× the pixels.
selectorstringno—Capture only this element.
clipobjectno—Capture only this rectangle of the page: {"x": 0, "y": 0, "width": 800, "height": 600} in page pixels. Not with selector or pdf.
hideSelectorsarray of stringsno—Up to 20 CSS selectors hidden in the capture at your request (for example a chat widget).
waitForSelectorstringno—Wait for this element before capture (≤ 15 s).
delayMsintegerno0Extra wait, ≤ 10,000.
waitUntilenum ready · load · networkidlenoreadyready: the document, its fonts and half a second without requests, at most 5 s; load or networkidle wait for that first, at most 15 s more.
darkModebooleannofalseEmulate a dark colour scheme.
blockAdsbooleannotrueDo not load ad, tracker and analytics hosts (see Sources and terms); false loads everything.
blockCookieBannersbooleannofalseDo not load consent-management platforms, so their cookie banners are not drawn; nothing is accepted on your behalf.
blockImagesbooleannofalseDo not load images.
localestringno—Browser language, for example de-DE.
timezonestringno—IANA time zone, for example Europe/Berlin.

Give urls or html, not both. Every limit above is enforced by the input schema and again in code. Images are captured at a device scale factor of 1 unless you set deviceScaleFactor, so a desktop image is 1,280 pixels wide.

Events and prices

The active Apify pricing record determines your bill; each schedule below is conditional on that exact record being active. A pending record does not authorise its charges. Before submission, while pending, and after activation, use the actual active record, not the requested calendar, to determine the bill.

Requested activation: 2026-11-20T00:00:00Z. This is a request until confirmed by the record; the record supplies the actual effective instant.

Previous schedule — only if that record is active

apify-actor-start: FREE $0.00005, BRONZE $0.00005, SILVER $0.00005, GOLD $0.00005, PLATINUM $0.00005, DIAMOND $0.00005; screenshot-captured: FREE $0.0015, BRONZE $0.0015, SILVER $0.00135, GOLD $0.0012, PLATINUM $0.0012, DIAMOND $0.0012; pdf-rendered: FREE $0.003, BRONZE $0.003, SILVER $0.0027, GOLD $0.0024, PLATINUM $0.0024, DIAMOND $0.0024.

  • 1 screenshot in a run: 1 × 0.0015 + 0 + 0.00005 = $0.00155.
  • 10 screenshots in a run: 10 × 0.0015 + 0 + 0.00005 = $0.01505, or $0.001505 each.
  • Hypothetical 100-capture comparison (the input limit is 50): 100 × 0.0015 + 0 + 0.00005 = $0.15005, or $0.0015005 each.

For this schedule only, against an Actor at $0.00089 per screenshot plus usage at 4 GB and $0.20 per compute unit, this schedule is cheaper at more than 2.9700 seconds for one screenshot, 2.7675 seconds per screenshot for 10, or 2.7473 seconds per screenshot for 100 (hypothetical; the input limit is 50).

Requested schedule — only if that record is active

EventTitleCharged whenFREE / BRONZESILVERGOLD / PLATINUM / DIAMOND
screenshot-capturedScreenshot capturedOne image captured.$0.0015$0.00135$0.0012
pdf-renderedPage printed to PDFOne page printed to PDF; charged instead of screenshot-captured.$0.003$0.0027$0.0024
browser-startedBrowser started (once per run)Once per run, with the run's first successful capture: starting the browser on Apify's servers. Not charged when no capture succeeds.$0.001$0.0009$0.0008
  • 1 screenshot in a run: 1 × 0.0015 + 0.001 + 0.00005 = $0.00255.
  • 10 screenshots in a run: 10 × 0.0015 + 0.001 + 0.00005 = $0.01605, or $0.001605 each.
  • Hypothetical 100-capture comparison (the input limit is 50): 100 × 0.0015 + 0.001 + 0.00005 = $0.15105, or $0.0015105 each.

For this schedule only, against an Actor at $0.00089 per screenshot plus usage at 4 GB and $0.20 per compute unit, this schedule is cheaper at more than 7.4701 seconds for one screenshot, 3.2175 seconds per screenshot for 10, or 2.7923 seconds per screenshot for 100 (hypothetical; the input limit is 50).

Platform event in the requested schedule: apify-actor-start: FREE $0.00005, BRONZE $0.00005, SILVER $0.00005, GOLD $0.00005, PLATINUM $0.00005, DIAMOND $0.00005.

The requested start at default memory is (1 event, $0.00005, at the default 512 MB).

Worked event subtotal, requested schedule at FREE: if 10 screenshot-captured events are charged, 10 × $0.0015 = $0.015 for that event alone. All other charged events and the platform start event add their listed fees; this subtotal is not a run total. The configured maximum-charge floor is $0.01. Platform usage is included; failed results are uncharged.

Call it from an agent

Through Apify's MCP server (https://mcp.apify.com), tool call-actor:

{"actor": "hermeskd/website-screenshot", "input": {"urls": ["https://docs.apify.com/platform/actors/publishing/monetize"], "format": "png"}, "callOptions": {"maxTotalChargeUsd": 0.05, "timeout": 600}, "waitSecs": 30}

The call returns the run's status and its defaultDatasetId. Read the records with get-dataset-items:

{"datasetId": "<defaultDatasetId from the call>", "limit": 50}

Each record's outputUrl is the image or PDF itself (also readable with get-key-value-store-record and the record's key). As a dedicated tool, add https://mcp.apify.com?tools=hermeskd/website-screenshot to your MCP client. maxTotalChargeUsd caps what the run can charge; when it is reached the remaining inputs come back as charge_limit_reached records and are not charged.

Output fields

One record per input; the file is stored in the run's default key-value store.

FieldMeaning
urlInput URL or html:.
finalUrlThe page's URL after redirects; html: for raw HTML.
okSuccess flag.
statusHTTP status.
titleThe page's title.
formatpng, jpeg, webp or pdf.
widthImage width in pixels; null for pdf.
heightImage height in pixels; null for pdf.
pagesPages in the PDF print (pdf only).
keyRecord key.
outputUrlAPI record URL.
warningsheight_capped when a full page taller than 16,384 px (16,383 px in WebP, the format's limit) was cut to that height; blocked_subresources when the fetch policy refused something the page asked for (a frame or resource on a deny-listed host, a private address or a robots-disallowed path, a prefetch hint), which was not loaded; ads_blocked when ad, tracker or analytics hosts were not loaded (blockAds); consent_blocked when a consent-banner platform was not loaded (blockCookieBanners); images_blocked when images were not loaded (blockImages).
error{code, message}.

Limits and run time

  • 1–50 URLs per run, or one HTML document up to 2 MB.
  • Full-page captures stop at 16,384 px of height, 16,383 px in WebP (the format's limit); warning height_capped.
  • Navigation waits up to 30 seconds for the page's own document. The capture is then taken once the page's fonts have loaded and its network has gone quiet (no request starting or finishing for half a second; a connection that merely stays open does not hold the capture), and never more than 5 seconds after the document: the page's load event is not waited for, and requests still in flight are left unfinished — so content a page draws later than that (a late ad, a chat bubble, an analytics widget) can be missing; to wait for a specific element use waitForSelector. With the desktop device the page's own timers are paused from the moment of capture (after waitForSelector and delayMs), so the image and the title show the page at the same instant. waitForSelector waits up to 15 seconds; delayMs adds up to 10 seconds. At most 2 page loads a second go to one host. A host's name is looked up once per run and given 10 seconds; each of its addresses is given 10 seconds to connect, 30 in all; a request past those limits fails like any other failed request.
  • Default run memory 512 MB (from 512 to 4,096 MB): pages are captured one at a time at the default, one per 1,024 MB of run memory when a caller raises it (at most three at once); records keep the input order. Select at least 1,024 MB for large full-page captures; the larger benchmark pages retain that allocation. The lower default is measured for a typical documentation-page call.
  • Typical run time: a few seconds per page after the browser starts. The default run timeout is 600 seconds.
  • deviceScaleFactor multiplies the pixels: the 16,384-px height cap applies to the image, so a retina full page is cut at 8,192 or 5,461 CSS pixels of the page.

Errors

Errors are records with ok: false and error.code; none is charged.

error.codeMeaning
download_failedNavigation failed.
http_errorNon-2xx status.
selector_not_foundselector or waitForSelector absent, or not valid CSS.
robots_disallowedrobots.txt forbids it.
blocked_hostDeny-listed host, or a private or local address; or a redirect to a host on a blocking list (the message names the switch that allows it).
login_requiredSign-in wall; not attempted.
timeoutNot finished within the run's time budget.
internal_errorUnexpected failure.
charge_limit_reachedThe run reached its maximum total charge before this input; it was not processed.
invalid_inputThe run input passed the input schema but cannot be used (for example both urls and html, or neither); the message names the field. One record per input given, or one with url: null when none was given; nothing is processed.

The run fails only when every input failed with an Actor-side code (internal_error, timeout), so a broken Actor is visible. Every other run succeeds — including one where nothing was captured because of the caller's own inputs (bad URL, robots, deny-list, not found, invalid input, the charge limit), or where those and Actor-side failures are mixed.

Sources and terms

Public pages the caller names, under the Hermes fetch policy. Process only pages you have the right to capture. robots.txt is obeyed for the user-agent HermesBot (and *): with urls, for the page and every frame in it, on every redirect hop and on any later navigation, before the browser requests it; with html, every URL in the caller's HTML is one the caller names, so every request the page makes — documents, frames, scripts, styles, images, fonts, data — is checked. A page whose own document is refused, at load or later, ends as robots_disallowed or blocked_host and is not charged; a refused frame or resource is left out and the record carries blocked_subresources. Popup windows, target=_blank links and forms never open a second page; prefetch and prerender hints are removed from caller HTML. Platforms whose terms forbid automated access, and people-search sites, are on a deny-list: they are refused as pages and are not loaded as embedded resources. Private and local addresses are refused for every request the browser makes, after DNS and on every redirect. The browser keeps its own user-agent string with HermesBot/1.0 (+https://apify.com/hermeskd) appended. No login, cookies, credentials, CAPTCHA solving, evasion or proxies are used.

Blocking is request blocking only, at the same guard that applies the fetch policy: a request to a listed host is refused before any connection is made, and the page itself is never edited, so a capture shows what the site sends a browser that does not load those hosts. The site of every URL you give is never blocked. Ads and trackers (blockAds, on by default): HaGeZi's DNS Blocklists (the hagezi/dns-blocklists project on GitHub), Multi LIGHT, version 2026.1027.0945.32 (72,304 domains; "blocks ads, trackers, metrics, telemetry, and some badware"), bundled unmodified under the GNU General Public License v3.0 with its licence text beside it in the image; a domain on it is blocked with its subdomains. Cookie banners (blockCookieBanners): the hosts of 14 consent-management platforms, among them OneTrust, Cookiebot, Usercentrics, Sourcepoint, Didomi and Quantcast Choice; Hermes never clicks "accept". hideSelectors is the one option that changes the page, and only as you ask.

Not affiliated

This Actor is not affiliated with Apify's own screenshot Actors, with Google (Chromium), with HaGeZi or the consent platforms named above, or with any site it renders. Chromium and Playwright are used under their open-source licences.

Changelog

  • 1.0 (2026-10-27) — twelve new options: custom viewport width and height, deviceScaleFactor (retina), eight more device presets, quality, omitBackground, clip, hideSelectors, blockImages, blockCookieBanners, locale and timezone, and waitUntil. Default changed: ads and trackers are now blocked (blockAds, on unless you set it false), which also makes captures faster. Proposed charge: browser-started, $0.001 once per run with its first successful capture; as checked on 2026-10-28, it is not active or scheduled in the public pricing history. The per-screenshot and per-PDF prices are unchanged.
  • 1.0 (2026-10-26) — store listing rewritten for the people and agents searching for this job: title, description, search-engine title and description, categories, and the README in the order a searcher reads it (what it does, a real result, how to use it, prices, the agent call); screenshot-captured price cut from $0.002 to $0.0015.
  • 1.0 (2026-10-16) — input the Actor cannot use is answered with invalid_input records and the run succeeds; a run fails only when every input failed on the Actor's side.
  • 1.0 (2026-10-14) — first release: PNG, JPEG, WebP and PDF; full page, viewport and element capture; three device presets; dark mode.