# Website Screenshot API - Full Page PNG, JPEG & PDF (`zenomastro/website-screenshot-pro`) Actor

Capture screenshots of any URL or raw HTML as PNG, JPEG, WebP or PDF. Full page, element or region, mobile and desktop presets, dark mode, cookie-banner hiding and lazy-load scrolling. Get a direct file link per page.

- **URL**: https://apify.com/zenomastro/website-screenshot-pro.md
- **Developed by:** [Rosario Vitale](https://apify.com/zenomastro) (community)
- **Categories:** Developer tools, Automation, SEO tools
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 website screenshots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### Why use this Actor?

Capture screenshots of any URL or raw HTML as PNG, JPEG, WebP or PDF. Full page, element or region, mobile and desktop presets, dark mode, cookie-banner hiding and lazy-load scrolling. Get a direct file link per page.

### Features

- **Page URLs** — Public HTTP/HTTPS pages to capture. Can be combined with raw htmlDocuments.
- **Full page** — Capture the entire scrollable page when no element selector is set.
- **CSS element selector** — Optional CSS selector to capture one visible element instead of the full page.
- **Viewport width** — Browser viewport width in pixels.
- **Viewport height** — Browser viewport height in pixels.
- **Image format** — Screenshot output format.
- **JPEG quality** — JPEG quality from 20 to 100; ignored for PNG.
- **Delay after page load** — Extra milliseconds to wait after DOMContentLoaded before capture.
- **Navigation timeout** — Maximum seconds to wait for page navigation.
- **Skip error and bot-challenge pages** — Do not save or bill pages that answer with HTTP 4xx/5xx or show an anti-bot challenge (for example 'Just a moment...'). They are returned as free error rows instead. Off by default: such pages are captured and flagged with isErrorPage.
- **Hide common cookie banners** — Hide cookie/consent banners before capture: known consent platforms (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and more) plus elements whose id/class contains cookie or consent. Page wrappers that hold the main content are never hidden. Untick to leave banners visible. For clicking Accept/Reject instead, use Cookie banner handling.
- **Cookie banner handling** — hide (default) = hide banners; accept / reject = click the banner's 'Accept all' or 'Reject all' button on 16 known consent platforms (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, TrustArc, Sourcepoint, Google, Complianz, CookieYes, iubenda, Osano and more) or a clearly labelled button in a cookie banner, then capture the page as a visitor would see it (waits up to 2.5 s for a banner to appear); falls back to hiding when no button is found; off = leave banners as they are. Leave empty to follow 'Hide common cookie banners'.

### Use cases

- Visual qa.
- Website monitoring.
- Mobile/desktop evidence capture.
- Pdf and screenshot automation.

### Related tools

- [Broken Link Checker - 404s & Redirects](https://apify.com/zenomastro/broken-link-checker-pro)
- [Schema Markup Extractor - JSON-LD, Microdata & RDFa](https://apify.com/zenomastro/schema-markup-extractor-pro)

### Example input

```json
{
  "urls": [
    "https://example.com"
  ],
  "fullPage": true,
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "format": "png",
  "jpegQuality": 85
}
```

### Pricing & cost control

The primary event costs **$0.002500 per website screenshot** (about **$2.50 per 1,000** successful primary events).
Only successful primary events are intentionally billed by this Actor; summary/status rows add context without adding primary-event charges.

Use the bounded input limits and filters to keep both event charges and platform usage predictable.

### FAQ

**What is this Actor for?**\
It is designed for visual QA, website monitoring, mobile/desktop evidence capture.

**Can I run it on a schedule?**\
Yes. You can schedule Actor runs on Apify and send the resulting dataset into automations, webhooks, storage, or downstream APIs.

**How do I control cost and run size?**\
Use the input limits and filters shown in the Actor input form. The Actor applies bounded defaults and hard caps so large jobs remain predictable.

### Pricing at a glance

| | Price per 1,000 screenshots |
|---|---:|
| **This Actor** | **$2.50** |
| Median of 8 comparable Apify Store Actors (October 2026) | $4.50 |

That is about **44% below the median per-result price** for this task in Apify Store.

**Subscriber discounts:** on a paid Apify plan you pay even less per result — Bronze −10%, Silver −15%, Gold and higher −20% (**$2.00 per 1,000 screenshots** on Gold).

**Apify platform usage (compute, storage, data transfer) is included** — you pay only the result price plus a small run start fee ($0.0001 per GB of run memory). No surprise compute bill, even on long runs.

Use the run's *maximum charge* setting to cap spending — the Actor stops cleanly when the limit is reached.

### Use it from AI agents (MCP) and code

**AI agents** — Claude, ChatGPT, Cursor, VS Code, n8n AI agents and any MCP client can run this Actor through the official Apify MCP server: add `https://mcp.apify.com?tools=zenomastro/website-screenshot-pro` to your client. Then just ask, for example:

> *"Take full-page desktop and mobile screenshots of these URLs and tell me if anything changed visually."*

The agent fills the input from the field descriptions and receives clean JSON it can reason over.

**API** — one HTTP call runs the Actor and returns the results directly:

```bash
curl -X POST "https://api.apify.com/v2/acts/zenomastro~website-screenshot-pro/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://example.com/"], "format": "png", "fullPage": true, "devicePreset": "desktop", "delayMs": 0}'
```

The same works from the Apify Python/JavaScript clients, Make, n8n, Zapier, LangChain and LlamaIndex integrations, or on a schedule.

Capture public web pages as PNG, JPEG, WebP or PDF for monitoring, visual QA, archives, previews, reporting, competitive research and automation workflows.

### Input example

```json
{"urls":["https://example.com"],"fullPage":true,"viewportWidth":1440,"viewportHeight":900,"format":"png","delayMs":500,"proxyConfiguration":{"useApifyProxy":false}}
```

Set `elementSelector` to capture a specific visible component rather than the whole page.

### Output

Each successful `screenshot` row includes final URL, HTTP status when available, title, device preset, viewport, format, byte size, key-value-store record key and screenshot URL, plus `captureGroupId`, `consentAction`, `consentProvider`, `isErrorPage` and `errorPageReason`. Monitoring runs add `changed`, `pixelChangePercent`, `changedBeyondThreshold`, `changedRegions`, `diffImageUrl` and `previousCapturedAt`. Failures are returned as free diagnostic `error` rows.

Example monitoring fields on a changed page:

```json
{"devicePreset":"desktop","changed":true,"pixelChangePercent":16.67,"changedBeyondThreshold":true,"changedRegions":[{"x":0,"y":96,"width":416,"height":224}],"diffImageUrl":"https://api.apify.com/v2/key-value-stores/.../records/DIFF_SCREENSHOT_000_example.com.png?disableRedirect=true","previousCapturedAt":"2026-10-01T08:00:00.000Z"}
```

History images for `comparePrevious` are kept in your named key-value store `website-screenshot-monitor`, one image per monitored page and device, replaced on every run.

### Pricing

Each successful screenshot is one `screenshot` event (see *Pricing at a glance* above). With `devicePresets`, every device counts as one screenshot. Error rows, skipped error pages and diff images are not billed.

### Reliability and cost controls

The Actor validates and deduplicates URLs, has bounded navigation timeouts and per-page isolation (a failing or frozen page becomes an error row and the run continues; the browser restarts after a crash), supports direct mode by default, and allows Apify/custom proxies only when needed. A run captures at most 1,000 screenshots (URLs × devices) and stops cleanly shortly before its timeout or spending limit.

### Responsible use

Capture public pages in accordance with applicable website terms, copyright, privacy, robots policies and rate limits.

### Support

For reproducible issues provide the public URL, capture settings and Apify run ID. Never include private credentials.

### Extended capabilities

- Capture PNG, JPEG, WebP, or PDF with desktop/mobile/tablet presets, custom viewport/DPR, locale, timezone, and optional geolocation.
- Capture full pages, a CSS element, or an exact clip region; render raw HTML without hosting it.
- Support authorized Basic auth, cookies, headers, console/page-error capture, and persistent visual-change comparison.

# Changelog

This Actor's version history is a separate document: https://apify.com/zenomastro/website-screenshot-pro/changelog.md

# Actor input Schema

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

Public HTTP/HTTPS pages to capture. Can be combined with raw htmlDocuments.

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

Capture the entire scrollable page when no element selector is set.

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

Optional CSS selector to capture one visible element instead of the full page.

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

Browser viewport width in pixels.

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

Browser viewport height in pixels.

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

Screenshot output format.

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

JPEG quality from 20 to 100; ignored for PNG.

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

Extra milliseconds to wait after DOMContentLoaded before capture.

## `navigationTimeoutSecs` (type: `integer`):

Maximum seconds to wait for page navigation.

## `skipErrorPages` (type: `boolean`):

Do not save or bill pages that answer with HTTP 4xx/5xx or show an anti-bot challenge (for example 'Just a moment...'). They are returned as free error rows instead. Off by default: such pages are captured and flagged with isErrorPage.

## `hideConsentBanners` (type: `boolean`):

Hide cookie/consent banners before capture: known consent platforms (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast and more) plus elements whose id/class contains cookie or consent. Page wrappers that hold the main content are never hidden. Untick to leave banners visible. For clicking Accept/Reject instead, use Consent banner handling.

## `consentBannerMode` (type: `string`):

hide (default) = hide banners; accept / reject = click the banner's 'Accept all' or 'Reject all' button on 16 known consent platforms (OneTrust, Cookiebot, Didomi, Usercentrics, Quantcast, TrustArc, Sourcepoint, Google, Complianz, CookieYes, iubenda, Osano and more) or a clearly labelled button in a cookie banner, then capture the page as a visitor would see it (waits up to 2.5 s for a banner to appear); falls back to hiding when no button is found; off = leave banners as they are. Leave empty to follow 'Hide common consent banners'.

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

Optional Apify or custom proxy configuration for pages that block direct cloud access.

## `userAgent` (type: `string`):

Browser User-Agent string.

## `devicePreset` (type: `string`):

Built-in viewport, DPR and mobile/touch behavior. Explicit width/height can override dimensions.

## `devicePresets` (type: `array`):

Optional. Pick 2 or more devices to capture every URL on each of them in one run (one result per URL and device, joined by captureGroupId). Each device uses its own screen size; viewport width/height are ignored, a device pixel ratio override applies to all. Leave empty to use the single Device preset above. Each capture is billed as one screenshot.

## `deviceScaleFactor` (type: `number`):

Override preset deviceScaleFactor for retina/high-DPI captures.

## `colorScheme` (type: `string`):

Emulate prefers-color-scheme.

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

Navigation readiness strategy before optional delay.

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

Optional selector that must become visible before capture.

## `hideAdsAndTrackers` (type: `boolean`):

Abort requests to a conservative list of common analytics/ad hosts.

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

Custom CSS selectors hidden before capture.

## `blockResourceTypes` (type: `array`):

Optional Playwright resource types to block, e.g. font, media.

## `extraHTTPHeaders` (type: `object`):

Optional request headers such as Accept-Language or Authorization. Stored encrypted and hidden from logs.

## `cookies` (type: `array`):

Optional Playwright cookie objects for pages you are authorized to access. Stored encrypted and hidden from logs.

## `captureConsole` (type: `boolean`):

Include bounded browser console messages and page JavaScript errors.

## `monitorName` (type: `string`):

Stable name used to compare captures across scheduled runs.

## `comparePrevious` (type: `boolean`):

When monitorName is set, compare every capture with the previous capture of the same page (and device): exact hash change plus pixel-change percentage, changed regions and a change flag based on the threshold below. PNG, JPEG and WebP only.

## `changeThresholdPercent` (type: `number`):

Share of changed pixels above which changedBeyondThreshold is true. Small values catch tiny edits, larger values ignore rotating ads and carousels. Used with monitorName and Compare with previous capture.

## `saveDiffImage` (type: `boolean`):

With Compare with previous capture: also save a PNG that highlights changed pixels in red (diffImageUrl). Only saved when something changed.

## `pdfPageSize` (type: `string`):

Used only for PDF output.

## `pdfPrintBackground` (type: `boolean`):

Include CSS backgrounds in PDF.

## `pdfLandscape` (type: `boolean`):

Landscape PDF orientation.

## `pdfMarginTop` (type: `string`):

Used only for PDF output: top page margin with a unit, e.g. 0.4in, 10mm or 1cm. Empty = 0.4in.

## `pdfMarginRight` (type: `string`):

Used only for PDF output: right page margin with a unit, e.g. 0.4in, 10mm or 1cm. Empty = 0.4in.

## `pdfMarginBottom` (type: `string`):

Used only for PDF output: bottom page margin with a unit, e.g. 0.4in, 10mm or 1cm. Empty = 0.4in.

## `pdfMarginLeft` (type: `string`):

Used only for PDF output: left page margin with a unit, e.g. 0.4in, 10mm or 1cm. Empty = 0.4in.

## `webpQuality` (type: `integer`):

WebP output quality from 20 to 100.

## `clip` (type: `object`):

Optional region capture object with numeric x, y, width and height. Mutually exclusive with elementSelector and PDF.

## `geolocation` (type: `object`):

Optional browser geolocation object: latitude, longitude and optional accuracy.

## `httpCredentials` (type: `object`):

Optional username/password for HTTP Basic authentication on pages you are authorized to access. Stored encrypted and hidden from logs.

## `locale` (type: `string`):

Browser locale such as en-US, it-IT or de-DE.

## `timezoneId` (type: `string`):

Optional IANA timezone such as Europe/Rome or America/New_York.

## `htmlDocuments` (type: `array`):

Optional raw HTML objects with html, optional baseUrl and id. Useful for rendering generated HTML without hosting it.

## `waitForFonts` (type: `boolean`):

Wait for document.fonts.ready before capture so text layout is more stable.

## `autoScroll` (type: `boolean`):

Scroll through the page before capture to trigger lazy-loaded images and sections, then return to the top.

## `scrollStepPx` (type: `integer`):

Vertical distance per lazy-load scroll step.

## `scrollDelayMs` (type: `integer`):

Delay between lazy-load scroll steps.

## `maxScrollSteps` (type: `integer`):

Hard cap on lazy-load scrolling for very long pages.

## `hideStickyElements` (type: `boolean`):

Optionally hide wide fixed/sticky headers and footers before capture. Disabled by default to avoid changing intentional page content.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/"
  ],
  "fullPage": true,
  "elementSelector": "",
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "format": "png",
  "jpegQuality": 85,
  "delayMs": 0,
  "navigationTimeoutSecs": 45,
  "skipErrorPages": false,
  "hideConsentBanners": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/143.0.0.0 Safari/537.36",
  "devicePreset": "desktop",
  "devicePresets": [],
  "colorScheme": "no-preference",
  "waitUntil": "domcontentloaded",
  "waitForSelector": "",
  "hideAdsAndTrackers": false,
  "hideSelectors": [],
  "blockResourceTypes": [],
  "captureConsole": false,
  "monitorName": "",
  "comparePrevious": false,
  "changeThresholdPercent": 0.5,
  "saveDiffImage": false,
  "pdfPageSize": "A4",
  "pdfPrintBackground": true,
  "pdfLandscape": false,
  "webpQuality": 82,
  "clip": {},
  "geolocation": {},
  "locale": "en-US",
  "timezoneId": "",
  "htmlDocuments": [],
  "waitForFonts": true,
  "autoScroll": true,
  "scrollStepPx": 700,
  "scrollDelayMs": 80,
  "maxScrollSteps": 40,
  "hideStickyElements": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Main fields of every result, ready to preview or export as CSV, Excel or JSON.

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

Every result with all fields, for APIs, AI agents and integrations.

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

Saved screenshot images and PDFs in the run's 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://example.com/"
    ],
    "format": "png",
    "delayMs": 0,
    "devicePreset": "desktop"
};

// Run the Actor and wait for it to finish
const run = await client.actor("zenomastro/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": ["https://example.com/"],
    "format": "png",
    "delayMs": 0,
    "devicePreset": "desktop",
}

# Run the Actor and wait for it to finish
run = client.actor("zenomastro/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": [
    "https://example.com/"
  ],
  "format": "png",
  "delayMs": 0,
  "devicePreset": "desktop"
}' |
apify call zenomastro/website-screenshot-pro --silent --output-dataset

```

## MCP server setup

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