# Website Screenshot Pro (`originalvi/website-screenshot-pro`) Actor

Pixel-perfect screenshots of any URL: full page, mobile devices, dark mode, cookie-banner removal, PNG/JPEG/WebP.

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

## Pricing

from $2.00 / 1,000 screenshot captureds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Screenshot Pro 📸 — full-page screenshots that actually work

Capture **pixel-perfect screenshots of any website** — full page or viewport, desktop or mobile, light or dark mode — and get back clean image files plus a structured dataset with download URLs.

Built for reliability: automatic cookie-banner removal, lazy-load scrolling, animation freezing, and a smart fallback when pages never finish loading.

### Why this Actor?

- ✅ **Full-page screenshots that actually work** — auto-scrolls first so lazy-loaded images render instead of showing up as blank gaps
- 🍪 **Cookie banners removed automatically** — covers OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, Osano, HubSpot, and more
- 📱 **Real device presets** — iPhone 15, iPhone SE, Pixel 7, iPad, Galaxy S23, or any custom desktop viewport up to 4K
- 🌙 **Dark mode rendering** — capture how your site looks with `prefers-color-scheme: dark`
- 🖼️ **PNG, JPEG, or WebP** output with quality control
- 🎯 **Wait controls** — wait for a CSS selector, add a fixed delay, or tune the navigation timeout
- 🧹 **Hide anything** — pass extra CSS selectors to remove sticky headers, chat widgets, or popups
- 💰 **Pay only for successful screenshots** — failed pages are never charged

### How to screenshot a website

1. Paste one or more **URLs**.
2. Pick **full page** or viewport, a **device preset** or custom viewport, and the **image format**.
3. Click **Start**. Images land in the key-value store with direct download links in the dataset.

One URL or ten thousand — same three steps.

### Input example

```json
{
    "urls": [{ "url": "https://apify.com" }],
    "fullPage": true,
    "format": "png",
    "device": "desktop",
    "viewportWidth": 1920,
    "hideCookieBanners": true,
    "darkMode": false
}
```

### Output

Screenshots are saved to the run's **key-value store**. The **dataset** contains one record per URL with a direct download link:

```json
{
    "url": "https://apify.com",
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/screenshot_001_apify.com.png",
    "format": "png",
    "fullPage": true,
    "device": "desktop",
    "bytes": 245133,
    "status": "SUCCEEDED"
}
```

Failed URLs get `"status": "FAILED"` with an error message — and are not charged.

### Pricing

$2.00 per 1,000 screenshots captured, plus a few cents of platform usage. Failed pages are never charged. No subscriptions, no minimums — perfect for both one-off batches and scheduled monitoring.

### Use cases

- **AI agents & LLM apps** — give your agent eyes; capture pages for visual analysis or archiving
- **Monitoring** — schedule daily screenshots of your site, competitors, or price pages
- **Link previews & social cards** — generate preview images for URLs at scale
- **Archiving & compliance** — keep visual records of pages at a point in time
- **QA & design review** — check how pages render on mobile devices and in dark mode

### Using via API

Like every Apify Actor, you can run it via REST API, the Apify JavaScript/Python clients, CLI, or on a schedule. Integrate with Make, Zapier, n8n, LangChain, and more.

```bash
curl -X POST "https://api.apify.com/v2/acts/originalvi~website-screenshot-pro/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "urls": [{ "url": "https://example.com" }] }'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("originalvi/website-screenshot-pro").call(run_input={
    "urls": [{"url": "https://example.com"}, {"url": "https://news.ycombinator.com"}],
    "fullPage": True,
    "device": "iphone15",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["url"], "→", item["screenshotUrl"])
```

### FAQ

**Does it work on sites that block bots?**
Most sites render fine. For strict ones, enable Apify Proxy (residential) in the input.

**How do I screenshot pages behind a login?**
Not supported in this version — reach out via the Issues tab if you need it and I'll prioritize it.

**A page renders incompletely — what should I try?**
Add a `waitForSelector` for the main content element, or set `delayMs` to 2000–5000. For full-page shots keep `scrollToBottom` enabled.

**Can I capture a specific element only?**
Pass CSS selectors in `hideSelectors` to strip everything else, or open an issue — element-clipping is on the roadmap.

**What's the maximum page size?**
Full-page captures handle very long pages (tens of thousands of pixels). Extremely long pages are capped by Chromium's internal limits; the Actor falls back to the maximum capturable height.

**How fast is it?**
A typical page takes 3–8 seconds including navigation. Batches run URLs sequentially within one run; start several runs in parallel for large jobs.

### More Actors by this developer

- [eBay Sold Listings Scraper](https://apify.com/originalvi/ebay-sold-listings) — real sold prices + price statistics
- [Google Trends Explorer](https://apify.com/originalvi/google-trends-explorer) — interest over time, related queries & topics
- [Google News Scraper](https://apify.com/originalvi/google-news-scraper) — structured news articles by keyword
- [App Store Reviews Scraper](https://apify.com/originalvi/app-store-reviews-scraper) — iOS reviews & ratings across 20+ countries
- [Hacker News Scraper](https://apify.com/originalvi/hacker-news-scraper) — HN stories & comments by keyword

### Found a problem?

Open an issue on the **Issues** tab and I'll fix it fast — usually within a day.

# Actor input Schema

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

List of web page URLs to screenshot.

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

Capture the entire scrollable page instead of just the visible viewport.

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

Output image format.

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

1–100. Ignored for PNG.

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

Emulate a device. Overrides viewport width/height when not set to Desktop.

## `viewportWidth` (type: `integer`):

Browser window width. Used when device is Desktop.

## `viewportHeight` (type: `integer`):

Browser window height. Used when device is Desktop.

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

Ask the page to render in dark color scheme (prefers-color-scheme: dark).

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

Automatically hide common cookie-consent banners and overlays before capturing.

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

Additional CSS selectors to hide before the screenshot, e.g. sticky headers or chat widgets.

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

Scroll through the page before capturing so lazy-loaded images appear. Recommended for full-page shots.

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

Wait until this element appears before capturing (optional).

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

Additional wait after page load, for animations or late content. Max 30000.

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

Maximum time to wait for a page to load.

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

Proxy settings. Use Apify Proxy if target sites block datacenter IPs.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    }
  ],
  "fullPage": true,
  "format": "png",
  "quality": 80,
  "device": "desktop",
  "viewportWidth": 1920,
  "viewportHeight": 1080,
  "darkMode": false,
  "hideCookieBanners": true,
  "hideSelectors": [],
  "scrollToBottom": true,
  "delayMs": 0,
  "timeoutSecs": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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("originalvi/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("originalvi/website-screenshot-pro").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 originalvi/website-screenshot-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=originalvi/website-screenshot-pro",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bEoCthgQTDqedNVQX/builds/gFChQV1nU1cVEbMAD/openapi.json
