# Website Screenshot: Full Page, Mobile, No Cookie Banners (`tidelane/website-screenshots`) Actor

Take screenshots of any list of websites: full page or viewport, desktop, laptop, tablet or mobile, PNG or JPEG, dark mode, single elements by CSS selector. Cookie banners are hidden automatically and lazy images are loaded. Fixed price per screenshot.

- **URL**: https://apify.com/tidelane/website-screenshots.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **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: Full Page, Mobile, No Cookie Banners

Take clean screenshots of any number of websites. Paste URLs, pick a device, and get PNG or JPEG images with download links. **Cookie banners are hidden automatically**, lazy-loaded images are loaded for full-page shots, and you pay a fixed price per screenshot instead of guessing compute costs.

- ✅ **Viewport or full page** (up to 15,000 px tall)
- ✅ **Desktop, laptop, tablet or mobile** (iPhone and iPad sizes in retina quality)
- ✅ **No cookie pop-ups:** hides OneTrust, Cookiebot, Usercentrics, Didomi, Sourcepoint, Borlabs, Quantcast and more. Nothing is clicked or accepted
- ✅ **Single elements:** capture only a CSS selector such as `header` or `#pricing`
- ✅ **Dark mode**, PNG or JPEG, adjustable wait time
- ✅ **Fair billing:** pages that fail, time out or answer with an error such as 403 or 404 are not charged

### What can you use it for?

- **Website monitoring and archiving:** schedule daily screenshots of your own or competitors' pages and keep a visual history
- **SEO and marketing reports:** add current screenshots of landing pages to client reports
- **QA and design reviews:** check how pages look on mobile and desktop after every release
- **Link previews and thumbnails:** generate preview images for directories, newsletters or apps
- **AI agents:** give an agent eyes on a web page through the Apify API or MCP

### How to use it

1. Add pages to **URLs**, one per line (`example.com` is fine, https is added).
2. Choose **Device**, and switch on **Full page** if you want the whole page.
3. Click **Start**. Every result has a `screenshotUrl` you can open or pass to another tool, and the images are also in the run's key-value store.

#### Input example

```json
{
    "urls": ["https://apify.com", "https://en.wikipedia.org/wiki/Screenshot"],
    "device": "mobile",
    "fullPage": true,
    "format": "jpeg",
    "hideCookieBanners": true
}
```

#### Output example

Real output from a test run:

```json
{
    "url": "https://en.wikipedia.org/wiki/Screenshot",
    "finalUrl": "https://en.wikipedia.org/wiki/Screenshot",
    "statusCode": 200,
    "title": "Screenshot - Wikipedia",
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<store-id>/records/screenshot-2-ce96fea443.png?signature=<signature>",
    "screenshotKey": "screenshot-2-ce96fea443.png",
    "device": "desktop",
    "fullPage": false,
    "selector": null,
    "format": "png",
    "width": 1920,
    "height": 1080,
    "bytes": 295243,
    "truncatedAtPx": null,
    "cookieBannerHidden": false,
    "seconds": 1.5,
    "takenAt": "2026-10-20T20:57:20.951Z"
}
```

`screenshotUrl` is a signed link that works without logging in. `cookieBannerHidden` tells you whether a consent pop-up was found and hidden. A summary with the result for every URL (`ok`, `error`, `blocked_by_robots`, `skipped`) is saved as `OUTPUT` in the key-value store.

### Pricing

A fixed price per successful screenshot. Failed pages, timeouts, error pages (HTTP 4xx/5xx) and pages skipped because of robots.txt are free. Set a run spending limit to cap the cost of a run.

### Speed

In our tests a desktop screenshot took 1.5 to 4 seconds, and 6 pages finished in 25 seconds with the default 2 GB memory and 3 pages in parallel. Full-page mobile screenshots of long news pages take 5 to 10 seconds.

### FAQ

**Why was a page "blocked_by_robots"?** By default the Actor respects the site's robots.txt, which tells automated tools which pages they may visit. Turn off **Respect robots.txt** only for your own sites or with the owner's permission.

**A site shows an error or "access denied".** Some sites block automated browsers. Such pages fail with the HTTP code in the `OUTPUT` summary and are not charged.

**Does hiding cookie banners accept cookies?** No. The banner is only hidden in the screenshot; no consent is given and no button is clicked.

**Why is my full-page screenshot cut off?** Full pages are limited to 15,000 px (CSS pixels) so images stay usable; `truncatedAtPx` shows when this happened. Use **Only this element** to capture a specific part further down.

**Is it legal?** Taking screenshots of public web pages is generally fine for monitoring, testing and reporting. You are responsible for how you use the images, especially copyrighted content. If in doubt, ask a lawyer.

***

#### Impressum (Angaben gemäß § 5 DDG)

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Pages to capture, one per line. "example.com" works too (https is added).

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

Screen size and browser type to emulate.

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

Capture the whole page height instead of only the visible screen (up to 15,000 px).

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

PNG is lossless, JPEG is much smaller.

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

1-100, only for JPEG.

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

Hides the consent pop-ups of common tools (OneTrust, Cookiebot, Usercentrics, Didomi, Borlabs and more). Nothing is clicked or accepted.

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

Wait this long after the page has loaded, for animations or late content.

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

When to consider the page loaded.

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

Optional. Capture just one element, for example "header" or "#pricing".

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

For full-page shots, scroll through the page first so lazy-loaded images appear.

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

Ask the site for its dark color scheme (works on sites that support it).

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

Skip pages whose robots.txt forbids automated access. Turn off only for your own sites or with the owner's permission.

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

Pages that take longer fail and are not charged.

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

More is faster but needs more memory (about 500 MB per page).

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://en.wikipedia.org/wiki/Screenshot"
  ],
  "device": "desktop",
  "fullPage": false,
  "format": "png",
  "quality": 85,
  "hideCookieBanners": true,
  "delayMs": 1000,
  "waitUntil": "load",
  "scrollToLoad": true,
  "darkMode": false,
  "respectRobotsTxt": true,
  "timeoutSecs": 45,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

All results of the run as dataset items.

## `summary` (type: `string`):

Summary per input with status (ok, error and the reason).

# 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/Screenshot"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/website-screenshots").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/Screenshot",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/website-screenshots").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/Screenshot"
  ]
}' |
apify call tidelane/website-screenshots --silent --output-dataset

```

## MCP server setup

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

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/TduwcuV29ip8ksYCW/builds/5Rz9tR0ySv5Lb6wQL/openapi.json
