Website Screenshot — PNG, JPEG, WebP or PDF of any public page avatar

Website Screenshot — PNG, JPEG, WebP or PDF of any public page

Pricing

from $1.60 / 1,000 screenshot captureds

Go to Apify Store
Website Screenshot — PNG, JPEG, WebP or PDF of any public page

Website Screenshot — PNG, JPEG, WebP or PDF of any public page

Page URLs or raw HTML in, a screenshot or PDF print of each out: full page or viewport, one element, desktop, tablet or mobile. Obeys robots.txt. Pay per capture.

Pricing

from $1.60 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Logan Parker

Logan Parker

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 hours ago

Last modified

Share

Give it page URLs or raw HTML; it returns a screenshot of each — full page or viewport, a single element by CSS selector, desktop, tablet or mobile — or a PDF print of the page, as a file in the run's key-value store. It obeys robots.txt and refuses platforms whose terms forbid automated access. A vision-capable agent uses it to check how a page looks — its own deploy, a layout bug, a design reference — by rendering it to an image it can view, at one flat price per capture.

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.

Input

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.
fullPagebooleannotrueCapture the whole scroll height.
deviceenum desktop · tablet · mobilenodesktopViewport preset (1280×800, 820×1180, 390×844).
selectorstringno—Capture only this element.
waitForSelectorstringno—Wait for this element before capture (≤ 15 s).
delayMsintegerno0Extra wait, ≤ 10,000.
darkModebooleannofalseEmulate a dark colour scheme.

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, so a desktop image is 1,280 pixels wide.

Output

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.
error{code, message}.

Example record for the call above, 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"]
}

Events and prices

Pay per event; platform usage is included in the price, never passed through.

EventTitleCharged whenFREE / BRONZESILVERGOLD / PLATINUM / DIAMOND
screenshot-capturedScreenshot capturedOne image captured.$0.002$0.0018$0.0016
pdf-renderedPage printed to PDFOne page printed to PDF; charged instead of screenshot-captured.$0.003$0.0027$0.0024

Apify also charges its standard apify-actor-start event: $0.00005 per GB of run memory (1 event, $0.00005, at the default 1,024 MB). The minimum maximum-charge a caller can set is $0.01.

Worked example on the FREE tier: screenshots of 10 pages cost 10 × $0.002 = $0.02, plus $0.00005 for the start, $0.02005 in all; printing the same 10 pages to PDF costs $0.03 plus the start. Nothing is charged for a failed capture.

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 1,024 MB (from 1,024 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.
  • Typical run time: a few seconds per page after the browser starts. The default run timeout is 600 seconds.

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.
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.

Not affiliated

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

  • lighthouse-audit — Lighthouse performance, accessibility and SEO scores.
  • seo-page-audit — on-page SEO checks.
  • domain-availability — whether a domain name is registered.
  • dns-and-email-auth — DNS records and email authentication (SPF, DKIM, DMARC).
  • broken-links — broken links on a site.
  • sitemap-urls — every URL in a site's sitemaps.

Changelog

  • 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.