# Website Screenshot Pro (`pinkish_gallop/website-screenshot-pro`) Actor

Take clean website screenshots in bulk: auto-closes cookie banners, blocks ads, desktop/tablet/mobile presets, full-page or element capture, PDF export and visual change detection between runs.

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

## Pricing

from $3.00 / 1,000 results

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

**Website Screenshot Pro** takes clean, ready-to-use screenshots of any list of websites, in bulk, with no cookie banners, ads or chat bubbles in the way. Capture full pages, the visible viewport or a single element on desktop, laptop, tablet and mobile. Save pages as PDF, and turn on **visual change detection** to get alerted when a page changes between runs.

Fast and light: a typical page takes 2–7 seconds, and a whole batch of screenshots runs in one browser.

### What can Website Screenshot Pro do?

- 🍪 **Closes cookie banners automatically.** Supports OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics, Osano and generic "Accept all" buttons (also inside iframes), plus follow-up notes such as GOV.UK's "Hide cookie message".
- 📱 **Device presets:** Desktop 1366×768, Desktop HD 1920×1080, Laptop 1280×800, Tablet 820×1180 @2x, Mobile 390×844 @3x (iPhone-like), or any custom viewport.
- 📜 **Full-page screenshots done right.** Lazy-loaded images are scrolled into view first, and sticky headers or floating bars aren't repeated down the page.
- 🎯 **Element screenshots:** capture just `#pricing`, `.hero` or any CSS selector.
- 🚫 **Ad and tracker blocking** for faster, cleaner pages.
- 🌙 **Dark mode** emulation (`prefers-color-scheme: dark`).
- 📄 **PDF export** (A4, backgrounds included) for desktop devices.
- 🔍 **Visual change detection:** each run is compared pixel by pixel with the previous screenshot of the same URL and device. You get `diffPercent`, `changed` and a highlighted diff image.
- 🤖 **Respects robots.txt** by default.
- 🔌 Works with the Apify API, schedules, webhooks, Make, Zapier, n8n and the Apify MCP server.

### Use cases

- **Website monitoring:** schedule daily runs with change detection to track competitors' pricing pages, landing pages, terms of service or job boards.
- **Visual QA and regression checks:** screenshot your site on desktop and mobile after every deploy and catch layout breaks.
- **SEO and marketing reports:** bulk thumbnails of SERP competitors, link previews and portfolio images.
- **Archiving and compliance:** keep dated PNG and PDF copies of pages, ads or disclosures.
- **AI agents and LLM pipelines:** give a vision model a clean image of a page without consent pop-ups covering it.

### How to take website screenshots

1. Click **Try for free**.
2. Paste one or more URLs into **URLs** (one per line; `example.com` without `https://` works too).
3. Pick devices and options such as full page, PDF or change detection.
4. Click **Start** and open the **Output** tab. Each row has a preview and a download link.

### Input examples

**Desktop and mobile, full page:**

```json
{
  "urls": ["https://www.gov.uk", "https://www.python.org", "example.com"],
  "devices": ["desktop", "mobile"],
  "fullPage": true
}
```

**Just one element, JPEG, dark mode:**

```json
{
  "urls": ["https://github.com/pricing"],
  "selector": "main",
  "format": "jpeg",
  "quality": 85,
  "darkMode": true
}
```

**Daily change monitor with PDF archive (run it on a schedule):**

```json
{
  "urls": ["https://competitor.com/pricing"],
  "devices": ["desktop"],
  "savePdf": true,
  "changeDetection": true,
  "changeThresholdPercent": "0.5",
  "changeStoreName": "pricing-monitor"
}
```

The full list of options is in the **Input** tab.

### Output

Images, PDFs and diff images are saved to the run's key-value store. The dataset gets one row per URL × device, which you can export as JSON, CSV, Excel or HTML:

```json
{
  "url": "https://www.gov.uk/",
  "device": "desktop",
  "viewport": "1366x768",
  "status": "ok",
  "httpStatus": 200,
  "title": "Welcome to GOV.UK",
  "cookieBanner": "text:Accept additional cookies + Hide cookie message",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/www.gov.uk_desktop_16ca96b2c64783d1",
  "pdfUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/www.gov.uk_desktop_16ca96b2c64783d1_pdf",
  "pageHeight": 4599,
  "changed": false,
  "diffPercent": 0.012,
  "durationMs": 7460
}
```

`status` is `ok`, `failed` (with `error`) or `skipped_robots_txt`.

### How much does it cost?

Current pricing is always shown in the **Pricing** tab. The Actor is lightweight: in test runs on 2 GB of memory one screenshot used about 0.002 compute units, so roughly 500 full-page screenshots fit into one compute unit. With pay-per-event pricing, failed pages and robots.txt-skipped URLs are never charged, and you can set **Max total charge** on a run to cap spend; the run stops cleanly when the cap is reached.

### FAQ

**How is this different from the free "Website Screenshot Generator"?**
That one describes itself as a simple example Actor. It doesn't close cookie banners, emulate mobile devices, capture single elements, export PDFs or detect changes. It's also slower on batches, because this Actor reuses one browser for all URLs and captures several pages in parallel.

**Can I take screenshots of pages behind a login?**
Not yet. The Actor captures publicly accessible pages.

**Why did a URL return `skipped_robots_txt`?**
The site's robots.txt disallows automated access to that path. Set `respectRobotsTxt` to `false` only if you're allowed to access the page (for example, it's your own site).

**A banner or pop-up is still visible. What can I do?**
Add its CSS selector to **Hide selectors** (for example `#newsletter-modal`). Open an issue in the **Issues** tab with the URL and I'll add support for that banner.

**Can I get screenshots from a specific country?**
Yes. Enable Apify Proxy in **Proxy** and choose a country.

**How do I monitor a page for visual changes?**
Turn on **Visual change detection** and create a schedule in Apify Console. Rows with `changed: true` include a diff image. Combine it with a webhook or the Slack/email integrations to get alerts.

**Is taking website screenshots legal?**
The Actor loads public pages the way a normal browser does and follows robots.txt by default. You're responsible for complying with each site's terms and with data-protection laws if personal data shows up in screenshots.

### Feedback

Found a bug or need a feature (login cookies, custom headers, AVIF/WebP output)? Open an issue in the **Issues** tab.

# Changelog

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

# Actor input Schema

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

Pages to capture, one per line. Domains without https:// are accepted.

## `devices` (type: `array`):

One screenshot per URL per device (each is billed).

## `customViewport` (type: `object`):

Used when devices contains "custom": {"width":1440,"height":900,"deviceScaleFactor":1,"isMobile":false}

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

Capture the whole scrollable page (capped by maxFullPageHeight).

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

Capture only this CSS selector (e.g. #pricing). Overrides full page.

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

PNG is lossless (required for change detection). JPEG is smaller.

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

Only used for JPEG.

## `dismissCookieBanners` (type: `boolean`):

Clicks 'Accept' on OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics, Osano and generic banners (incl. iframes).

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

CSS selectors to hide before capture (chat widgets, popups).

## `hideFloatingElements` (type: `boolean`):

Full-page only: keeps top bars at the top once and hides floating overlays (chat bubbles, promo bars) that otherwise repeat or cover content.

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

Blocks common ad, analytics and tracker requests so pages load faster and look cleaner.

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

Emulate prefers-color-scheme: dark.

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

Scrolls the page before a full-page capture so lazy-loaded images appear.

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

Navigation event to wait for. Use networkidle for single-page apps.

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

Extra wait before capturing, in milliseconds (animations, fonts).

## `savePdf` (type: `boolean`):

Billed as a separate 'pdf' event.

## `changeDetection` (type: `boolean`):

Compares each screenshot with the previous run's (same URL+device) and reports diffPercent, changed and a diff image. Billed as 'visual-diff' when a baseline exists.

## `changeStoreName` (type: `string`):

Named key-value store that keeps the previous screenshots. Use different names to keep separate monitors.

## `changeThresholdPercent` (type: `string`):

Percent of pixels.

## `respectRobotsTxt` (type: `boolean`):

Skips URLs disallowed for this bot / \* (skipped URLs are not billed).

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

Pages captured in parallel. 4 fits the default 2 GB memory.

## `navigationTimeoutSecs` (type: `integer`):

Page load timeout. Failed pages are not charged.

## `maxFullPageHeight` (type: `integer`):

Very long pages are cut at this height (CSS pixels).

## `maxScreenshots` (type: `integer`):

Hard cap on screenshots in one run (URLs × devices).

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

Optional proxy, e.g. Apify Proxy for geo-specific pages.

## Actor input object example

```json
{
  "urls": [
    "https://www.gov.uk",
    "https://www.python.org",
    "example.com"
  ],
  "devices": [
    "desktop"
  ],
  "fullPage": true,
  "format": "png",
  "quality": 80,
  "dismissCookieBanners": true,
  "hideSelectors": [],
  "hideFloatingElements": true,
  "blockAds": true,
  "darkMode": false,
  "scrollToBottom": true,
  "waitUntil": "load",
  "delayMs": 500,
  "savePdf": false,
  "changeDetection": false,
  "changeStoreName": "screenshot-pro-baselines",
  "changeThresholdPercent": "0.5",
  "respectRobotsTxt": true,
  "maxConcurrency": 4,
  "navigationTimeoutSecs": 45,
  "maxFullPageHeight": 16000,
  "maxScreenshots": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

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

No description

# 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://www.gov.uk",
        "https://www.python.org",
        "example.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("pinkish_gallop/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": [
        "https://www.gov.uk",
        "https://www.python.org",
        "example.com",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pinkish_gallop/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/WymYgQFvtFEznsGet/builds/tXAK9tmJqcJebhGfv/openapi.json
