Website Screenshot API — URL to PNG, JPEG, PDF | $3.50/1k avatar

Website Screenshot API — URL to PNG, JPEG, PDF | $3.50/1k

Pricing

from $3.15 / 1,000 screenshots

Go to Apify Store
Website Screenshot API — URL to PNG, JPEG, PDF | $3.50/1k

Website Screenshot API — URL to PNG, JPEG, PDF | $3.50/1k

Screenshot any list of URLs: PNG or JPEG plus optional PDF, desktop/laptop/tablet/mobile viewports, full-page mode, wait for selector or delay, cookie banners and ads hidden. Returns image link, final URL, HTTP status, title, timings.

Pricing

from $3.15 / 1,000 screenshots

Rating

0.0

(0)

Developer

Raffy

Raffy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

What does Website Screenshot API do?

Website Screenshot API turns a list of URLs into screenshots: one PNG or JPEG per page, plus an optional A4 PDF. Paste the URLs, pick a viewport (desktop, laptop, tablet or mobile), choose whether you want the visible window or the full page, and run. Every screenshot is saved to the run's key-value store, and the dataset gets one row per URL with a direct image link, the final URL after redirects, the HTTP status code, the page title and the load timings.

It works as a screenshot API for agents, scripts and no-code tools. You need no API key of your own and no browser to manage. Each page opens in a fresh headless Chromium tab. Cookie and consent banners are hidden with CSS, and ad and tracker requests are skipped, so the image shows the page content.

Only the URLs you list are opened. Nothing is crawled, logged into or clicked. A page that shows an anti-bot challenge or a login form is captured as it appears and flagged. The Actor never tries to get past it.

Use cases for this website screenshot tool

  • Visual monitoring. Schedule a daily run over your own pages, landing pages or competitors' pricing pages, and keep a dated image of each one.
  • SEO and marketing reports. Add homepage and SERP-landing screenshots to client reports and audits.
  • QA and responsive checks. Capture the same URL at desktop, tablet and mobile sizes after each deploy.
  • Archiving and evidence. Keep a PNG plus a PDF of a page as it looked at a given time, with its status code and final URL.
  • Thumbnails and link previews. Generate preview images for directories, bookmarks and link lists.
  • AI agents. Give a vision model a screenshot of a page instead of raw HTML.

What data you get for every URL

FieldTypeDescription
screenshotUrlstringDirect link to the image in the run's key-value store (PNG or JPEG)
pageTitlestringPage <title> after rendering
finalUrlstringURL after redirects
statusCodeintegerHTTP status of the main document
redirectedbooleantrue when the final URL differs from the requested one
metaDescriptionstringThe page's meta description
formatstringpng or jpeg
fileSizeBytesintegerSize of the image in bytes
screenshotKeystringRecord key of the image in the key-value store
pdfUrlstringLink to the A4 PDF (when Also save a PDF is on)
pdfKeystringRecord key of the PDF
viewportstringdesktop, laptop, tablet, mobile or custom
viewportWidthintegerViewport width in CSS pixels
viewportHeightintegerViewport height in CSS pixels
deviceScaleFactornumberPixel ratio (2 = retina)
fullPagebooleanWhether the whole scrollable page was captured (false when a full-page capture was too heavy and the visible window was saved instead)
pageHeightintegerFull height of the page in CSS pixels
capturedHeightintegerHeight captured (viewport height, or page height up to the maximum)
challengeDetectedbooleantrue when the page showed an anti-bot challenge (Cloudflare, DataDome, PerimeterX, AWS WAF, Akamai)
loginWallDetectedbooleantrue when the page showed a login form or redirected to a login page
wallReasonstringWhich challenge or login wall was detected
cookieBannersHiddenintegerCookie/consent elements hidden with CSS
waitForSelectorstringThe CSS selector the Actor waited for, if any
selectorFoundbooleanWhether that selector became visible within 15 s
loadTimeMsintegerMilliseconds until the HTML arrived
totalTimeMsintegerMilliseconds for the whole capture
urlstringThe URL you asked for
statusstringok, not_found or error (see below)
errorstringReason when status is not ok
scrapedAtstringISO 8601 time of the capture

The images themselves are in the run's Storage > Key-value store tab, named screenshot-0001-<domain>.png and so on. The screenshotUrl links open them directly, with no Apify token needed.

Result status (tri-state output)

statusMeaningBilled?
okThe page loaded and its screenshot was saved. A login page is still ok, with loginWallDetected: true.Yes
not_foundThe page answered HTTP 404 or 410. The screenshot of the error page is attached.No
errorThe page did not load (DNS, timeout), answered another HTTP error, or showed an anti-bot challenge. The screenshot of what was shown is attached when there was one.No

How to take website screenshots with this Actor

  1. Click Try for free to open the Actor in Apify Console.
  2. Paste your URLs into URLs, one per line. Bare domains such as apify.com work too.
  3. Pick a Viewport preset, and switch on Full-page screenshot if you want the whole page.
  4. Click Start. Rows appear in the dataset as pages are captured. Open the Overview tab to see the images inline, or export the rows as JSON, CSV or Excel.

Input

FieldTypeDefaultDescription
startUrlsarray of strings5 example pagesURLs to capture, one per line
viewportstringdesktopdesktop 1920x1080, laptop 1366x768, tablet 820x1180, mobile 390x844 at 2x
viewportWidth / viewportHeightinteger-Custom size that overrides the preset
deviceScaleFactorintegerpreset1, 2 (retina) or 3
fullPagebooleanfalseCapture the whole scrollable page (scrolls once first to load lazy images)
maxPageHeightinteger10000Cut full-page screenshots at this height in pixels
formatstringautoauto (PNG for window shots, JPEG for full-page shots), png or jpeg
jpegQualityinteger80JPEG quality, 10-100
savePdfbooleanfalseAlso save an A4 PDF of each page (no extra charge)
waitUntilstringloadload, domcontentloaded (faster) or networkidle (for dashboards and charts)
waitForSelectorstring-Wait until this CSS selector is visible (up to 15 s)
delayMsinteger0Extra pause before the screenshot, up to 30 s
hideCookieBannersbooleantrueHide common consent banners with CSS. Nothing is clicked.
blockAdsbooleantrueSkip requests to about 100 ad, analytics and tag-manager networks, plus video streams
hideSelectorsarray of strings-Extra CSS selectors to hide (chat widgets, sticky headers)
scrollToLoadbooleantrueScroll once before a full-page capture so lazy images render
navigationTimeoutSecsinteger30Page load timeout; a slow page that already answered is captured as it is
maxItemsinteger100Stop after this many URLs
proxyConfigurationobjectoffOptional Apify Proxy (datacenter)

Desktop screenshots of a few pages:

{
"startUrls": ["https://apify.com", "python.org", "https://en.wikipedia.org/wiki/Web_scraping"]
}

Full-page mobile screenshots as JPEG, with a PDF, waiting for a chart to render:

{
"startUrls": ["https://example.com/dashboard"],
"viewport": "mobile",
"fullPage": true,
"format": "jpeg",
"savePdf": true,
"waitForSelector": "canvas.chart",
"delayMs": 1000
}

Output

A real row from a test run on 2026-10-19:

{
"url": "https://www.wikipedia.org/",
"status": "ok",
"scrapedAt": "2026-10-19T10:13:55.885Z",
"finalUrl": "https://www.wikipedia.org/",
"statusCode": 200,
"pageTitle": "Wikipedia",
"metaDescription": "Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/357607d0-778f-4e27-811c-27d3a8c45232/records/screenshot-0002-wikipedia.org.png",
"screenshotKey": "screenshot-0002-wikipedia.org.png",
"format": "png",
"fileSizeBytes": 148582,
"viewport": "desktop",
"viewportWidth": 1920,
"viewportHeight": 1080,
"deviceScaleFactor": 1,
"fullPage": false,
"pageHeight": 1101,
"capturedHeight": 1080,
"redirected": false,
"challengeDetected": false,
"loginWallDetected": false,
"cookieBannersHidden": 0,
"loadTimeMs": 615,
"totalTimeMs": 1759
}

A page behind an anti-bot wall comes back like this, free of charge, with the screenshot of the challenge attached:

{
"url": "https://www.example-shop.com/",
"status": "error",
"error": "DataDome challenge shown instead of the page (HTTP 403); it was not circumvented. The screenshot of what was shown is attached; this row is free.",
"statusCode": 403,
"challengeDetected": true,
"wallReason": "DataDome challenge"
}

How much does a website screenshot cost?

Pay per result: $3.50 per 1,000 screenshots, plus a start fee of $0.005 per GB of run memory ($0.02 per run at the default 4 GB). The PDF option, full-page mode, cookie-banner hiding and ad blocking are all included. Pages that fail, answer 404 or show an anti-bot challenge are free.

EventPriceCharged when
apify-actor-start$0.005 per GB of memoryOnce per run, when it starts.
result$0.0035Each URL whose screenshot was saved with status ok.
ScreenshotsCost (default 4 GB run)
100$0.37
1,000$3.52
10,000$35.02

Browser compute is included. The Actor stops gracefully when your run's maximum charge is reached.

Integrations, exports and API access

Call it from the Apify API, the JavaScript or Python client, the Apify CLI, or on a Schedule for daily visual monitoring. Send the rows to Google Sheets, Airtable, Slack, Make, n8n or Zapier, and copy the images to your own storage from screenshotUrl. AI agents can call it through the Apify MCP server and read the image links from the dataset.

Limitations

  • Anti-bot walls are not circumvented. Some large sites (for example those behind Cloudflare, DataDome or PerimeterX challenges) show a challenge page to cloud browsers. You get a free error row with challengeDetected: true and the screenshot of the challenge. No CAPTCHA is solved and no challenge is waited out.
  • No logins. Pages behind a login show the login page, flagged with loginWallDetected.
  • Cookie banners are hidden with CSS for the common consent platforms. An uncommon banner can still show; add its selector to Extra CSS selectors to hide.
  • Full-page screenshots stop at Maximum full-page height (10,000 px by default). Endless feeds and very long articles are cut there. If a very long page is too heavy to render in one piece, the visible window is saved instead and the row says fullPage: false.
  • Very heavy pages can take 20-60 seconds each, because the page is fully rendered before the screenshot.
  • Images are kept as long as the run's storage is retained (see your Apify plan's data retention). Copy them elsewhere if you need them permanently.
  • One URL gives one screenshot. Use a separate run, or list the URL again with another viewport, for more sizes.

FAQ

Do I need an API key or a browser? No. The Actor runs headless Chromium on Apify. You only provide URLs.

How do I get the image files? Click a screenshotUrl link, open the run's key-value store, or download the records with the Apify API. The links work without an Apify token.

Can I capture a mobile version of a page? Yes. Pick the mobile viewport (390x844 at 2x with an iPhone user agent and touch), or set your own width and height.

Why does a page show a "Just a moment..." or "Access denied" screen? The site's bot protection blocked the cloud browser. The row is free and flagged with challengeDetected. The Actor never tries to get past such pages.

Does it follow links or crawl a site? No. Only the URLs you list are opened, each once.

Why are ads missing from my screenshots? Block ads and trackers is on by default because ads slow pages down. Turn it off to capture the page with its ads.

Can I use it from an AI agent or MCP client? Yes. It runs with no input at all, every row is self-describing (status plus error), and the image links work without a token.

This Actor opens only the URLs you provide and saves what a normal browser shows for them. You are responsible for having the right to capture and store those pages, and for how you use the images, including any copyright, trademark or personal data they contain. The Actor does not log in, solve CAPTCHAs or circumvent access controls. It is not affiliated with any website it captures.