# Website Screenshot Pro – No Cookie Banners, No Ads (`tpai/website-screenshot-pro`) Actor

Take clean full-page or viewport screenshots of any URL in bulk. Cookie banners and ads removed automatically. Desktop, tablet and mobile presets, PNG/JPEG/WebP/PDF, dark mode, element capture.

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

## Pricing

from $3.00 / 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

## Website Screenshot Pro – clean screenshots without cookie banners or ads

Take **clean, ready-to-use screenshots of any website in bulk**. Cookie consent pop-ups, ads, trackers and chat widgets are removed automatically, so you get the page as a human would want to see it, not buried under a GDPR banner.

Paste a list of URLs, pick a device, click **Start**. You get one image (or PDF) per URL, with a public link you can download, embed or send to another app.

### Why use Website Screenshot Pro?

- 🍪 **No more cookie banners.** It accepts or hides consent pop-ups from OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, Axeptio, TarteAuCitron, Sourcepoint and many more, in English, French, German, Spanish, Italian, Dutch, Portuguese and Polish.
- 🚫 **No ads, trackers or chat bubbles.** Requests to ad networks are blocked and empty ad slots are hidden. Pages also load faster.
- 📱 **Desktop, laptop, tablet and mobile presets.** Mobile uses a real iPhone viewport, user agent and 3x pixel density, or you can set any custom size.
- 📄 **Full page or viewport.** Lazy-loaded images are scrolled into view first, so long pages come out complete.
- 🖼️ **PNG, JPEG, WebP or PDF.** You choose the quality and file size.
- 🎯 **Capture a single element** such as a header, pricing table or chart, with a CSS selector.
- 🌙 **Dark mode** on sites that support it.
- ⚡ **Bulk and parallel.** Hundreds of URLs per run, up to 20 pages at the same time.
- 💸 **Fair pricing.** You only pay for successful screenshots. Failed pages, timeouts and pages blocked by anti-bot protection are **never charged**.

### Use cases

- **Website monitoring and archiving:** schedule daily screenshots of your own or your competitors' pages.
- **SEO and marketing reports:** show landing pages, SERPs and ads to clients.
- **Design and QA:** check how pages look on mobile, tablet and desktop.
- **Lead generation and sales:** attach a website thumbnail to each lead in your CRM.
- **AI agents and LLM workflows:** give vision models a clean image of a page.
- **Social media and content:** create article previews and link thumbnails.

### How to use it

1. Add one or more URLs in the **URLs** field. You can also upload a text file or a Google Sheet with links.
2. Pick a **device** and **output format**.
3. Click **Start**.
4. Open the **Output** tab. Each row shows a preview of the screenshot with a direct link to the file.

You can also run it via the Apify API, on a schedule, or from Make, Zapier, n8n and other integrations.

### Input example

```json
{
  "urls": [{ "url": "https://apify.com" }, { "url": "https://www.wikipedia.org" }],
  "device": "mobile",
  "fullPage": true,
  "format": "jpeg",
  "quality": 80,
  "blockCookieBanners": true,
  "blockAds": true
}
```

### Output example

Each URL produces one dataset item. The image itself is saved in the run's key-value store.

```json
{
  "url": "https://apify.com",
  "finalUrl": "https://apify.com/",
  "statusCode": 200,
  "title": "Apify: Full-stack web scraping and data extraction platform",
  "device": "mobile",
  "format": "jpeg",
  "viewport": "390x844@3x",
  "screenshotKey": "0000-apify-com-7c0cb881.jpg",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/0000-apify-com-7c0cb881.jpg",
  "fileSizeBytes": 412345,
  "takenAt": "2026-11-02T14:00:00.000Z",
  "success": true
}
```

You can export the results as JSON, CSV, Excel or HTML, or download all images from the key-value store.

### Pricing

Pay per event. You pay **only for successful screenshots**:

| Event | Price |
|---|---|
| Screenshot (default network) | $3 per 1,000 screenshots |
| Screenshot through Apify residential proxy | $12 per 1,000 screenshots |

Failed or blocked pages are not charged. You can cap the cost of each run with the **Maximum cost per run** setting. The Actor stops cleanly when the limit is reached.

### Tips

- **A site blocks the visit** ("Access denied", HTTP 403, "Just a moment…")? Some websites block cloud servers. Enable **Proxy → Residential** in the input and try again. Blocked pages are reported in the output and not charged.
- **A pop-up is still visible?** Add its CSS selector in **Extra CSS selectors to hide**, one per line.
- **Images missing at the bottom of the page?** Keep **Scroll to load lazy images** on and increase **Extra delay before capture**.
- **Very long pages** are cut at the **Maximum page height** (20,000 px by default). WebP is limited to 16,383 px by the format itself.

### FAQ

**Is it legal to take screenshots of websites?**
Taking screenshots of publicly available pages is generally fine, but you are responsible for how you use them (copyright, terms of service, personal data). Don't use this tool to capture content behind a login you are not allowed to access.

**Can I capture pages behind a login?**
Not in this version. If you need it, open an issue and tell us your use case.

**Something doesn't work?**
Open an issue in the **Issues** tab with the URL and your input. We usually answer within 24–48 hours.

# Actor input Schema

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

Web pages to capture. Add as many as you like, one screenshot per URL.

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

Viewport preset. Desktop 1920x1080, Laptop 1366x768, Tablet 820x1180 (2x), Mobile 390x844 (3x, iPhone user agent).

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

Capture the whole scrollable page. Turn off to capture only the visible viewport.

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

Very long pages are cut at this height (in CSS pixels) to keep files usable.

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

Image or PDF format of the result.

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

Compression quality for JPEG and WebP (1–100). Ignored for PNG and PDF.

## `blockCookieBanners` (type: `boolean`):

Automatically accept or hide cookie / GDPR consent pop-ups (OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics and many more).

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

Blocks requests to common ad networks, trackers and live-chat widgets. Pages also load faster.

## `hideSelectors` (type: `string`):

One CSS selector per line. Matching elements are hidden before the screenshot (e.g. a newsletter pop-up).

## `elementSelector` (type: `string`):

Optional. Screenshot a single element instead of the page, e.g. 'header' or '#pricing'.

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

Ask the website for its dark colour scheme (works on sites that support prefers-color-scheme).

## `scrollToBottom` (type: `boolean`):

Scroll through the page first so lazy-loaded images and sections appear in full-page screenshots.

## `waitUntil` (type: `string`):

When the page is considered loaded.

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

Wait this long after loading, e.g. for animations.

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

Optional. Overrides the device preset width.

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

Optional. Overrides the device preset height.

## `deviceScaleFactor` (type: `integer`):

Optional. 1 = normal, 2 = retina. Overrides the device preset.

## `locale` (type: `string`):

Optional browser locale, e.g. en-US, fr-FR, de-DE.

## `showScrollbars` (type: `boolean`):

Keep scrollbars visible in the screenshot.

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

How many pages to capture at the same time.

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

Maximum time to load one page. Failed pages are retried once and never charged.

## `proxyConfiguration` (type: `object`):

Optional. Use a proxy, e.g. to capture a page as seen from another country.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.wikipedia.org"
    }
  ],
  "device": "desktop",
  "fullPage": true,
  "maxHeight": 20000,
  "format": "png",
  "quality": 80,
  "blockCookieBanners": true,
  "blockAds": true,
  "darkMode": false,
  "scrollToBottom": true,
  "waitUntil": "load",
  "delayMs": 1000,
  "showScrollbars": false,
  "maxConcurrency": 5,
  "timeoutSecs": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per URL: screenshot link, page title, HTTP status, device, format, success/error.

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

All screenshot files stored in the run's default key-value store.

# 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": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://www.wikipedia.org"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tpai/website-screenshot-pro").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": [
        { "url": "https://apify.com" },
        { "url": "https://www.wikipedia.org" },
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("tpai/website-screenshot-pro").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": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.wikipedia.org"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call tpai/website-screenshot-pro --silent --output-dataset

```

## MCP server setup

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

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/M0Yv2bUa2kjzgqIty/builds/8GQkdoP6R4NblmVVU/openapi.json
