# Website Screenshot (Full Page, Mobile, PDF, No Cookie Banners) (`scraper-forge/website-screenshot`) Actor

Take clean screenshots of any list of URLs: full page, desktop/tablet/mobile, single element or PDF. Hides cookie banners and blocks ads automatically. Links to every image in the dataset.

- **URL**: https://apify.com/scraper-forge/website-screenshot.md
- **Developed by:** [Scraper Forge](https://apify.com/scraper-forge) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.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, Mobile, PDF, No Cookie Banners

Take **clean screenshots of any list of URLs**: full page or visible screen, desktop, laptop, tablet or mobile, a single element, or a PDF. Cookie banners and ads are removed automatically, so you get the page, not the pop-ups.

### Why this one

- 🍪 **No cookie banners**: hides OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, TrustArc and more, plus custom "we use cookies / privacy" bars
- 🚫 **No ads, no blank ad boxes**: blocks major ad networks and collapses the empty space they leave behind
- 🖼️ **Lazy images actually load**: scrolls the page first and waits for images, so full-page shots don't have gray placeholders
- 📱 **Real mobile & tablet layouts**: touch + mobile user agent + retina scale, not just a narrow window
- 🎯 **Element screenshots**: capture only `#pricing`, `.hero`, a chart or a tweet
- 📄 **PDF output** (A4, with backgrounds) for archiving and reports
- 🌙 **Dark mode** for sites that support it
- ⚡ **Parallel and fast**: several pages at once, automatic retries; one broken URL never fails the run
- 💸 **Pay only for screenshots that succeed**: failed URLs are listed with the reason and never charged

### Use cases

- Visual monitoring of your site or competitors' pages (schedule it daily)
- Archiving pages for compliance, legal evidence or SEO history
- Thumbnails and previews for directories, link lists and newsletters
- QA across devices before a release
- Feeding page images to AI/vision models

### Input example

```json
{
  "startUrls": [{ "url": "https://apify.com" }, { "url": "https://www.theverge.com" }],
  "device": "mobile",
  "fullPage": true,
  "format": "png",
  "hideCookieBanners": true,
  "blockAds": true
}
```

Only screenshot one element: add `"selector": "#pricing"`. Get a PDF: `"format": "pdf"`.

### Output

Each URL gets a row in the dataset with a **direct link to the image**:

```json
{
  "url": "https://www.theverge.com",
  "finalUrl": "https://www.theverge.com/",
  "statusCode": 200,
  "title": "The Verge",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/…/records/0000-www-theverge-com.png",
  "format": "png",
  "device": "desktop",
  "viewport": { "width": 1920, "height": 1080 },
  "fullPage": true,
  "sizeBytes": 2291520,
  "takenAt": "2026-10-03T18:00:00.000Z",
  "error": null
}
```

The files themselves are in the run's key-value store (download them one by one or all at once from the Storage tab or the API).

### Options

| Option | What it does |
|---|---|
| Device | Desktop 1920×1080, Laptop 1366×768, Tablet 820×1180, Mobile 390×844 (or custom width/height) |
| Full page | Whole scrollable page (cut at 15,000 px by default to keep files usable) |
| Format | PNG, JPEG (with quality) or PDF |
| Only this element | CSS selector, e.g. `#pricing` |
| Hide cookie banners / Block ads | On by default |
| Hide extra elements | Your own selectors, e.g. chat widgets |
| Wait until / Extra delay | For slow or animation-heavy sites |
| Proxy | Optional Apify Proxy for sites that block data centers or for country-specific versions |

### FAQ

**Can it screenshot pages behind a login?** No, only publicly accessible pages.

**Some site still shows a pop-up.** Add its selector to *Hide extra elements*, or open an issue with the URL and it will be added to the built-in list.

**Is it legal?** Taking screenshots of public pages is generally fine; you are responsible for how you use them (copyright, personal data).

# Actor input Schema

## `startUrls` (type: `array`):

Pages to capture. Paste one or many URLs.

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

Viewport and device emulation. Tablet/mobile use touch and a mobile user agent so sites show their mobile layout.

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

Capture the whole scrollable page instead of just the visible screen.

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

Output file type.

## `jpegQuality` (type: `integer`):

Only for JPEG. Lower = smaller files.

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

Optional. Screenshot just one element, e.g. #pricing or .hero. Leave empty for the whole page.

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

Hides common cookie/consent pop-ups (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and more).

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

Blocks major ad networks and hides ad slots. Pages also load faster.

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

Optional CSS selectors to hide, e.g. chat widgets or newsletter pop-ups (.intercom-launcher, #newsletter-modal).

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

Ask the site for its dark theme (prefers-color-scheme: dark).

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

When the page counts as loaded.

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

Wait this long after loading, for animations or late content.

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

Scrolls through the page first so lazy-loaded images appear in full-page screenshots.

## `width` (type: `integer`):

Optional. Overrides the device width.

## `height` (type: `integer`):

Optional. Overrides the device height.

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

Very long pages are cut at this height to keep images usable.

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

Give up on a page after this long (it's retried twice).

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

How many pages to capture at once.

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

Usually not needed. Use Apify Proxy for sites that block data-center traffic or to capture a country-specific version.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.theverge.com"
    }
  ],
  "device": "desktop",
  "fullPage": true,
  "format": "png",
  "jpegQuality": 80,
  "hideCookieBanners": true,
  "blockAds": true,
  "darkMode": false,
  "waitUntil": "load",
  "delayMs": 1000,
  "scrollToLoad": true,
  "maxFullPageHeight": 15000,
  "navigationTimeoutSecs": 45,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per URL with a direct link to its screenshot.

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

All image/PDF files in the key-value store.

## `runSummary` (type: `string`):

How many screenshots succeeded or failed.

# 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 = {
    "startUrls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://www.theverge.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-forge/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 = { "startUrls": [
        { "url": "https://apify.com" },
        { "url": "https://www.theverge.com" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scraper-forge/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 '{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://www.theverge.com"
    }
  ]
}' |
apify call scraper-forge/website-screenshot --silent --output-dataset

```

## MCP server setup

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