# Website Screenshot API – Bulk Full-Page PNG, JPEG & PDF (`realletoangt/website-screenshot`) Actor

Take screenshots of many URLs in one run: full-page or viewport, desktop/mobile/tablet, PNG, JPEG or PDF. Hides cookie banners, loads lazy images, returns a direct image link per URL. Cheap per screenshot, ideal for n8n, Make, Zapier and AI agents.

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

## Pricing

$1.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 API – Bulk Full-Page PNG, JPEG & PDF

Paste a list of URLs, get a clean screenshot of each one, with a **direct link** per page. No code, no browser setup.

### What it does

- **Bulk**: hundreds of URLs in one run, several in parallel.
- **Full page or viewport**, lazy-loaded images included (auto scroll).
- **Desktop, laptop, tablet or mobile (iPhone)** emulation, or any custom size.
- **PNG, JPEG (with quality) or PDF.**
- **Hides cookie banners** (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast…) plus any CSS selectors you add.
- **Dark mode** emulation.
- Every result has a `screenshotUrl` you can drop into Slack, Notion, Google Sheets, an email or an AI vision model.

### Use cases

- Website change monitoring and visual archives (run on a schedule).
- Competitor landing page and pricing page tracking.
- SEO / agency reports, client previews, link previews and thumbnails.
- Feeding page images to GPT‑4o, Claude or Gemini vision for UI review or data extraction.
- QA: check how pages look on mobile vs desktop.

### Input example

```json
{
  "urls": ["https://apify.com", "stripe.com/pricing"],
  "device": "mobile",
  "fullPage": true,
  "format": "jpeg",
  "quality": 75,
  "hideSelectors": ".intercom-launcher"
}
```

### Output example

```json
{
  "url": "https://apify.com",
  "finalUrl": "https://apify.com/",
  "status": 200,
  "title": "Apify: Full-stack web scraping and data extraction platform",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/0001-apify-com",
  "format": "jpeg",
  "bytes": 412345,
  "device": "mobile",
  "viewportWidth": 390,
  "viewportHeight": 844,
  "fullPage": true,
  "loadTimeMs": 3120,
  "takenAt": "2026-10-14T10:00:00.000Z"
}
```

If your account storage is private, add `?token=YOUR_API_TOKEN` to `screenshotUrl`. URLs that fail are **not charged** and are listed in the `FAILED_URLS` record.

### Pricing

Pay per event: you pay only for each successful screenshot (see the Pricing tab). No subscription.

### n8n, Make and Zapier

- **n8n**: HTTP Request node → `POST https://api.apify.com/v2/acts/realletoangt~website-screenshot/run-sync-get-dataset-items` with header `Authorization: Bearer <token>` and the JSON input above. Each returned item has `screenshotUrl`; pass it to an HTTP Request (download as file) → Slack / Google Drive.
- **Make**: Apify module "Run an Actor" (synchronous) → "Get dataset items" → iterate `screenshotUrl`.
- **Zapier**: Apify app → "Run Actor" action, then use `screenshotUrl` in the next step.

### AI agents (MCP)

Available through the Apify MCP server (`mcp.apify.com`). Minimal call: `{"urls": ["https://example.com"]}`. The agent gets back JSON with `screenshotUrl` per page, ready for a vision model.

### FAQ

**Pages behind login?** No, public pages only.
**A site blocks the screenshot?** Turn on Proxy (residential) in the input.
**Very long pages?** Full-page capture works; auto-scroll stops at ~20,000 px for lazy loading.

# Actor input Schema

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

Web pages to capture, one per line. 'example.com' works too.

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

Viewport and user agent to emulate.

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

Capture the whole scrollable page. Off = only the visible viewport.

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

Output file type.

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

Only for JPEG.

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

Overrides the device width.

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

Overrides the device height.

## `delaySeconds` (type: `integer`):

Wait after load before capturing (for animations).

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

Page load event to wait for.

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

Hide common cookie/consent popups (OneTrust, Cookiebot, Didomi, Usercentrics...).

## `hideSelectors` (type: `string`):

Comma-separated, e.g. '.chat-widget, #newsletter-popup'.

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

Scroll the page first so lazy-loaded images appear.

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

Emulate prefers-color-scheme: dark.

## `timeoutSeconds` (type: `integer`):

Max time to load one page.

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

Pages captured at the same time.

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

Optional. Use for geo-specific pages or sites that block data centers.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://news.ycombinator.com"
  ],
  "device": "desktop",
  "fullPage": true,
  "format": "png",
  "quality": 80,
  "delaySeconds": 1,
  "waitUntil": "load",
  "hideCookieBanners": true,
  "scrollToBottom": true,
  "darkMode": false,
  "timeoutSeconds": 45,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per URL with a direct screenshotUrl.

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

Image/PDF files in the key-value store.

# 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://news.ycombinator.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("realletoangt/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 = {
    "urls": [
        "https://apify.com",
        "https://news.ycombinator.com",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("realletoangt/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 '{
  "urls": [
    "https://apify.com",
    "https://news.ycombinator.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call realletoangt/website-screenshot --silent --output-dataset

```

## MCP server setup

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