# Website Screenshot Pro — Bulk, Full Page, Mobile & PDF (`newbeeer/website-screenshot-pro`) Actor

Take screenshots of many websites at once: full page, viewport, mobile/tablet, a single element or PDF. Hides cookie banners, fixes sticky headers, loads lazy images, renders emoji and Chinese text. You only pay for screenshots that succeed.

- **URL**: https://apify.com/newbeeer/website-screenshot-pro.md
- **Developed by:** [chong newbee](https://apify.com/newbeeer) (community)
- **Features:** Limited permissions
- **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 takens

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 — Bulk, Full Page, Mobile & PDF

Take screenshots of hundreds of websites in one run. Full page or just the visible screen, desktop, tablet or mobile, a single element, or a PDF. Cookie banners are hidden automatically, lazy images are loaded, and emoji and Chinese/Japanese/Korean text render properly.

**You only pay for screenshots that succeed.** If a page fails, it's listed in the results with the reason, and you aren't charged for it.

### What it fixes compared with basic screenshot tools

| Common problem | What this Actor does |
|---|---|
| Cookie/consent pop-ups cover the page | Hides 20+ common consent tools (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, Sourcepoint and more) |
| Images further down the page are blank | Scrolls through the page first so lazy images load, with a time cap so endless feeds don't hang the run |
| Emoji or Chinese characters show as empty boxes | Ships with Noto Color Emoji and Noto CJK fonts |
| Slow page → run fails and you still pay | Takes the screenshot anyway after the timeout and marks it `partial: true`. Failed pages are never charged |
| Can't capture only part of the page | Screenshot a single element with a CSS selector, or crop to the top N pixels |
| Header or chat bubble overlaps content | Optional "Fix sticky headers" pins top bars and hides floating widgets |
| Image wider than the screen | Image width always matches the chosen viewport |

### Features

- **Bulk**: any number of URLs, several pages in parallel
- **Devices**: Desktop 1920×1080, Laptop 1366×768, iPad, iPhone 13, or any custom size
- **Retina**: pixel density 1×, 2× or 3×
- **Formats**: PNG, JPEG (adjustable quality) or PDF
- **Full page, viewport only, top N pixels, or one element**
- **Dark mode** (`prefers-color-scheme: dark`)
- **Hide any element** with your own CSS selectors (pop-ups, chat widgets, banners)
- **Timing control**: wait for DOM ready / load / network idle, wait for a specific element, extra delay
- **Proxy support**, for example to see a site from another country

### Input example

```json
{
  "urls": [
    { "url": "https://apify.com" },
    { "url": "https://www.ikea.com/de/de/" }
  ],
  "device": "mobile",
  "fullPage": true,
  "format": "jpeg",
  "hideCookieBanners": true
}
```

Screenshot only the pricing table at retina quality:

```json
{
  "urls": [{ "url": "https://example.com/pricing" }],
  "selector": "#pricing",
  "deviceScaleFactor": 2,
  "format": "png"
}
```

### Output

Each screenshot is saved in the run's key-value store, and the dataset gets one row per URL:

```json
{
  "url": "https://www.ikea.com/de/de/",
  "finalUrl": "https://www.ikea.com/de/de/",
  "httpStatus": 200,
  "title": "Frische Einrichtungsideen & erschwingliche Möbel - IKEA",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/screenshot-0002-www.ikea.com",
  "key": "screenshot-0002-www.ikea.com",
  "format": "jpeg",
  "device": "desktop",
  "viewport": { "width": 1920, "height": 1080 },
  "fullPage": true,
  "selector": null,
  "partial": false,
  "bytes": 2688629,
  "durationMs": 10690,
  "takenAt": "2026-11-08T01:22:41.000Z",
  "error": null
}
```

Failed URLs have `screenshotUrl: null` and an `error` message. They are not charged.

### Use cases

- **Website monitoring**: schedule daily screenshots of your own or competitors' pages and keep a visual history
- **SEO and marketing reports**: capture landing pages, search results pages and ads for clients
- **QA**: check how pages look on mobile, tablet and desktop, in light and dark mode
- **Archiving and compliance**: keep a PDF or image record of terms, prices or published content on a given date
- **AI agents**: give an agent a picture of a page via the Apify API or MCP

### Pricing

Pay per successful screenshot. See the Pricing tab for the current price. Failed pages and pages where the element wasn't found cost nothing.

### Tips

- Very long pages make very large images. Use **Crop to top N pixels** or **JPEG** to keep files small.
- If a page shows a loading spinner in the screenshot, set **Wait for element** to something that appears when the content is ready, or raise **Extra delay**.
- If a site blocks screenshots or shows a different country's version, try a proxy.

### Limits

- Pages behind a login aren't supported.
- Sites that actively block automated browsers may fail or show a challenge page; the result is still returned so you can see what happened.
- Extremely long pages (endless feeds) are limited by **Max scroll time**; content that hasn't loaded by then won't be in the image.

### Feedback

Found a page that doesn't screenshot well? Open an issue on the Issues tab with the URL and your input, and it will be looked at.

# Actor input Schema

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

Pages to screenshot. One screenshot per URL.

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

Screen to emulate. Tablet and mobile also set a matching user agent and touch support.

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

Overrides the device width. Required for Custom.

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

Overrides the device height. With Full page off, this is the image height.

## `deviceScaleFactor` (type: `integer`):

2 or 3 gives sharp retina-quality images.

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

Capture the whole scrollable page. Off captures only the visible screen.

## `clipHeight` (type: `integer`):

Capture only the top part of the page, e.g. 2000 for the first 2000 px.

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

Screenshot a single element, e.g. #pricing or .product-card. Leave empty for the page.

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

PNG is lossless. JPEG gives much smaller files. PDF keeps text selectable.

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

Only used for JPEG. Lower means smaller files.

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

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

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

Hide common cookie and consent pop-ups so they don't cover the page.

## `fixStickyElements` (type: `boolean`):

Turn on if a header or chat bubble overlaps content in full-page shots. Pins top bars to the top and hides other floating elements. Off by default because a few sites lay out differently with it.

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

Extra elements to hide, e.g. .newsletter-popup or #chat-widget.

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

Scroll through the page before a full-page shot so lazy images load.

## `maxScrollSecs` (type: `integer`):

Stops scrolling after this long, so endless feeds don't hang the run.

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

When to consider the page loaded. Network idle waits longest and captures the most complete page.

## `waitForSelector` (type: `string`):

Wait until this element appears before taking the screenshot.

## `delaySecs` (type: `integer`):

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

## `pageTimeoutSecs` (type: `integer`):

If a page is still loading after this, the screenshot is taken anyway and marked partial.

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

How many pages to load at the same time. Higher is faster but needs more memory.

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

Optional. Use a proxy, for example to see a site from another country.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    }
  ],
  "device": "desktop",
  "deviceScaleFactor": 1,
  "fullPage": true,
  "format": "png",
  "jpegQuality": 80,
  "darkMode": false,
  "hideCookieBanners": true,
  "fixStickyElements": false,
  "scrollToBottom": true,
  "maxScrollSecs": 10,
  "waitUntil": "load",
  "delaySecs": 1,
  "pageTimeoutSecs": 60,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

One row per URL: page title, HTTP status, screenshotUrl, size, and error message if it failed.

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

All screenshot images or PDFs saved by this run.

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

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

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

```

## MCP server setup

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