Website Screenshot API - $1/1k, Webpage to Image, URL to PNG avatar

Website Screenshot API - $1/1k, Webpage to Image, URL to PNG

Pricing

from $0.70 / 1,000 results

Go to Apify Store
Website Screenshot API - $1/1k, Webpage to Image, URL to PNG

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

Martin Petrov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

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, #pricing or .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 ApifyClient
client = 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

FieldTypeDescription
urlsarrayPublic pages to capture (a bare domain works too).
devicestringdesktop, desktop-hd, laptop, tablet, mobile.
fullPagebooleanWhole page (default) or viewport only.
formatstringpng (default), jpeg, pdf.
jpegQualityinteger10-100, JPEG only.
viewportWidth, viewportHeightintegerCustom viewport, 0 = preset.
maxHeightintegerCut full-page captures at this height (default 10000 px).
waitUntilstringload, domcontentloaded, networkidle.
delayMsintegerExtra wait before the capture.
waitForSelectorstringWait until this element is visible.
elementSelectorstringCapture only this element.
hideCookieBannersbooleanHide common consent popups (default on).
hideSelectorsarrayExtra CSS selectors to hide.
darkModebooleanprefers-color-scheme: dark.
scrollToLoadImagesbooleanScroll first so lazy images load (default on).
maxUrls, concurrency, timeoutSecsintegerLimits and speed.
onlyNew, monitorIdboolean, stringOnly pages whose text changed since the last run.
includeFailedbooleanAlso 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.

  1. Open the source actor in Apify Console and go to the Integrations tab.
  2. Click Add integration -> Actor, pick this actor and set Dataset to {{resource.defaultDatasetId}} (leave urls empty). Set your other options and save.
  3. 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