Website Screenshot — PNG, JPEG, WebP or PDF of any public page
Pricing
from $1.60 / 1,000 screenshot captureds
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 hours ago
Last modified
Categories
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
| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
urls | array of strings | one of | — | Page URLs, 1–50 per run. |
html | string | one of | — | Raw HTML to render instead of URLs (≤ 2 MB). |
format | enum png · jpeg · webp · pdf | no | png | pdf prints the page. |
fullPage | boolean | no | true | Capture the whole scroll height. |
device | enum desktop · tablet · mobile | no | desktop | Viewport preset (1280×800, 820×1180, 390×844). |
selector | string | no | — | Capture only this element. |
waitForSelector | string | no | — | Wait for this element before capture (≤ 15 s). |
delayMs | integer | no | 0 | Extra wait, ≤ 10,000. |
darkMode | boolean | no | false | Emulate 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.
| Field | Meaning |
|---|---|
url | Input URL or html:. |
finalUrl | The page's URL after redirects; html: for raw HTML. |
ok | Success flag. |
status | HTTP status. |
title | The page's title. |
format | png, jpeg, webp or pdf. |
width | Image width in pixels; null for pdf. |
height | Image height in pixels; null for pdf. |
pages | Pages in the PDF print (pdf only). |
key | Record key. |
outputUrl | API record URL. |
warnings | height_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.
| Event | Title | Charged when | FREE / BRONZE | SILVER | GOLD / PLATINUM / DIAMOND |
|---|---|---|---|---|---|
screenshot-captured | Screenshot captured | One image captured. | $0.002 | $0.0018 | $0.0016 |
pdf-rendered | Page printed to PDF | One 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
loadevent 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 usewaitForSelector. With the desktop device the page's own timers are paused from the moment of capture (afterwaitForSelectoranddelayMs), so the image and thetitleshow the page at the same instant.waitForSelectorwaits up to 15 seconds;delayMsadds 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.code | Meaning |
|---|---|
download_failed | Navigation failed. |
http_error | Non-2xx status. |
selector_not_found | selector or waitForSelector absent, or not valid CSS. |
robots_disallowed | robots.txt forbids it. |
blocked_host | Deny-listed host, or a private or local address. |
login_required | Sign-in wall; not attempted. |
timeout | Not finished within the run's time budget. |
internal_error | Unexpected failure. |
charge_limit_reached | The run reached its maximum total charge before this input; it was not processed. |
invalid_input | The 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.
Related Hermes Actors
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_inputrecords 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.