Website Screenshot API: Full Page, Mobile, Element & PDF avatar

Website Screenshot API: Full Page, Mobile, Element & PDF

Pricing

from $2.50 / 1,000 screenshot (visible screen or element)s

Go to Apify Store
Website Screenshot API: Full Page, Mobile, Element & PDF

Website Screenshot API: Full Page, Mobile, Element & PDF

Capture full-page website screenshots and PDFs of any URL at desktop, tablet and phone sizes, from Console or the API. Cookie banners hidden, ads blocked, lazy content loaded. From $2.50 per 1,000; failed and blocked pages are free.

Pricing

from $2.50 / 1,000 screenshot (visible screen or element)s

Rating

0.0

(0)

Developer

Public Data Tools

Public Data Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

Get full-page screenshots and PDFs of any public web page, at desktop, laptop, tablet and phone sizes, from Apify Console or one API call. You pay only for the screenshots you get: failed, blocked and error pages are free.

  • 📸 Full page, visible screen or one element, as PNG, JPEG or PDF.
  • 📱 Five device sizes or your own: desktop, laptop, iPad, iPhone and Pixel in one run.
  • 🧹 Clean pages: cookie banners hidden, 76 ad and tracking services blocked, lazy content loaded.
  • 🌙 Dark mode and 2× or 3× density, with emoji and Chinese, Japanese and Korean text rendered.
  • 🔌 One API call, one JSON row per capture, with a link to each file.
  • 💸 From $2.50 per 1,000 screenshots. Failed, blocked and error pages are free.

Try it: the input comes pre-filled with two pages. Click Start to get full-page desktop screenshots of both, for $0.015, then add your own pages.

What you get

One image or PDF per page and device size, saved in the run's storage, and one row of details for each.

OptionChoices
What to captureThe full page, the visible screen, or one element by CSS selector (such as #pricing)
FormatPNG, JPEG (quality 1–100, default 80) or PDF (A4, Letter, Legal or A3)
Device sizesDesktop 1920×1080, laptop 1366×768, iPad Pro 11, iPhone 17, Pixel 9, or a custom size from 200 to 3,840 px wide
Pixel densityEach device's own (1× on desktop, about 3× on phones), or 1×, 2× or 3×
Colour schemeLight, or dark on sites that support it
Page clean-upCookie banners from over 20 consent tools hidden, never accepted; ads and trackers blocked; your own selectors hidden
Endless pagesCut at 15,000 CSS px by default (up to 30,000), with truncated marking cut pages

Every row also has the final address after redirects, the HTTP status and the page title. It adds the image size, file size, load time and whether it was charged.

Pick several sizes and each page is captured at each one. 10 URLs at 3 sizes give 30 screenshots.

Built for reliable runs:

  • a fresh browser session for every capture, so cookies never carry over;
  • retries for pages that time out or are busy (HTTP 429 or 5xx);
  • emoji and Chinese, Japanese and Korean fonts installed, so text shows no empty boxes;
  • the log and the run summary show the time each step took, which explains slow pages.

Who it's for

  • SEO and marketing teams: capture landing pages and pricing pages, yours and other companies', on a schedule at desktop and phone sizes.
  • Web developers and QA testers: check one layout at five device sizes in a single run, in light and dark mode.
  • Agencies and designers: send clients full-page captures or PDFs of their sites, or crop one section, such as a pricing table.
  • Compliance, legal and research teams: keep dated records of how pages looked, with the capture time and HTTP status on every row.
  • App builders: call it from the API to make page thumbnails and link previews.

How much does it cost?

EventPrice eachPer 1,000
Visible-screen or element screenshot$0.0025$2.50
Full-page screenshot$0.005$5.00
PDF$0.006$6.00
Run start$0.005

Worked examples:

  • 1,000 visible-screen thumbnails: 1,000 × $0.0025 = $2.50, plus $0.005 for the run.
  • 1,000 full pages on desktop: 1,000 × $0.005 = $5.00, plus $0.005. If a quarter of the sites block cloud servers, you pay for 750: $3.755.
  • 20 URLs a day at desktop and mobile, full page: 40 × $0.005 = $0.20, plus $0.005: $0.205 a day, or $6.15 over 30 days.

Free: pages that fail to load, return an HTTP error (404, 500…) or show a bot check. They are listed with the reason and "charged": false.

Element captures are charged at the screenshot rate, even with "Full page" on. Full pages and PDFs cost more because the whole page is rendered, and PDFs are large files to store.

Spending limit: set a maximum cost per run, and the run stops cleanly before the capture that would go over it. The run summary counts the pages it skipped as skippedAtSpendingLimit.

How to use it

  1. Add your web pages, one URL per line, up to 10,000. https:// is added when missing, and repeated URLs are captured once.
  2. Choose device sizes and what to capture: full page or visible screen, PNG, JPEG or PDF, or one element by CSS selector.
  3. Keep the page preparation defaults, or hide more elements, wait for an element, or add a delay.
  4. Click Start. Set a maximum cost per run first if you want a cap. The status line shows progress, such as "12 of 40 done: 11 captured, 1 failed".
  5. Open the Screenshots view for thumbnails, or export the rows as JSON, CSV or Excel. Each row's screenshotUrl links to its file.

The All details view adds the final URL, HTTP status, page height, file size, timing and whether each row was charged.

Example input

Full pages of two sites at three sizes, as PNG, with two extra elements hidden. This makes 6 full-page screenshots: $0.03, plus $0.005 for the run.

{
"urls": ["https://apify.com", "https://en.wikipedia.org/wiki/Web_scraping"],
"devices": ["desktop", "mobile", "custom"],
"viewportWidth": 1280,
"viewportHeight": 800,
"fullPage": true,
"format": "png",
"pixelRatio": "auto",
"hideCookieBanners": true,
"blockAds": true,
"hideSelectors": ["#intercom-container", ".newsletter-popup"],
"maxHeight": 15000
}

One element per page, in dark mode, as a sharp JPEG. This makes 3 element screenshots: $0.0075, plus $0.005 for the run.

{
"urls": ["https://en.wikipedia.org/wiki/Web_scraping", "https://github.com", "https://news.ycombinator.com"],
"devices": ["desktop"],
"selector": "h1, #hnmain",
"fullPage": false,
"format": "jpeg",
"jpegQuality": 85,
"pixelRatio": "2",
"colorScheme": "dark",
"waitUntil": "networkidle",
"delayMs": 1000
}

For PDFs, set "format": "pdf" and, if you like, "pdfPaper": "Letter". A PDF always covers the whole page, so it can't be combined with an element selector.

All input fields

Console titleKeyValues (default)
Web pagesurlsUp to 10,000 URLs (required)
Device sizesdevicesdesktop, laptop, tablet, mobile, android, custom (desktop)
Full pagefullPagetrue or false (true)
Output formatformatpng, jpeg, pdf (png)
Only this element (CSS selector)selectorA CSS selector; the first match is captured (empty)
JPEG qualityjpegQuality1 to 100 (80)
Pixel densitypixelRatioauto, 1, 2, 3 (auto)
Colour schemecolorSchemelight, dark (light)
Hide cookie bannershideCookieBannerstrue or false (true)
Block ads and trackersblockAdstrue or false (true)
Also hide these elementshideSelectorsA list of CSS selectors (empty)
Scroll to load lazy contentscrollToLoadtrue or false (true); used for full pages and PDFs
Wait untilwaitUntilload, domcontentloaded, networkidle (load)
Wait for element (CSS selector)waitForSelectorWaits up to 15 seconds for it to be visible (empty)
Extra delaydelayMs0 to 60,000 ms (0)
Maximum page heightmaxHeight500 to 30,000 px (15,000)
Custom widthviewportWidth200 to 3,840 px (1,440); custom device only
Custom heightviewportHeight200 to 4,000 px (900); custom device only
PDF paper sizepdfPaperA4, Letter, Legal, A3 (A4)
Capture error pagescaptureErrorPagestrue or false (false); when on, error pages are captured and charged
Page load timeoutnavigationTimeoutSecs5 to 180 seconds (45)
RetriesmaxRetries0 to 5 (2)
Pages at oncemaxConcurrency0 to 20 (0: one page per GB of memory, so 4 at the default 4 GB)
ProxyproxyConfigurationOff by default; Apify's datacenter proxy or your own proxy URLs

Example output

One row per page and device. This row is from a test run on Apify (28 October 2026), with the link's signature shortened:

{
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"device": "desktop",
"format": "png",
"fullPage": true,
"selector": null,
"capturedAt": "2026-10-28T19:10:58.130Z",
"status": "ok",
"finalUrl": "https://en.wikipedia.org/wiki/Web_scraping",
"httpStatus": 200,
"title": "Web scraping - Wikipedia",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/…/records/en.wikipedia.org_desktop_cc62473b29.png?signature=…",
"key": "en.wikipedia.org_desktop_cc62473b29.png",
"width": 1920,
"height": 8745,
"viewportWidth": 1920,
"viewportHeight": 1080,
"deviceScaleFactor": 1,
"pageHeight": 8745,
"truncated": false,
"bytes": 2398904,
"loadMs": 23813,
"charged": true,
"error": null
}

The fields:

  • status: ok or failed.
  • screenshotUrl and key: the file's link, and its record name in the run's key-value store.
  • width and height: the image size in pixels, pixel density included. PDF rows leave them empty.
  • viewportWidth, viewportHeight and deviceScaleFactor: the screen the page was shown on.
  • pageHeight: the page's full height in CSS pixels. truncated is true when the page was cut at the maximum height.
  • finalUrl: where the page ended up after redirects. httpStatus and title come from that page.
  • bytes: the file size. loadMs: time from opening the page to finishing the capture.
  • charged: whether this row was charged.

Files and links: each image or PDF is saved in the run's key-value store. Its name is the site, the device and a short code, ending in .png, .jpg or .pdf. The screenshotUrl link carries a signature, so it opens without your API token. Share it only with people who should see the file.

Failed rows are listed free, with "status": "failed", "charged": false and an error saying why. This one is from the same test run:

{
"url": "https://github.com/this-page-does-not-exist-xyz-123",
"device": "desktop",
"format": "png",
"fullPage": true,
"selector": null,
"capturedAt": "2026-10-28T19:17:07.932Z",
"status": "failed",
"finalUrl": "https://github.com/this-page-does-not-exist-xyz-123",
"httpStatus": 404,
"title": "Page not found · GitHub · GitHub",
"screenshotUrl": null,
"key": null,
"width": null,
"height": null,
"viewportWidth": null,
"viewportHeight": null,
"deviceScaleFactor": null,
"pageHeight": null,
"truncated": false,
"bytes": null,
"loadMs": null,
"charged": false,
"error": "The page returned HTTP 404"
}

Other errors you may see:

  • Blocked by bot protection (Cloudflare challenge), or another named bot check;
  • Page did not load: …, with the browser's reason;
  • No element matches "…", when the element selector finds nothing;
  • The element "…" did not appear within 15 seconds, from "Wait for element";
  • The page was too heavy to render in time …, with a tip to lower "Maximum page height" or use JPEG.

Run summary: the RUN_SUMMARY record in the key-value store has:

  • pages requested, captured and failed, and how many were skipped at the spending limit;
  • the average seconds per capture, and per step: opening, loading, checking, scrolling, images, extra waits and capturing;
  • seconds spent on failures, total megabytes, pages at once, and the list of failures.

Integrations

  • Apify API: start a run and get the rows back in one call. Fetch each file from its screenshotUrl.

    curl -X POST "https://api.apify.com/v2/acts/subtleasianmerch~website-screenshot-api/run-sync-get-dataset-items?token=YOUR_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"urls": ["https://apify.com"], "devices": ["desktop", "mobile"], "fullPage": true, "format": "png"}'

    The call returns one row per page and device. For long lists, start the run with the runs endpoint instead, and read the dataset when it finishes.

  • Schedules: capture the same pages daily or weekly. Each run gets its own dataset and files, so you keep a dated record.

  • Webhooks, Make, Zapier and n8n: receive the rows when a run finishes. Each row carries its file link, so the next step can fetch the image.

  • Monitoring: Apify's monitoring can alert you by email or Slack when a scheduled run fails.

FAQ

Is it legal to use? The Actor captures public pages you choose, the way a browser shows them. It doesn't log in, and it doesn't get past bot checks. Whether you may capture and use a page, for example under its terms or copyright, is your responsibility. This isn't legal advice.

Why did a page fail? The row's error field says why: an HTTP error, a bot check, a page that didn't load, or an element that wasn't found. Failed rows have "charged": false, so you don't pay for them. If every page fails, the run ends as failed, with the first error in its status.

Which sites can't be captured?

  • About a quarter of big consumer and news sites block cloud servers. In a 115-site test on Apify, 85 pages were captured and 27 were refused by bot checks or HTTP 403 or 429. 3 more were meant to fail.
  • No bot-check solving. The Actor recognises challenge pages from Cloudflare, DataDome, PerimeterX, Imperva, Amazon and DDoS-Guard, and reports them as failed. It doesn't try to get past them.
  • Logged-in pages aren't supported, and there's no cookies input.
  • Public addresses only. Private and internal addresses are refused, including redirects to them.

How do I capture a site that blocks cloud servers? Turn on "Proxy" with Apify's datacenter proxy (leave the groups empty), or add your own proxy URLs, and keep "Retries" at 2 or more. Each retry uses a new proxy session. In a 20-site test with the datacenter proxy, 16 were captured. Sites that still refuse stay free.

Can I use residential proxies? No. A full page loads 2–5 MB, and residential traffic for that would cost more than the screenshot's price. Runs that ask for residential, Unblocker or Google SERP proxies stop before any capture, so nothing is charged.

How fast is it? Median times per capture in tests on Apify:

  • 30 seconds for a full desktop page, on the 115-site mix;
  • 22 seconds for a full phone page;
  • 15 seconds for a visible screen, and 15 for a PDF;
  • 4 seconds for one element on a simple page.

Pages run 4 at a time by default.

How big are the files, and how do I make them smaller? Phone-size full pages averaged 6 MB as PNG in a 20-site test, because phones default to about 3× density. PDFs of 10 big news, shop and company sites averaged about 18 MB, up to 81 MB. Choose JPEG and lower "JPEG quality", or set "Pixel density" to 1×, for much smaller files.

Can I capture just one part of a page? Yes. Put a CSS selector in "Only this element", such as #pricing. The first matching element is captured, at $2.50 per 1,000.

The page loads its content late. How do I wait for it? Set "Wait until" to "Network quiet", or put the content's selector in "Wait for element". "Extra delay" adds up to 60 seconds for animations or slow widgets.

Why does my screenshot look different from my browser? Ads and trackers are blocked, cookie banners are hidden, and animations are asked to stop. Turn off "Block ads and trackers" or "Hide cookie banners" to see the page as visitors do. Chat bubbles and pop-ups can be hidden with "Also hide these elements". The browser is set to US English, so sites that follow the browser's language show English.

What about endless feeds, web apps and very heavy pages?

  • Endless-scroll pages (some shop and social feeds) are captured as far as they have loaded. Scrolling stops after 12 seconds or at the height limit.
  • Some web apps scroll inside a container instead of the whole page. Full-page capture then shows only the visible part, so use an element selector on the scrolling container.
  • Very heavy pages can time out while rendering. They aren't retried, because they would take as long again. Lower "Maximum page height", or choose JPEG.

What happens when a run reaches my maximum cost? It stops cleanly before the capture that would go over the limit. The run summary counts the rest as skippedAtSpendingLimit.

More Actors from the same developer that work well with this one:

ActorUse it to
Google Ads Transparencyfind a competitor's Google ads, then capture the landing pages they point to
Lighthouse Auditscore the same pages for speed, accessibility and SEO
Video Frame Extractortake still images from video files, the way this Actor captures pages

Questions, bugs or ideas? Open an issue on this Actor's Issues tab.