# Bulk Website Screenshot Tool | Full Page, URL to PNG & PDF (`aurelix/website-screenshot`) Actor

Extract website screenshots of many URLs at $1.50 per 1,000 on the free plan: URL to PNG, JPEG, WebP or PDF, cookie banners and popups hidden, ads blocked. Full page screenshots with lazy images loaded as an add-on; desktop to mobile, element shots, a changed-since-last-run flag. No login.

- **URL**: https://apify.com/aurelix/website-screenshot.md
- **Developed by:** [Aurelix](https://apify.com/aurelix) (community)
- **Categories:** Developer tools, Automation, SEO tools
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 screenshots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What is Bulk Website Screenshot Tool?

**Screenshot a whole list of web pages with cookie banners hidden and ads blocked, at $1.50 per 1,000 screenshots, no login.**

Real headless Chrome. Screen size by default; full page with lazy images loaded for $2.00 per 1,000 more. JPEG, PNG, WebP or PDF, desktop to mobile. URLs that fail are never charged. Your first run with the example input costs about $0.0085 (3 screenshots in our test run).

[![Bulk Website Screenshot Tool: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/website-screenshot-card-v3.png)](https://console.apify.com/actors/pgTHBWaTVps5lLrNx?addFromActorId=pgTHBWaTVps5lLrNx)

| | |
|---|---|
| **Input** | A list of page URLs (one run handles hundreds) |
| **Output** | JPEG, PNG, WebP or PDF files with public links; 22 fields per screenshot; JSON, CSV, Excel, API |
| **Devices** | Desktop 1920x1080, laptop, tablet, mobile, or any custom size |
| **Automate** | Schedules, a changed-since-last-run flag, webhooks, Zapier, Make, n8n, MCP for AI agents |
| **Price** | $1.50 per 1,000 screenshots |
| **Free to try** | Runs on Apify's free plan: the $5 monthly credit covers about 3,300 screenshots (or about 1,400 full-page screenshots) |
| **Login needed** | No |

### Why Bulk Website Screenshot Tool users pick this one

- **Cookie banners hidden.** About 60 rules for OneTrust, Cookiebot, Didomi and others; nothing clicked.
- **Full page when you need it.** Scrolled first so lazy images load; $2.00 per 1,000 extra.
- **Failed URLs are free.** Timeouts, 404s and robots.txt blocks are reported and never charged.
- **Flat price, no compute units.** $1.50 per 1,000 screen-size shots; nothing billed on top.
- **Change flag built in.** Each row says if the image changed since your last run.

### Get started in 3 steps

1. Paste your page URLs into **Page URLs**, one per line, e.g. https://www.python.org. The defaults give a 1920x1080 JPEG of each page with cookie banners hidden.
2. Optionally turn on **Full page**, pick a **Device** (laptop, tablet, mobile or a custom size), switch **Image format** to PNG, WebP or PDF, or give a CSS selector to capture one element.
3. Click **Start**. Open each `screenshot_url` from the Output tab, or download the list as JSON, CSV or Excel, or fetch it through the API, Zapier, Make or n8n.

**[▶ Try it with the example input](https://console.apify.com/actors/pgTHBWaTVps5lLrNx?addFromActorId=pgTHBWaTVps5lLrNx)**

The form opens with an example input already filled in: that run costs about $0.0085 on the free plan.

### How much does it cost to screenshot websites?

Pay per event: you pay only for what the run returns, plus a small start fee.

| Screenshots | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| 100 | $0.15 | $0.15 |
| 1,000 | $1.50 | $1.50 |
| 10,000 | $15.00 | $15.00 |

Totals include the $0.004 start fee per run, rounded to the cent. Apify's free plan includes $5 of credit a month, enough for about 3,300 screenshots (or about 1,400 full-page screenshots).

Two events, and no compute units billed on top: `screenshot` ($1.50 per 1,000) for every saved screenshot, plus the `full-page` add-on ($2.00 per 1,000) only for screenshots taken with **Full page** on and for PDFs (a PDF always holds the whole page). So 1,000 full-page screenshots cost $3.50, and screen-size or element shots $1.50. The format and device do not change the price. Prices are the same on paid Apify plans: they are already the lowest that cover our measured cost. Not charged: URLs blocked by robots.txt, sites that cannot be reached, HTTP errors (403, 404, 5xx), timeouts, a selector or wait-for element that never appears, duplicate URLs in your list, and, with **Only changed since last run**, screenshots identical to the last run's. Set a **maximum cost per run** in the run options and the Actor stops capturing when it is reached.

#### Billing events

| Event | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| `screenshot` | $1.50 per 1,000 screenshots | $1.50 per 1,000 screenshots |
| `full-page` | $2.00 per 1,000 full-page add-ons | $2.00 per 1,000 full-page add-ons |
| `apify-actor-start` | $0.001 per GB of run memory ($0.004 per run at the 4 GB default) | $0.001 per GB of run memory ($0.004 per run at the 4 GB default) |

### Benchmarks: how we compare

| Test | Input | Result | Run time | Peak memory |
|---|---|---|---|---|
| Mixed list, defaults | 40 URLs: 20 heavy home pages (BBC, Guardian, Stripe, Shopify, IKEA, Figma...) and 20 docs, articles and government pages; screen size, JPEG, 8 at a time | 40 of 40 saved | 72 s | 2.6 GB |
| Full page | Same 40 URLs, Full page on | 40 of 40 saved | 209 s | 3.7 GB |
| Heavy home pages | 30 marketing and news home pages, full page (earlier build) | 29 of 30 saved; w3.org answered HTTP 403 (not charged) | 204 s | 2.7 GB |
| Local checks | Test page with a OneTrust banner, a cookie modal, a sticky header and late content | Both banners hidden, header kept, element, wait-for, PDF and height cap correct; missing selector and HTTP 404 fail cleanly |  |  |

Cloud runs on Apify at the 4 GB default memory, read from each run's own statistics. Full page means up to 16,000 CSS pixels tall. Run times include starting the browser; the same list took up to 25% longer on other runs, as Apify servers differ.

### What data you get

**Bulk Website Screenshot Tool** opens each URL you give in a real headless Chrome, hides cookie and consent banners and sign-up popups, blocks ad and tracker requests, and saves a screenshot of the screen (default), one element, or the whole page (scrolled first so lazy-loaded images appear) as JPEG, PNG, WebP or a printable PDF. Each file goes to the run's key-value store, and the dataset gets one row per screenshot with a public link, the page title, the final URL after redirects, the image size, a SHA-256 hash and a changed flag against the last run.

- screenshot_url: a public link to the JPEG, PNG, WebP or PDF in the run's key-value store, plus its `key`, `format` and `content_type`
- url, final_url (after redirects), title and http_status of the page
- device, viewport {width, height, device_scale_factor}, full_page, selector, image_width, image_height, truncated, file_size_bytes
- image_sha256 and changed (true / false / null on the first capture) for change monitoring
- banners_hidden (cookie banners and popups hidden), load_time_ms, source_url and scraped_at (ISO 8601 UTC)
- URLs that could not be captured: listed in the run's status message and in the key-value store record FAILED_URLS with the reason; never charged

| url | title | image_width | image_height | file_size_bytes | banners_hidden | changed |
|---|---|---|---|---|---|---|
| https://www.python.org/ | Welcome to Python.org | 1920 | 1080 | 143110 | 0 | False |
| https://www.bbc.com/ | BBC Home | Breaking News, World News, US News, Sports, B... | 1920 | 1080 | 153586 | 0 | False |
| https://www.lemonde.fr/ | Le Monde in English – World news, culture and opinion | 1920 | 1080 | 143091 | 1 | True |
| https://www.gov.uk/browse/business | Business and self-employed - GOV.UK | 1920 | 1080 | 97425 | 0 | False |
| https://react.dev/ | React | 1920 | 1080 | 79416 | 0 | False |

One full screenshot record, exactly as a real run with the default settings returned it (Le Monde redirected to its English edition, and one cookie banner was hidden). From a real run:

```json
{
  "url": "https://www.lemonde.fr/",
  "final_url": "https://www.lemonde.fr/en/",
  "title": "Le Monde in English – World news, culture and opinion",
  "http_status": 200,
  "screenshot_url": "https://api.apify.com/v2/key-value-stores/hFGG926XRr4Tpaxqg/records/www-lemonde-fr-39499c786b62.jpg?signature=5278laU9wO... [10 more characters]",
  "key": "www-lemonde-fr-39499c786b62.jpg",
  "format": "jpeg",
  "content_type": "image/jpeg",
  "device": "desktop",
  "viewport": {
    "width": 1920,
    "height": 1080,
    "device_scale_factor": 1
  },
  "full_page": false,
  "selector": null,
  "image_width": 1920,
  "image_height": 1080,
  "truncated": false,
  "file_size_bytes": 143091,
  "image_sha256": "2e1ad62c23c74ded9b660557a71181bbbf2d168c671c61fb01b1e2f2364c7251",
  "changed": true,
  "banners_hidden": 1,
  "load_time_ms": 2727,
  "source_url": "https://www.lemonde.fr/",
  "scraped_at": "2026-11-05T07:50:56Z"
}
```

### Use cases

- Marketers and agencies capturing competitor home pages, pricing pages and landing pages every week
- SEO and web teams archiving how pages looked before and after a redesign or release
- QA and developers checking responsive layouts on desktop, tablet and mobile in one go
- Compliance and legal teams keeping a dated visual record of public pages and terms
- Directories, link-preview and thumbnail services that need a fresh image of many sites
- AI agents that need to see a page: hand them the screenshot link through MCP

### Use-case recipes

#### Weekly competitor page monitor

For marketers. Save the input as a task with your competitors' home and pricing pages, turn on **Only changed since last run**, and schedule it weekly. Each run returns only the pages whose screenshot changed, so the dataset is your change list; hide chat widgets and rotating banners with **Hide these elements** to avoid false alarms.

```json
{
  "urls": [
    "https://www.python.org",
    "https://www.djangoproject.com"
  ],
  "incremental": true,
  "trackingId": "competitors-weekly",
  "hideSelectors": [
    "#chat-widget"
  ]
}
```

#### Responsive check on three screen sizes

For developers and QA. Start the same URL list three times with `device` set to desktop, tablet and mobile (or save three tasks), then compare the three images side by side.

```json
{
  "urls": [
    "https://react.dev"
  ],
  "device": "mobile",
  "format": "png"
}
```

#### Archive pages as PDF

For compliance and records. PDF on A4 with backgrounds printed keeps a printable copy of terms, policies and announcements (a PDF is charged as a full page); the hash in each row shows whether the page changed since the last archive.

```json
{
  "urls": [
    "https://en.wikipedia.org/wiki/Screenshot"
  ],
  "format": "pdf",
  "pdfPaper": "A4"
}
```

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `urls` (Page URLs) | array | Pages to capture, one per line, e.g. \['https://apify.com', 'https://www.python.org']. | \["https://apify.com", "https://www.python.org", "https://... |
| `device` (Device) | string | Screen to emulate, e.g. 'mobile'. desktop = 1920x1080, laptop = 1366x768, tablet = 820x1180 (iPad Air size, 2x pixels), mobile... | "desktop" |
| `fullPage` (Full page) | boolean | false = the visible screen, e.g. 1920x1080 on desktop (the base price). true = the whole scrollable page, scrolled first... | false |
| `format` (Image format) | string | File type, e.g. 'png'. jpeg = small files and fast (default), png = lossless and larger, webp = smallest files... | "jpeg" |
| `hideCookieBanners` (Hide cookie banners and popups) | boolean | true = hide cookie and consent banners (about 60 rules for OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics and other consent... | true |
| `hideSelectors` (Hide these elements) | array | CSS selectors to hide before the screenshot, e.g. \['#chat-widget', '.ad-slot', 'header']. |  |

All 21 fields, with examples: see the **Input** tab.

### Use with AI agents (MCP)

MCP (Model Context Protocol) is the open standard that lets AI assistants such as Claude, ChatGPT and Cursor call outside tools. Apify's hosted MCP server at `https://mcp.apify.com/?tools=aurelix/website-screenshot` gives your assistant this Actor only: it fills in the input from your request, runs it and reads the screenshots back, at the same per-result price as a run started by hand.

#### Example prompts

- "Take full-page screenshots of https://www.python.org and https://react.dev on desktop and on mobile, and give me the image links in a table"
- "Capture only the pricing section (#pricing) of these three pages as PNG and tell me which ones failed and why"
- "Screenshot our competitors' home pages every Monday and tell me which ones changed since last week"

#### Claude Desktop and claude.ai

**Settings > Connectors > Add custom connector**, name it Apify, paste `https://mcp.apify.com/?tools=aurelix/website-screenshot`, keep the detected OAuth settings, select **Add** and sign in to Apify.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/website-screenshot"
```

#### Cursor and VS Code

Add this to `~/.cursor/mcp.json` (Cursor); in VS Code's `.vscode/mcp.json` put the same entry under `"servers"` with `"type": "http"`. Sign in to Apify when asked.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/website-screenshot"
    }
  }
}
```

#### ChatGPT

Turn on **Developer mode**, open **Settings > Apps & Connectors > Create**, paste the URL above as the MCP server URL, choose **OAuth** and authorize Apify.

Clients without sign-in send `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead. No Apify account? This Actor supports Apify's agentic payments: an agent can pay per run with a prepaid, spend-capped token, bought with x402 stablecoin payments.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/website-screenshot` and a Bearer credential holding your Apify token.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/website-screenshot (Bulk Website Screenshot Tool) through Apify's MCP server or API. Main input: urls (Page URLs). Example input: {"urls": ["https://www.python.org", "https://en.wikipedia.org/wiki/Screenshot"], "device": "desktop", "fullPage": false, "format": "jpeg"}. Each result is one screenshot with fields such as url, final_url, title, http_status, screenshot_url, key, format, content_type. It costs $1.50 per 1,000 screenshots on Apify's free plan plus a $0.004 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/website-screenshot` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/website-screenshot").call(run_input={'urls': ['https://www.python.org', 'https://en.wikipedia.org/wiki/Screenshot'], 'device': 'desktop', 'fullPage': False, 'format': 'jpeg'})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only changed since last run** so each run returns only what is new.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I screenshot websites without login?

Yes. It never logs in, so you need no website account, password or cookies; only a free Apify account to run it.

#### Is there a website screenshot API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to screenshot websites?

About $1.50 for 1,000 screenshots on Apify's free plan, start fee included. The free $5 monthly credit covers about 3,300 screenshots (or about 1,400 full-page screenshots).

#### Can I export the screenshot links to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to screenshot websites?

It reads only public data any logged-out visitor can see: the pages you list (capture only pages you have the right to capture, such as your own, your clients', or public pages for fair uses like archiving and comparison). It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns an image of each page and its title; any text or images on the page stay the property of their owners, and personal data visible on a page is not extracted. To have a record removed, open an issue on this Actor's Issues tab; if a site owner formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

#### Can I take a full page screenshot of a website online?

Yes. Paste the URL, turn **Full page** on and click Start; the screenshot link appears in the Output tab when the run ends. It runs in the cloud, so nothing is installed, and the free Apify plan covers about 1,400 full-page screenshots a month.

#### Can I convert a URL to PNG or PDF in bulk?

Yes. Paste all URLs, set **Image format** to PNG (or PDF) and start one run; every URL becomes one file with its own public link.

#### How are cookie banners hidden?

Two ways, before the screenshot. First, about 60 hiding rules for consent tools and common cookie notices (OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics, Osano, Complianz, CookieYes, iubenda, Sourcepoint, Klaro, Termly and others) are added as the page starts loading. Second, any fixed overlay whose text talks about cookies or consent is hidden, as are newsletter popups with an email field and the empty dark backdrop behind them, and page scrolling is unlocked. On top of that, the scripts of the common consent tools are not loaded at all, so many banners never appear. Nothing is clicked, so no consent is given on your behalf. `banners_hidden` in each row counts the banners that did appear and were hidden. Turn **Hide cookie banners and popups** off to see the page as a first-time visitor does.

#### Will lazy-loaded images show up?

Yes with **Full page** on: the page is scrolled down one screen at a time (images marked loading=lazy are switched to load straight away), the Actor waits briefly for the network and pending images, scrolls back to the top and then takes the shot (a page that fits on one screen is not scrolled). Screen-size shots skip scrolling: images in the first screen load as normal. Pages that load content only on user actions such as clicks are captured as they are.

#### What happens when a URL fails?

It is retried once if the error looks temporary (timeout, connection reset, HTTP 429 or 5xx), then reported with the reason and not charged. The other URLs carry on. The run's status message counts the failures by reason, and the key-value store record `FAILED_URLS` lists each URL and why. The run itself still ends SUCCEEDED.

#### How long can a full-page screenshot be?

Up to **Max full-page height**, 16,000 CSS pixels by default. Taller pages (infinite scroll, very long articles) are cut at that height and the row says `truncated: true`.

#### Can I capture just one part of a page?

Yes. Put a CSS selector such as `#pricing` or `main article` into **Element to capture**. The first match is captured. If nothing matches, that URL fails and is not charged.

#### Can I wait for something to load first?

Yes. **Wait for element** waits until a CSS selector is visible (for charts, search results or single-page apps), and **Extra delay** adds up to 30 seconds after loading.

#### How does the change flag work?

Each screenshot's SHA-256 hash is kept per URL and settings in a named key-value store on your account. `changed` is true when the file differs from the last run's, false when it is identical and null the first time. With **Only changed since last run** on, identical screenshots are not saved and not charged. Any pixel counts as a change, so hide clocks, carousels and chat bubbles with **Hide these elements** for a quieter signal. Use **Change-tracking name** to keep separate histories for separate schedules.

#### Which image format should I use?

JPEG (default) is small and quick; PNG is lossless and sharper for text but several times bigger on long pages; WebP is the smallest; PDF gives a printable document of the whole page on A4, Letter, Legal or A3 paper with backgrounds printed. JPEG, PNG and WebP cost the same; a PDF includes the full-page add-on.

#### How long are the files kept?

The images live in the run's default key-value store, which Apify keeps for your plan's data retention period (7 days on the free plan, longer on paid plans). Download them, or send them on with an integration, if you need them for longer.

#### Can it capture pages behind a login or a CAPTCHA?

No. It never logs in, takes no cookies or passwords, and does not solve CAPTCHAs. Sites that answer an automated browser with a block page or HTTP 403 are reported as failed and not charged.

#### Does it use a proxy?

No. Pages are loaded straight from Apify's servers (in the US), so sites that show different content by country show their US version, and some consent banners never appear to US visitors at all.

#### How many URLs can one run take?

Hundreds. Eight screen-size pages (or five full pages) are captured at the same time at the 4 GB default memory; in our tests 40 mixed pages took 72 seconds at screen size and about 3.5 minutes full page. Raise memory and **Pages at the same time** together for longer lists.

#### Why is full page an add-on?

A full-page screenshot scrolls the whole page, loads every lazy image and encodes an image up to 16,000 pixels tall: in our measurements it uses about three times the computing of a screen-size shot. Charging it separately keeps the screen-size price at $1.50 per 1,000 for everyone who does not need it.

### Lawful use

- Capture only pages you have the right to capture. The Actor returns an image of a public page; it does not extract or index personal data, and any personal data visible on a page you capture is your responsibility.
- It never logs in, accepts no cookies or credentials, and never clicks consent buttons on your behalf.

### Integrations: n8n, Make, Zapier, JavaScript and cURL

Every run returns a dataset (one row per screenshot) and a key-value store (the files), so any tool that can call a REST API can use it.

- **n8n**: in the **Apify** node, run the Actor `aurelix/website-screenshot` with the input JSON and read its dataset items. Each item has `screenshot_url`; an **HTTP Request** node with the response format set to file downloads the image for Google Drive, S3 or Slack.
- **Make**: in the Apify app, run the Actor and wait for it to finish, then get the dataset items; an HTTP module downloads each `screenshot_url`.
- **Zapier**: in the Apify app, run the Actor with the input JSON, then fetch its dataset items and post each `screenshot_url` to Slack, Sheets or Notion.
- **Google Sheets**: Apify's Google Sheets integration on a saved task puts one row per screenshot (with the image link) into a sheet after every run.

JavaScript (Node.js):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('aurelix/website-screenshot').call({
    urls: ['https://www.python.org', 'https://react.dev'],
    device: 'mobile',
    format: 'png',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.url, item.screenshot_url);
```

cURL (waits for the run and returns the rows; good for short lists):

```bash
curl -X POST "https://api.apify.com/v2/acts/aurelix~website-screenshot/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.python.org"], "format": "png"}'
```

### Limits (stated honestly)

- Public pages only: no login, no cookies or headers of your own, no CAPTCHA solving. Sites that block automated browsers (in our tests nytimes.com, etsy.com and w3.org answered HTTP 403) fail and are not charged.
- robots.txt is always obeyed for the page URL (the rules for all robots apply to our AurelixBot user agent); a site whose robots.txt cannot be read is treated as unreachable.
- No proxy: pages load from Apify's US servers, so you see a site's US version.
- Full-page height is capped at 16,000 CSS pixels (row marked truncated); full page costs $2.00 per 1,000 on top of the base price. Mobile and tablet shots are at 2x pixel density, so a 16,000 px tall mobile page is 32,000 pixels tall.
- Ad and tracker requests are blocked by default, so ad slots appear empty; turn **Block ads and trackers** off for a page as served.
- Cookie-banner hiding covers about 60 consent tools plus a text check; a banner built in an unusual way can stay visible. Hide it with **Hide these elements**.
- On our 40-URL test, screen-size pages took 1 to 53 seconds each with 8 at a time (median 8 s) and full pages 4 to 70 seconds (median 24 s); the per-URL timeout is 45 s to load plus 40 s to draw the image, with one retry. The page is captured at most 4 seconds after it starts loading plus a short network-idle wait: use **Wait for element** or **Extra delay** for slow content.
- Videos, canvases with animation and live content are captured as they look at that instant; animations are paused and reduced motion is requested.
- Files stay in the run's key-value store for your plan's data retention period (7 days on the free plan).

### Works great with

- **Then: [Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: put the same URLs into its `startUrls` to get the page text as Markdown next to each screenshot
- **Before this: [Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: audit a site first, then screenshot the pages it flags

### Related Aurelix tools

Public Aurelix Actors, grouped by the data they collect. All are pay-per-result and need no login.

#### AI, content and SEO

- **[Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
- **[Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
- **[PDF Table Extraction & PDF to Markdown OCR](https://apify.com/aurelix/pdf-to-markdown)**: Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
- **[Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: Audits a whole site: one row per page with SEO checks and broken links, plus a ranked issues summary.
- **[Bulk TikTok Transcripts Scraper](https://apify.com/aurelix/tiktok-transcript-scraper)**: Returns TikTok video transcripts as text, timed segments and SRT, from video links or @profiles' latest videos.
- **[Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.
- **[YouTube Transcript Scraper](https://apify.com/aurelix/youtube-transcript-scraper)**: Returns YouTube video transcripts as text, timed segments and AI chunks, from videos, channels, playlists or searches.
- **[YouTube Video Scraper API](https://apify.com/aurelix/youtube-video-scraper)**: Full details for every YouTube video in a search, channel or playlist: views, likes, comments, tags, publish time.

#### Jobs and hiring data

- **[Job Bank Canada Scraper API](https://apify.com/aurelix/job-bank-canada-scraper)**: Official Job Bank Canada postings by month: NOC and NAICS codes, wages, hours and location.
- **[Greenhouse Jobs Scraper](https://apify.com/aurelix/greenhouse-jobs-scraper)**: Live jobs from a company's Greenhouse, Lever, Ashby or SmartRecruiters board, with salary and Canadian province tags.
- **[Career Page Monitor](https://apify.com/aurelix/hiring-signal-monitor)**: New, removed and reposted roles plus hiring velocity per company, from seven job-board systems including Workday.
- **[LinkedIn Jobs Country Filter Scraper](https://apify.com/aurelix/linkedin-jobs)**: Public LinkedIn job postings by keyword and country: title, company, location, seniority, job type, salary text, description.
- **[Multiple Job Boards Scraper](https://apify.com/aurelix/multi-job-board-scraper)**: LinkedIn, about 50 company career sites, Remote OK and We Work Remotely jobs in one deduplicated list.
- **[Remote Job Board Scraper API](https://apify.com/aurelix/remote-jobs-scraper)**: Remote OK and We Work Remotely jobs in one deduplicated list with salary, regions and tags.
- **[Wellfound Jobs API & Scraper](https://apify.com/aurelix/wellfound-jobs-scraper)**: Wellfound startup jobs with salary and equity ranges, company stage and size, $0.50 per 1,000.
- **[Workday Job Postings Scraper](https://apify.com/aurelix/workday-jobs-scraper)**: Jobs from any Workday career site by link or company name, with full descriptions and Canadian province tags.

#### E-commerce and product data

- **[AliExpress Scraper API](https://apify.com/aurelix/aliexpress-product-search)**: AliExpress search results by keyword: price, discount, rating, units sold, ship-from country and sponsored flag.
- **[Amazon Best Sellers & Amazon New Releases](https://apify.com/aurelix/amazon-best-sellers)**: Amazon Best Sellers and New Releases top 100 on 10 marketplaces: rank, ASIN, price, rating, rank change.
- **[Best Buy Canada Scraper API](https://apify.com/aurelix/best-buy-canada-scraper)**: Best Buy Canada search results: CAD price, sale savings, rating, reviews and seller, plus optional UPC and specs.
- **[Shopify App Store Scraper](https://apify.com/aurelix/shopify-app-store-scraper)**: Shopify App Store apps with pricing plans, ratings, category ranks and reviews; new-app and new-review watch.
- **[Shopify Product Export Scraper](https://apify.com/aurelix/shopify-products-scraper)**: Every public product of any Shopify store with variants, SKUs, prices, barcodes, stock counts and collections.
- **[Shopify Best Sellers Tracker](https://apify.com/aurelix/shopify-best-sellers-tracker)**: Competitor Shopify stores' best-sellers, new products, price changes, stock-outs and restocks since your last run, plus catalogue summary.

#### Leads and company data

- **[Companies House Scraper](https://apify.com/aurelix/companies-house-scraper)**: Newly incorporated UK companies from Companies House: SIC codes, region, registered office, directors with roles.
- **[Contact Page Scraper](https://apify.com/aurelix/contact-details-scraper)**: Published company emails, phones, addresses, social pages and team members from a list of company websites.
- **[Decision Maker Finder](https://apify.com/aurelix/decision-maker-finder)**: Founders, CEOs, VPs and department heads from company team pages, with title, seniority and function.
- **[Newly Funded Companies Hiring](https://apify.com/aurelix/funded-companies-hiring)**: Companies that just raised money (SEC Form D), with their open roles and business contacts, as a new-only monitor.
- **[Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: Local business lists from Google Maps: phones, websites, ratings, hours, coordinates; optional website emails and socials.
- **[Recently Funded Companies API](https://apify.com/aurelix/recently-funded-companies)**: US companies that just filed an SEC Form D: amount raised, industry, state, executives, confirmed website.
- **[Tech Stack API](https://apify.com/aurelix/tech-stack-detector)**: CMS, e-commerce platform, analytics, ad pixels, chat, CDN and email provider for each domain you enter.
- **[Yellow Pages Canada Scraper](https://apify.com/aurelix/yellow-pages-canada-scraper)**: YellowPages.ca businesses by search term and city: phone, website, address, postal code, hours and rating.

#### Ad intelligence

- **[Competitor Watch](https://apify.com/aurelix/competitor-watch)**: One report per competitor with only what is new: Meta and TikTok ads, page changes, Shopify products and prices, jobs.
- **[Facebook Ad Library Search & API](https://apify.com/aurelix/facebook-ad-library-scraper)**: Facebook and Instagram business ads from the Meta Ad Library: copy, creatives, landing pages, dates, optional EU reach.
- **[TikTok Ads Library API](https://apify.com/aurelix/tiktok-ads-library-scraper)**: TikTok Ads Library ads for Europe, UK, Switzerland and Turkey with targeting, reach, ad text and landing pages.

#### Canada and government data

- **[Canada Building Permits](https://apify.com/aurelix/canada-building-permits-scraper)**: Building permits and development applications from 7 Canadian cities: address, type, status, dates, value, applicant, contractor and Toronto planner contact.
- **[Government Tenders Scraper](https://apify.com/aurelix/government-tenders-scraper)**: Open tenders from SAM.gov, CanadaBuys and EU TED in one table: buyer, codes, value, deadline, contact and link.
- **[USPTO Trademark API](https://apify.com/aurelix/uspto-trademark-search)**: US trademark search and watch from USPTO: mark, owner or number lookups, new filings, owner, attorney, goods.

#### More data tools

- **[Agoda API (Unofficial)](https://apify.com/aurelix/agoda-reviews-scraper)**: Scrape Agoda guest reviews at $0.50 per 1,000 with this unofficial Agoda API, cheaper than the leading tools: Agoda and...
- **[Tennis Betting Odds Scraper](https://apify.com/aurelix/tennis-odds-scraper)**: Tennis results and upcoming matches with opening and closing odds per bookmaker and implied probabilities.

### Recent changes

- **0.1**: First release: screen-size, element and full-page screenshots (full page scrolled for lazy images, as an add-on), cookie-banner and popup hiding, ad blocking, desktop/laptop/tablet/mobile/custom screens, wait-for selector, JPEG, PNG, WebP and PDF, per-URL timeout with one retry, failed URLs never charged, changed flag and only-changed mode, robots.txt obeyed.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 2 screenshots come back with `url`, `screenshot_url`, `key`, `format`, `file_size_bytes`, `image_sha256` filled in; a failed check alerts the maintainer straight away.

### Was this useful?

- **Something went wrong?** [Open an issue](https://apify.com/aurelix/website-screenshot/issues) and tell us what you ran: we answer fast and aim to reply within a day.
- **It worked?** [Leave a review](https://apify.com/aurelix/website-screenshot/reviews): it takes a minute and helps other people find this tool.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/website-screenshot/changelog.md

# Actor input Schema

## `urls` (type: `array`):

Pages to capture, one per line, e.g. \['https://apify.com', 'https://www.python.org']. A URL without http(s):// gets https://. Duplicates are captured once. Only pages a logged-out visitor can see; you must have the right to capture them.

## `device` (type: `string`):

Screen to emulate, e.g. 'mobile'. desktop = 1920x1080, laptop = 1366x768, tablet = 820x1180 (iPad Air size, 2x pixels), mobile = 390x844 (iPhone 14 size, 2x pixels, mobile browser), custom = the width and height below at 1x.

## `fullPage` (type: `boolean`):

false = the visible screen, e.g. 1920x1080 on desktop (the base price). true = the whole scrollable page, scrolled first so lazy-loaded images appear, up to Max full-page height; adds the full-page charge per screenshot.

## `format` (type: `string`):

File type, e.g. 'png'. jpeg = small files and fast (default), png = lossless and larger, webp = smallest files, pdf = a printable PDF of the whole page on the paper size below (always charged as full page).

## `hideCookieBanners` (type: `boolean`):

true = hide cookie and consent banners (about 60 rules for OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics and other consent tools, plus a text check) and newsletter sign-up popups before the screenshot. Nothing is clicked or accepted. false = capture the page as a first-time visitor sees it.

## `hideSelectors` (type: `array`):

CSS selectors to hide before the screenshot, e.g. \['#chat-widget', '.ad-slot', 'header']. Useful for chat bubbles, ads or anything that changes on every visit.

## `blockAds` (type: `boolean`):

true = do not load common ad, analytics and video-player requests (about 50 ad and tracker networks), so ad slots stay empty and pages load faster. false = load everything the page asks for.

## `selector` (type: `string`):

Capture only one element instead of the page, e.g. '#pricing' or 'main article'. The first match is used; if nothing matches, that URL fails and is not charged. Leave empty for the page.

## `waitForSelector` (type: `string`):

Wait until this element is visible before capturing, e.g. '.chart canvas' or '#results'. If it never shows within the per-URL timeout, that URL fails and is not charged. Leave empty to capture once the page has loaded.

## `delayMs` (type: `integer`):

Wait this long after the page has loaded, e.g. 2000 for pages with animations or slow charts. 0 = no extra wait.

## `scrollToLoad` (type: `boolean`):

true = with Full page on, scroll down the page first so lazy-loaded images and sections are loaded, then back to the top (skipped when the page fits on one screen). Only used for full-page PNG, JPEG and WebP.

## `quality` (type: `integer`):

Compression quality for jpeg and webp, e.g. 80. Higher = sharper and bigger files. Ignored for png and pdf.

## `viewportWidth` (type: `integer`):

Browser width when Device is 'custom', e.g. 1440.

## `viewportHeight` (type: `integer`):

Browser height when Device is 'custom', e.g. 900. With Full page on, this is only the starting screen height.

## `maxHeight` (type: `integer`):

Full-page screenshots stop at this height in CSS pixels, e.g. 10000; taller pages are cut and marked truncated: true. Keeps infinite-scroll pages from producing endless images.

## `pdfPaper` (type: `string`):

Paper size when Image format is 'pdf', e.g. 'Letter'. Backgrounds and colours are printed.

## `darkMode` (type: `boolean`):

true = tell the site the visitor prefers a dark colour scheme (prefers-color-scheme: dark). Sites without a dark theme look the same.

## `timeoutSecs` (type: `integer`):

Give up on a URL after this many seconds, e.g. 60 for slow sites. A URL that times out is retried once, then reported as failed and not charged; the other URLs carry on.

## `maxConcurrency` (type: `integer`):

How many pages are captured in parallel, e.g. 8. About 8 screen-size pages fit in the 4 GB default memory; full-page and PDF runs use at most 5 at a time, because long pages need much more memory.

## `incremental` (type: `boolean`):

true = save and charge only screenshots that differ from the last run's screenshot of the same URL with the same settings (the first run returns everything). Every result also has changed: true / false / null either way. Use with a schedule for visual change monitoring.

## `trackingId` (type: `string`):

Separate change history per name, e.g. 'competitors-weekly', so two schedules of the same URLs do not share 'last run'. Leave as 'default' for one history per account.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://www.python.org",
    "https://en.wikipedia.org/wiki/Screenshot"
  ],
  "device": "desktop",
  "fullPage": false,
  "format": "jpeg",
  "hideCookieBanners": true,
  "hideSelectors": [],
  "blockAds": true,
  "selector": "",
  "waitForSelector": "",
  "delayMs": 0,
  "scrollToLoad": true,
  "quality": 80,
  "viewportWidth": 1920,
  "viewportHeight": 1080,
  "maxHeight": 16000,
  "pdfPaper": "A4",
  "darkMode": false,
  "timeoutSecs": 45,
  "maxConcurrency": 8,
  "incremental": false,
  "trackingId": "default"
}
```

# Actor output Schema

## `screenshots` (type: `string`):

One item per saved screenshot: public image link, page URL, title, size, hash and changed flag.

## `files` (type: `string`):

The run's key-value store with every saved file, plus FAILED_URLS when some URLs could not be captured.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://apify.com",
        "https://www.python.org",
        "https://en.wikipedia.org/wiki/Screenshot"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/website-screenshot").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": [
        "https://apify.com",
        "https://www.python.org",
        "https://en.wikipedia.org/wiki/Screenshot",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aurelix/website-screenshot").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://apify.com",
    "https://www.python.org",
    "https://en.wikipedia.org/wiki/Screenshot"
  ]
}' |
apify call aurelix/website-screenshot --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurelix/website-screenshot"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pgTHBWaTVps5lLrNx/builds/UbV92TlFVU4W93A1e/openapi.json
