# Website Screenshot Generator: Bulk, Full Page, Mobile (`scrapemint/website-screenshot-generator`) Actor

Screenshots of any list of URLs: full page or viewport, desktop, laptop, tablet and phone, PNG, JPEG, WebP or PDF. Cookie banners and chat widgets hidden, lazy images loaded, ads blocked, dark mode, retina. Each row has a public image link. $0.003 per screenshot, $0.005 full page.

- **URL**: https://apify.com/scrapemint/website-screenshot-generator.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (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 screenshot (above the fold)s

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 Generator: Bulk, Full Page, Mobile

Screenshots of any list of URLs in one run: **full page** or above the fold, on **desktop, laptop, Full HD, iPad, iPhone and Pixel** sizes, as **PNG, JPEG, WebP or PDF**. Cookie banners and chat bubbles are hidden, lazy images are loaded before capture, and ads are blocked. Every row has a public link to its image.

No API key, no login, no proxy. $0.003 per screenshot, $0.005 full page. Pages that fail to load are free.

### What you get

One row per URL and device:

- `screenshotUrl`: public link to the image or PDF
- `url`, `finalUrl` (after redirects), `statusCode`, `title`
- `device`, `viewport`, `pageSize` (the full page's width and height)
- `format`, `bytes`, `loadMs`
- `error`: why a page failed, or the HTTP error a site answered with (not charged)

The files themselves are in the run's key-value store too, ready to download in bulk.

### Example input

Full-page PNGs of two sites on desktop and phone:

```json
{
  "urls": ["https://apify.com", "https://www.bbc.com"],
  "devices": ["desktop", "mobile"]
}
```

Above-the-fold JPEGs of a list of competitor home pages, retina:

```json
{
  "urls": ["stripe.com", "adyen.com", "checkout.com"],
  "fullPage": false,
  "format": "jpeg",
  "retina": true
}
```

One element only, in dark mode:

```json
{
  "urls": ["https://github.com/apify/crawlee"],
  "elementSelector": "#readme",
  "darkMode": true
}
```

A PDF of an article, US Letter:

```json
{
  "urls": ["https://en.wikipedia.org/wiki/Web_scraping"],
  "format": "pdf",
  "pdfFormat": "Letter"
}
```

### Example output

```json
{
  "url": "https://www.bbc.com",
  "finalUrl": "https://www.bbc.com/",
  "statusCode": 200,
  "title": "BBC Home - Breaking News, World News, US News, Sports, Business, Innovation, Climate, Culture, Travel, Video & Audio",
  "device": "mobile",
  "viewport": { "width": 390, "height": 664 },
  "pageSize": { "width": 390, "height": 16727 },
  "fullPage": true,
  "format": "webp",
  "bytes": 660882,
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/www-bbc-com-mobile-muypebhs.webp",
  "loadMs": 11522,
  "error": null
}
```

### Uses

- **Website monitoring and archives:** schedule daily captures of your own pages, competitors or landing pages
- **QA across devices:** see a release on desktop, tablet and phone in one run
- **SEO and marketing reports:** thumbnails of search results, competitors and backlinks
- **Lead lists:** add a picture of each prospect's site to a sales list
- **Compliance and evidence:** a dated PDF or image of what a page showed

### Pricing

- **$0.003** per above-the-fold or single-element screenshot (one URL on one device)
- **$0.005** per full-page screenshot or PDF
- No start fee. A page that fails to load, answers with an error status (403, 404, 5xx), or is not a public http(s) URL is returned with the error and not charged.

### Notes

- Cookie banners are hidden with CSS. Nothing is clicked, so no consent is given.
- Full-page captures stop at **Max page height** (16,000 px by default), so endless feeds still finish.
- Sites that block automated browsers may show their own block page in the screenshot.

# Actor input Schema

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

Pages to capture. https:// is added if missing.

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

One capture per URL per device.

## `customWidth` (type: `integer`):

Adds a custom viewport as an extra device. 0 for none.

## `customHeight` (type: `integer`):

Height of the custom viewport.

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

On: the whole scrollable page. Off: what fits in the viewport (above the fold).

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

PDF prints the page as rendered on screen, with backgrounds.

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

1-100.

## `retina` (type: `boolean`):

Device pixel density: 2x on desktop sizes, the phone or tablet's own density (3x on iPhone) on mobile. Off: images at CSS pixels, smaller and faster.

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

Tells the site the visitor prefers a dark color scheme.

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

CSS selector of a single element to capture instead of the page, e.g. #pricing or header.

## `pdfFormat` (type: `string`):

Only used for PDF.

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

Hides OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast and other consent popups, and Intercom, HubSpot, Drift and similar chat bubbles. Nothing is clicked.

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

Blocks the main ad networks and trackers, so pages load faster and ad slots stay empty.

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

CSS selectors to hide before capture, e.g. .newsletter-popup.

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

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

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

When the page counts as loaded.

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

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

## `maxPageHeight` (type: `integer`):

Full-page captures are cut at this height. Endless feeds would otherwise never finish.

## `concurrency` (type: `integer`):

Pages captured at the same time. Lower it for heavy pages.

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

Give up on a page after this long. A failed page is not charged.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://www.bbc.com"
  ],
  "devices": [
    "desktop"
  ],
  "customWidth": 0,
  "customHeight": 0,
  "fullPage": true,
  "format": "png",
  "quality": 80,
  "retina": false,
  "darkMode": false,
  "elementSelector": "",
  "pdfFormat": "A4",
  "hideCookieBanners": true,
  "blockAds": true,
  "hideSelectors": [],
  "scrollToBottom": true,
  "waitUntil": "load",
  "delayMs": 1000,
  "maxPageHeight": 16000,
  "concurrency": 3,
  "timeoutSecs": 45
}
```

# Actor output Schema

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

URL, device, status code, page title, page size and the screenshotUrl of each capture.

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

The key-value store holding every image and PDF.

# 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://www.bbc.com"
    ],
    "devices": [
        "desktop"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/website-screenshot-generator").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://www.bbc.com",
    ],
    "devices": ["desktop"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/website-screenshot-generator").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://www.bbc.com"
  ],
  "devices": [
    "desktop"
  ]
}' |
apify call scrapemint/website-screenshot-generator --silent --output-dataset

```

## MCP server setup

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

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/2fmQI9r5UVuceSdhE/builds/Mza18xFtkip1clcB6/openapi.json
