# Website Screenshot: Full Page, Batch, No Cookie Banners (`jmspwr/website-screenshot`) Actor

Take full-page screenshots of many websites at once. Cookie banners hidden, lazy images loaded, desktop, tablet or mobile. PNG or JPEG links in the dataset. Failed screenshots are free. Apify Proxy is temporarily unavailable; leave it off until the fix is cloud-tested.

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

## Pricing

$4.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: Full Page, Batch, No Cookie Banners

Paste a list of URLs, get a clean screenshot of each one. Cookie and consent pop-ups are removed, lazy-loaded images are scrolled into view first, and **you only pay for screenshots that succeed**.

- **Batch**: hundreds of URLs in one run, several captured in parallel.
- **Clean**: consent banners from OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc, Sourcepoint and others are hidden, plus a text-based sweep that catches most of the rest.
- **Complete**: the page is scrolled once before capture, so images further down actually load.
- **Any screen**: desktop, laptop, tablet (iPad) or mobile (iPhone), light or dark mode.
- **Fair billing**: a URL that fails (bad domain, timeout, blocked) costs nothing and is listed with its error.

### What you get

Every URL becomes one row in the dataset:

| Field | Example |
|---|---|
| `screenshotUrl` | Direct link to the PNG or JPEG |
| `url` / `finalUrl` | What you asked for / where redirects ended |
| `title` | Page title |
| `statusCode` | HTTP status, e.g. `200` |
| `device`, `fullPage`, `bytes`, `takenAt` | Capture details |
| `error` | Only on failed URLs, which are not charged |

The image files are also in the run's key-value store, so you can download them all at once.

### Input

The only required field is **URLs**. Everything else has a sensible default.

```json
{
  "urls": ["bbc.co.uk", "https://en.wikipedia.org/wiki/Raven"],
  "fullPage": true,
  "device": "desktop",
  "format": "png"
}
```

| Option | Default | Notes |
|---|---|---|
| Full page | on | Whole page up to 16,384 px tall (Chromium's limit); taller pages are cut at that height rather than failing |
| Device | Desktop 1280×800 | Laptop 1440×900, iPad, iPhone 13 |
| Image format | PNG | JPEG is several times smaller; quality is adjustable |
| Hide cookie banners | on | Add your own CSS selectors to hide chat widgets or newsletter pop-ups too |
| Screenshot only this element | off | CSS selector, e.g. `#pricing` |
| Dark mode | off | For sites that support `prefers-color-scheme` |
| Wait until / extra delay | page loaded + 0.5 s | Use "network idle" for heavy single-page apps |
| Parallel pages | 4 | Up to 10 |
| Proxy | none | Turn on Apify Proxy for sites that block data centres or for another country's version |

### Pricing

Pay per screenshot: see the price on the Pricing tab. Platform usage is included, there is no start fee, and failed URLs are free. Set a maximum cost per run and the Actor stops cleanly when it is reached.

### Use it from code or other tools

Call it through the [Apify API](https://docs.apify.com/api/v2), the Python or JavaScript client, or from Make, Zapier, n8n and other integrations. For example, with the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("jmspwr/website-screenshot").call(run_input={"urls": ["example.com"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["screenshotUrl"])
```

### FAQ

**A banner still shows.** Add its CSS selector to "Also hide these elements" and report it in the Issues tab, and it will be added to the built-in list.

**The page is blank or half-loaded.** Set "Wait until" to "Network idle" or raise the extra delay.

**The site blocks the screenshot.** Turn on the proxy, preferably residential.

**Can it log in?** Not yet. Open an issue if you need it.

# Actor input Schema

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

Web pages to screenshot, one per line. "https://" is added if you leave it out.

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

Capture the whole scrolling page (up to 16,384 px tall) instead of just the first screen.

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

Screen size and browser identity to use.

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

PNG is sharp; JPEG files are several times smaller.

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

Only used for JPEG.

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

Hides consent pop-ups from OneTrust, Cookiebot, Didomi, Quantcast, Usercentrics, TrustArc and other common providers.

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

CSS selectors for anything else to hide, such as chat widgets or newsletter pop-ups.

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

CSS selector. When set, only the first matching element is captured.

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

Ask pages to use their dark colour scheme.

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

When the page counts as ready.

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

Wait this long before capturing, for animations or late content.

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

Give up on a page after this long. Failed pages are not charged.

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

Pages captured at the same time. More is faster but needs more memory.

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

Use a proxy for sites that block data-centre traffic or to capture from another country.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://en.wikipedia.org/wiki/Web_scraping"
  ],
  "fullPage": true,
  "device": "desktop",
  "format": "png",
  "quality": 80,
  "hideCookieBanners": true,
  "hideSelectors": [],
  "selector": "",
  "darkMode": false,
  "waitUntil": "load",
  "delayMs": 500,
  "timeoutSecs": 30,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset rows with image links and capture metadata. Rows with an error are not charged; a blocked site may still return its error page image.

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

PNG or JPEG records in the run's key-value store, named after the captured URLs.

# 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://en.wikipedia.org/wiki/Web_scraping"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jmspwr/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://en.wikipedia.org/wiki/Web_scraping",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jmspwr/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://en.wikipedia.org/wiki/Web_scraping"
  ]
}' |
apify call jmspwr/website-screenshot --silent --output-dataset

```

## MCP server setup

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