Website Screenshot API: Full Page, Mobile and PDF avatar

Website Screenshot API: Full Page, Mobile and PDF

Pricing

from $4.00 / 1,000 screenshots

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

Website Screenshot API: Full Page, Mobile and PDF

Take screenshots of any list of URLs as PNG, JPEG or PDF, at screen size or full page. Desktop, laptop, tablet or mobile view, cookie banners and ads hidden, lazy images loaded. Each row links to the file. Failed pages are free.

Pricing

from $4.00 / 1,000 screenshots

Rating

0.0

(0)

Developer

Joe Simo

Joe Simo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Website Screenshot API: full page, mobile and PDF captures of any URL list

Paste a list of URLs, get back a screenshot of each page as PNG, JPEG or PDF, with a download link in every row. Pick desktop, laptop, tablet or mobile view, capture the first screen or the whole scrollable page, and get clean pictures: cookie banners and ads are hidden and lazy images are loaded before the shot.

  • Pay per screenshot, failures free: $0.004 per screen-size screenshot, $0.008 per full page screenshot or PDF. Pages that answer 404 or 403, time out or do not exist are saved with a status and cost nothing.
  • Clean captures: consent pop-ups of common cookie tools (OneTrust, Cookiebot, Didomi, Usercentrics and more) are hidden with CSS (nothing is clicked or accepted), about 50 ad and tracker hosts are blocked, and the page is scrolled so lazy images appear.
  • Batch ready: hundreds of URLs per run, pasted as a list or a column from a spreadsheet, captured in parallel. Every file gets a readable name like 0001-wikipedia.org.png.

Quick start

  1. Click Try for free, keep the prefilled URLs (or paste your own) and press Start.
  2. Or call the API with an empty input {}. It runs this demo:
{
"urls": ["https://www.wikipedia.org", "https://www.python.org"]
}

This run took 23 seconds in the Apify cloud on Nov 1, 2026 and saved 2 screenshots, so it costs 2 x $0.004 = $0.008 plus the run start fee. One of the 2 rows, unchanged:

{
"input": "https://www.python.org",
"url": "https://www.python.org/",
"finalUrl": "https://www.python.org/",
"status": "ok",
"httpStatus": 200,
"title": "Welcome to Python.org",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/Wqejq03XHYIoBqI47/records/0002-python.org.png?signature=clCKPev8pOgNkNCILE8W",
"screenshotKey": "0002-python.org.png",
"format": "png",
"device": "desktop",
"width": 1366,
"height": 768,
"pageHeight": 2581,
"truncated": false,
"bytes": 147754,
"loadTimeMs": 890,
"error": null,
"takenAt": "2026-11-02T03:12:43.022Z",
"charged": true
}

For whole pages, add "fullPage": true. On the same day a full page JPEG run on 7 mixed URLs took 37 seconds: bbc.com/news (6,561 px tall), github.com (7,673 px), stripe.com and theverge.com (cut at the 10,000 px default and marked truncated) were saved and charged; a 404 page, a dead domain and "not a url" were saved with their status for free.

Pricing

EventPriceWhen
Screenshot$0.004 ($4 per 1,000)One page captured at screen size, or one element, as PNG or JPEG
Full page screenshot$0.008 ($8 per 1,000)One whole scrollable page as PNG or JPEG, or one PDF
Run start$0.00005 per GB of memoryOnce per run

Only rows with status: ok are charged, and the charged field shows which ones were. HTTP errors (the capture is still saved), failed loads, timeouts and invalid URLs are free. The run stops cleanly when it reaches the maximum cost per run you set.

Use cases

  • Website archives and change tracking: a dated picture of your pages or competitors' pages every day or week.
  • Agency and SEO reports: before and after shots of client sites on desktop and mobile.
  • Directory and link preview thumbnails: a screen-size JPEG of every site in a list.
  • QA and visual checks: see how each page renders on a phone, a tablet and a large desktop.
  • Compliance and evidence: a PDF of a page with links and selectable text, plus the time it was taken.
  • Feeding AI and vision models: page images for classification or design analysis.

Example inputs

Copy one of these into the JSON tab of the input form.

1. Full page PNG of each page, desktop.

{
"urls": ["https://www.bbc.com/news", "https://github.com", "https://stripe.com"],
"fullPage": true
}

2. Mobile view, first screen, small JPEG files. The mobile preset is an iPhone-sized 390 x 844 screen at 3x pixel density.

{
"urls": ["https://www.python.org", "https://www.wikipedia.org"],
"device": "mobile",
"format": "jpeg",
"jpegQuality": 70
}

3. Paste a column from a spreadsheet. One URL per line or separated by commas. Missing https:// is added.

{
"urlsText": "url\nwikipedia.org\nhttps://www.python.org/\ngithub.com, bbc.com/news"
}

4. PDF of each page in A4.

{
"urls": ["https://www.python.org/about/"],
"format": "pdf",
"pdfPageFormat": "A4"
}

5. One element only, after it appears. The capture is the element's box, billed as a screen-size screenshot.

{
"urls": ["https://github.com"],
"selector": "header",
"waitForSelector": "header"
}

6. Custom screen size, dark mode, hide your own pop-up.

{
"urls": ["https://github.com"],
"viewportWidth": 1600,
"viewportHeight": 1000,
"darkMode": true,
"hideSelectors": [".newsletter-modal"]
}

Input

FieldDescription
urlsURLs to capture. example.com works, https:// is added.
urlsTextBulk paste: one URL per line, or separated by commas, spaces or semicolons.
devicedesktop (1366 x 768, default), desktop-hd (1920 x 1080), laptop (1280 x 800), tablet (820 x 1180, 2x) or mobile (390 x 844, 3x).
formatpng (default), jpeg or pdf.
fullPageCapture the whole scrollable page instead of the first screen (off by default).
maxHeightFull page captures stop at this height (default 10,000 px) and are marked truncated.
jpegQuality10 to 100 (default 80).
viewportWidth / viewportHeight / deviceScaleFactorOverride the device preset.
hideCookieBannersHide consent pop-ups with CSS (on by default).
blockAdsBlock common ad and tracker hosts (on by default).
scrollToLoadScroll the page before a full page capture so lazy images load (on by default).
darkModeAsk the site for its dark theme.
hideSelectorsExtra CSS selectors to hide, for example a chat widget.
selectorCapture only the first element matching this CSS selector.
waitForSelectorWait for this element before capturing.
waitUntilload (default), domcontentloaded or networkidle.
delaySecsExtra wait before the capture, for animations (default 0).
pdfPageFormatA4 (default), Letter, Legal or A3.
timeoutSecsPage load timeout (default 30 seconds).
maxConcurrencyPages in parallel. Automatic by default, based on memory.
maxItemsStop after this many URLs (0 = no limit).
dedupeCapture each URL once (on by default).

Output

One dataset row per URL, in the order the pages finish. The Overview view in the Console shows the screenshot right in the table. Key fields:

  • screenshotUrl: a direct, signed link to the file that opens without an Apify token.
  • screenshotKey: the file name in the run's key-value store.
  • status: ok, http_error (the site answered 4xx or 5xx, the capture is saved but free), failed (DNS, connection, timeout or a crashed page) or invalid_input.
  • width, height, pageHeight, truncated: what was captured and how tall the page really is.
  • title, finalUrl, httpStatus, bytes, loadTimeMs, takenAt, error, charged.

The OUTPUT record of each run has a summary: files saved and charged, status counts, total megabytes and the options used.

Download all files: open the run's Storage > Key-value store tab, or list them with the API: GET https://api.apify.com/v2/key-value-stores/{storeId}/keys. Files are kept for your plan's data retention period, so copy what you need to keep.

Use with the API, Make, Zapier or n8n

Call the Actor with the Apify API or a client library, for example with curl:

curl -X POST "https://api.apify.com/v2/acts/joesimo~website-screenshot/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://www.wikipedia.org"], "fullPage": true}'

The response is the list of rows, each with its screenshotUrl. The Actor also works from Make, Zapier and n8n through their Apify integrations, and as a tool through the Apify MCP server.

FAQ

Do I pay for pages that fail? No. Only status: ok rows are charged. A 404 or 403 page is still captured, so you can see what the site showed, but it is free.

Why is a site marked http_error with a 403? Some large sites block cloud servers with bot protection. The Actor does not bypass it. In our tests on 20 big brand homepages, 3 answered 403 (nytimes.com, reddit.com, etsy.com).

Does it log in or accept cookies? No. It captures what an anonymous visitor sees. Cookie banners are hidden with CSS, never accepted.

How tall can a full page screenshot be? Up to 16,000 px (5,333 px on the 3x mobile preset), because browsers cannot paint more in one image. The default stops at 10,000 px.

Is a full page screenshot of a long page slow? Most pages take 2 to 10 seconds. Very long pages with heavy animation can take 20 to 30 seconds. Raise the memory to 4 GB for faster runs on big lists.

Honest limits

  • No login, no captcha solving, no bot protection bypass. Private pages and sites that block cloud servers return http_error or failed for free.
  • Hidden with CSS, not removed: a few custom pop-ups are not covered by the built-in list. Add their selectors to hideSelectors.
  • Video and audio are not loaded, so video players show a placeholder.
  • Fixed headers appear once at the top of full page captures, as in a browser.

Responsible use

Capture pages you have a right to view and use. Screenshots can include personal data or copyrighted material shown on a page; you are responsible for how you store and share them.

Support

Found a page that renders wrong or a pop-up that is not hidden? Open an issue on the Actor's Issues tab with the URL. Contact: joesimo@mail.grokbot.com

More examples and the docs for all 7 of our Actors: github.com/Joe-Simo/apify-actors. Store page: https://apify.com/joesimo/website-screenshot