Website Screenshot API - $1/1k, Webpage to Image, URL to PNG
Pricing
from $0.70 / 1,000 results
Website Screenshot API - $1/1k, Webpage to Image, URL to PNG
Website screenshot API: turn any public URL into a full-page or viewport PNG, JPEG or PDF with real Chromium. Desktop, tablet and mobile viewports, wait for selector, delay, dark mode, hide cookie banners and any element, capture one element, only-new mode for monitoring. Direct file URLs. Works fro
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
Martin Petrov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Website Screenshot API - Webpage to Image, URL to PNG, JPEG & PDF
You need screenshots of web pages at scale: link previews and thumbnails, visual QA after a deploy, archiving competitor pages, SEO reports, or an AI agent that has to "look" at a page. Running your own headless browser fleet is a chore, and most screenshot SaaS plans charge a monthly fee. This actor takes a list of URLs and returns full-page or viewport screenshots as PNG, JPEG or PDF, each with a direct download URL. You pay $1 per 1,000 screenshots; failed pages are free.
It uses real Playwright Chromium with its honest User-Agent. No proxies, no CAPTCHA solving, no login pages.
What you get
- screenshotUrl: direct link to the PNG / JPEG / PDF file (stored in the run's key-value store).
- title, finalUrl (after redirects), statusCode, loadTimeMs.
- width, height, deviceScaleFactor, pageHeight, truncated, bytes, sha256 of the file.
- contentHash of the visible text (used by only-new mode), warning when a page loaded only partly.
- A RUN_SUMMARY record with counts, failures and
lastError.
Features
- Full page or viewport (thumbnail) capture, with a max height for very long pages.
- Devices: desktop 1366x768, desktop HD 1920x1080, laptop, tablet (2x), mobile 390x844 (3x, touch), or a custom viewport.
- Formats: PNG, JPEG (quality setting) or PDF (one long page with backgrounds).
- Wait options: load / domcontentloaded / networkidle, wait for a CSS selector, extra delay.
- Hide cookie banners (OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast and more) and any element you list. Nothing is clicked or accepted.
- Element screenshot: capture just
header,#pricingor.product-card. - Dark mode, lazy-image scrolling, 1-4 pages in parallel.
- Only-new mode with
monitorId: get (and pay for) a screenshot only when the page text changed. Great for visual change monitoring.
Use cases
- Website thumbnails and link previews for directories, CRMs and newsletters.
- Visual regression and uptime proof after deploys; daily archive of landing pages.
- SEO and marketing agency reports (desktop + mobile shots of client and competitor pages).
- Give an AI agent eyes: screenshot a URL and pass the image to a vision model.
- Monitor competitor pricing pages and get a screenshot only when they change.
API example (curl)
Replace YOUR_APIFY_TOKEN with your token (Apify Console, Settings, Integrations). One request runs the actor and returns the results with the file URLs:
curl -X POST "https://api.apify.com/v2/acts/martin10291~website-screenshot-api/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": ["https://example.com", "https://www.python.org"], "device": "mobile", "fullPage": true, "format": "png"}'
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("martin10291/website-screenshot-api").call(run_input={"urls": ["https://example.com"], "format": "jpeg"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["url"], item["screenshotUrl"])
MCP example (Claude, Cursor, any MCP client)
Every Apify actor is also an MCP tool. Add this actor to the Apify MCP server:
https://mcp.apify.com?tools=martin10291/website-screenshot-api
In Claude Desktop or Cursor add it as a remote MCP server (OAuth login to Apify, or Authorization: Bearer YOUR_APIFY_TOKEN). Then ask: "Take a mobile screenshot of https://example.com", and the agent calls this actor and gets the image URL back.
Input
| Field | Type | Description |
|---|---|---|
urls | array | Public pages to capture (a bare domain works too). |
device | string | desktop, desktop-hd, laptop, tablet, mobile. |
fullPage | boolean | Whole page (default) or viewport only. |
format | string | png (default), jpeg, pdf. |
jpegQuality | integer | 10-100, JPEG only. |
viewportWidth, viewportHeight | integer | Custom viewport, 0 = preset. |
maxHeight | integer | Cut full-page captures at this height (default 10000 px). |
waitUntil | string | load, domcontentloaded, networkidle. |
delayMs | integer | Extra wait before the capture. |
waitForSelector | string | Wait until this element is visible. |
elementSelector | string | Capture only this element. |
hideCookieBanners | boolean | Hide common consent popups (default on). |
hideSelectors | array | Extra CSS selectors to hide. |
darkMode | boolean | prefers-color-scheme: dark. |
scrollToLoadImages | boolean | Scroll first so lazy images load (default on). |
maxUrls, concurrency, timeoutSecs | integer | Limits and speed. |
onlyNew, monitorId | boolean, string | Only pages whose text changed since the last run. |
includeFailed | boolean | Also save failed pages (charged). |
Output example
{"url": "https://www.python.org","finalUrl": "https://www.python.org/","statusCode": 200,"title": "Welcome to Python.org","device": "desktop","format": "png","fullPage": true,"screenshotUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/shot-www.python.org-4863eab2e0.png","width": 1366,"height": 2731,"pageHeight": 2731,"truncated": false,"bytes": 463550,"loadTimeMs": 3120,"warning": null,"takenAt": "2026-11-03T14:33:16Z"}
Pricing
$1.00 per 1,000 screenshots (pay per result) plus the usual Apify platform usage. Failed pages are not charged unless you turn on includeFailed. Default memory 1 GB handles 2 pages in parallel.
Limits and honesty
- Public pages only: no login, no paywalls, no CAPTCHA solving, no proxies. Sites that block headless browsers return an error (listed in RUN_SUMMARY).
- Private and internal network addresses are refused.
- Screenshot files stay in the run's key-value store for your Apify data retention period; download them if you need them longer.
- Mobile mode uses a mobile viewport with touch and pixel ratio 3, with the real Chromium User-Agent.
Use it as an integration (chain it after another actor)
This actor can run automatically after any actor whose results contain a URL.
- Open the source actor in Apify Console and go to the Integrations tab.
- Click Add integration -> Actor, pick this actor and set Dataset to
{{resource.defaultDatasetId}}(leaveurlsempty). Set your other options and save. - When the source run finishes, this actor reads its dataset and processes every row. The field is detected automatically; set Dataset field if your column has another name.
You can also start it by hand with datasetId (pick a dataset or paste its ID) to process an existing dataset.
Good sources to chain from:
- compass/crawler-google-places (Google Maps Scraper)
- martin10291/local-business-leads-osm
- apify/website-content-crawler
- martin10291/shopify-store-products
- apify/google-search-scraper