# Website Screenshot API — Full-Page, Element & Device Capture (`cheapapi/website-screenshot-api`) Actor

Website Screenshot API: capture any URL as PNG, JPEG or WebP (PDF too) — true full-page, element & region capture, 13 device profiles, dark mode, retina, ad/cookie-banner blocking, stealth, auth & geo. Self-scaling and SSRF-safe. Standby HTTP + batch.

- **URL**: https://apify.com/cheapapi/website-screenshot-api.md
- **Developed by:** [CheapAPI](https://apify.com/cheapapi) (community)
- **Categories:** Other, SEO tools, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 API — Full-Page, Element & Device Capture

Turn any URL into a **pixel-perfect screenshot** (PNG, JPEG, or WebP) — full page, a single element, or an exact region. Most screenshot tools stop at "PNG of the viewport." This one adds **13 realistic device profiles, retina capture, dark mode, automatic cookie-consent + ad blocking, stealth, authenticated-page support, geolocation and bring-your-own-proxy** — all self-scaling and **hardened against SSRF**. Use it as an always-on **Standby HTTP API**, in **batch runs**, or as a tool for **AI agents** (Apify MCP). You only pay for **successful** screenshots.

### Why this actor (the edge)

- 🖼️ **All four formats** — PNG, JPEG, **WebP** (smaller files), and **PDF**. Many actors do PNG/PDF only.
- 📱 **13 device profiles** — desktop / laptop / QHD / Mac-retina / iPhone / Pixel / Galaxy / iPad / social aspect ratios — each a *consistent* viewport + pixel density + matching user-agent + touch. Pick `iphone_15` and you get a real iPhone capture, not a squished desktop. **All profiles cost the same.**
- 📜 **True full-page** with a safe 16384 px cap — not a fragile "scroll to bottom" hack.
- 🎯 **Element & region capture** — CSS `selector` or an exact `clip` rectangle.
- 🌙 **Dark mode**, **retina** (`deviceScaleFactor` up to 3), custom viewport, transparent background.
- 🍪 **Cookie consent handled properly** — it *clicks* "Accept" (unlocking consent-gated content), then hides leftovers. Plus ad/tracker blocking.
- 🥷 **Stealth on by default** — masks the obvious headless tells so pages don't flag a bot (no CAPTCHA solving).
- 🔐 **Authenticated & paywalled pages** — pass `cookies` and `headers` (e.g. `Authorization`); secrets are sent **first-party only**.
- 🌍 **Geo capture** — `geolocation` spoofing and **bring-your-own `proxy`** to capture a page as seen from any country.
- ⚡ **Self-scaling & reliable** — reads the run's memory/CPU and tunes concurrency; a bounded queue returns `429` instead of crashing under load.
- 🛡️ **SSRF-safe by design** — every request (and redirect/subresource) is routed through a forced proxy that resolves, classifies and **pins** the IP; private/metadata ranges are blocked and DNS-rebinding is defeated. Downloads are refused (no disk abuse).
- 💸 **Billed only on success** at **$0.0009 / screenshot ($0.90 / 1,000)** — failures and rejections are free.

### How it compares

| Capability | **This actor** | Typical screenshot actors | Standalone SaaS APIs |
| --- | :---: | :---: | :---: |
| PNG / JPEG / **WebP** / PDF | ✅ all 4 | ⚠️ often PNG/PDF only | ✅ |
| True full-page (capped) | ✅ | ⚠️ scroll-to-bottom hack | ✅ |
| Element + region (`clip`) | ✅ | ❌ rare | ⚠️ some |
| Retina / `deviceScaleFactor` | ✅ 1–3 | ❌ usually none | ✅ |
| 13 real **device profiles** | ✅ | ❌ width-only | ⚠️ some |
| Dark mode | ✅ | ❌ | ⚠️ some |
| Auto-**accept** cookie consent | ✅ (clicks Accept) | ❌ hide-only at best | ⚠️ hide-only |
| Ad/tracker blocking | ✅ | ❌ manual selectors | ✅ |
| Stealth (anti-bot tells) | ✅ default | ❌ | 💲 premium tier |
| Authenticated pages (cookies/headers) | ✅ first-party-scoped | ⚠️ rare | 💲 premium |
| Geolocation + own proxy | ✅ | ❌ | 💲 premium |
| Self-scaling + backpressure | ✅ | ❌ | n/a (managed) |
| SSRF-safe, no downloads | ✅ | ❓ usually unstated | ✅ |
| Price | **$0.0009 / shot ($0.90/1K), success-only** | ~$0.008 + or free+compute | **$2–$10 / 1,000** |

> Legend: ✅ yes · ⚠️ partial/varies · ❌ no · 💲 paid add-on. "Typical screenshot actors" reflects the common feature set across popular Store alternatives at the time of writing.

### Features in detail

| Feature | How |
| --- | --- |
| Formats | `format` = `png` · `jpeg` · `webp` · `pdf` (WebP re-encoded with sharp; PDF rendered by Chromium). |
| Full page | `fullPage=true`; height capped at 16384 px and reported via `truncatedHeight`. |
| Element / region | `selector` for one element, or `clip` `{x,y,width,height}`. |
| Device profiles | `device` (see list above); explicit `width`/`height`/`deviceScaleFactor` override it. |
| Dark mode | `colorScheme=dark`. |
| Cookie consent | `acceptCookies` clicks Accept (CMP vendors + text heuristic, iframes); `blockCookieBanners` hides leftovers. |
| Blocking | `blockAds`, `blockImages`. |
| Stealth | `stealth` (default on) masks `navigator.webdriver`, `HeadlessChrome` UA, plugins. |
| Auth | `cookies[]`, `headers{}` (first-party only; hop-by-hop/spoofable headers rejected). |
| Emulation | `locale`, `timezoneId`, `userAgent`, `geolocation`, `isMobile`. |
| Proxy | `proxy` — your own http/socks proxy (validated public). |
| Waits | `waitUntil`, `waitForSelector`, `delayMs`, `timeoutMs`. |

### Pricing

**Pay-per-event, charged only on a successful capture.** Failed captures, validation errors and queue rejections are **free**.

| Event | When | Price |
| --- | --- | --- |
| `screenshot` | One successful screenshot delivered | **$0.0009** ($0.90 / 1,000) |
| `apify-actor-start` | Run / Standby boot | platform default |

At **$0.0009 / screenshot ($0.90 / 1,000)** this sits an order of magnitude below standalone APIs ($2–$10 / 1,000) while doing more per shot. Set the exact price in **Console → Monetization** before publishing.

### Usage

#### Standby — always-on HTTP API
Enable **Standby** in the Console, then call the Actor hostname with your Apify token:
```bash
curl "https://<username>--website-screenshot-api.apify.actor/screenshot?url=https://apify.com&fullPage=true&format=webp" \
  -H "Authorization: Bearer <APIFY_TOKEN>"
````

POST JSON for advanced options:

```bash
curl -X POST "https://<username>--website-screenshot-api.apify.actor/screenshot" \
  -H "Authorization: Bearer <APIFY_TOKEN>" -H "Content-Type: application/json" \
  -d '{"url":"https://apify.com","device":"iphone_15","colorScheme":"dark"}'
```

Response is JSON: capture metadata + the key-value store `key` and public `url` of the image.

#### Batch run

```json
{ "url": "https://apify.com", "urls": ["https://example.com"], "format": "png", "fullPage": true, "device": "desktop" }
```

Each URL → one image in the key-value store + one metadata row in the dataset.

#### AI agents (MCP)

Discoverable and runnable through **Apify's MCP server** (`mcp.apify.com`) — the input schema is exposed as a tool automatically; no extra setup.

### Input parameter reference

| Parameter | Type | Default | Notes |
| --- | --- | --- | --- |
| `url` | string | — (required) | http(s); must resolve to a public address. |
| `urls` | string\[] | — | Batch mode. |
| `format` | string | `png` | `png`, `jpeg`, `webp`, `pdf`. |
| `quality` | integer | `80` | JPEG/WebP 1–100. |
| `fullPage` | boolean | `false` | Whole scrollable page. |
| `device` | string | `desktop` | Device profile. |
| `width` / `height` | integer | *(device)* | 1–3840 / 1–4320. |
| `deviceScaleFactor` | number | *(device)* | 1–3. |
| `waitUntil` | string | `load` | `load`,`domcontentloaded`,`commit`,`networkidle`. |
| `waitForSelector` | string | — | Wait for an element. |
| `delayMs` / `timeoutMs` | integer | `0` / `30000` | 0–10000 / 1000–60000. |
| `colorScheme` | string | `no-preference` | `light`,`dark`. |
| `selector` / `clip` | string / object | — | Element or region. |
| `omitBackground` | boolean | `false` | Transparent (PNG/WebP). |
| `blockAds` / `blockCookieBanners` / `acceptCookies` | boolean | `true` | Cleaner captures. |
| `blockImages` / `stealth` / `isMobile` | boolean | `false`/`true`/*(device)* | — |
| `locale` / `timezoneId` / `userAgent` | string | — | Emulation. |
| `geolocation` | object | — | `{latitude,longitude}`. |
| `cookies` / `headers` | array / object | — | Auth (first-party only). |
| `proxy` | string | — | Your own http/socks proxy (public). |

### Output

- Image/PDF binary in the **key-value store** (`<prefix>.<ext>`, correct `Content-Type`).
- A **dataset** row with metadata + KV key and public URL:

```json
{ "url": "https://apify.com", "finalUrl": "https://apify.com/", "format": "png",
  "width": 1920, "height": 1080, "fullPage": true, "bytes": 184213, "tookMs": 1842,
  "key": "screenshot-....png", "url_": "https://api.apify.com/v2/key-value-stores/<storeId>/records/<key>" }
```

### Security & limits

- **SSRF protection always on:** forced in-process proxy resolves DNS, classifies **every** resolved IP, blocks private/reserved/loopback/link-local (incl. `169.254.169.254`), pins the validated IP (defeats DNS-rebinding) — for the page **and** its subresources/redirects.
- **No downloads / no execution:** `acceptDownloads:false`; pages are only rendered, never run on the host.
- **Bounds:** full-page ≤ 16384 px, per-capture timeout ≤ 60 s, response size cap, viewport ≤ 3840×4320, DSF ≤ 3. Fresh isolated browser context per capture.

### License

Apache-2.0

# Actor input Schema

## `url` (type: `string`):

The URL of the page to capture. Must be http(s) and resolve to a public address.

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

Optional list of URLs to capture in a single batch run. When provided, each URL produces one output. Overrides nothing — `url` is still used if `urls` is empty.

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

Output file format. `pdf` always captures the full page.

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

Compression quality for `jpeg` and `webp` (1-100). Ignored for `png` and `pdf`.

## `omitBackground` (type: `boolean`):

Hide the default white page background, producing a transparent capture. Only meaningful for `png` and `webp`.

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

Capture the entire scrollable page instead of just the viewport. Height is capped at 16384 px (the Chromium texture limit).

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

Realistic, consistent device profile (viewport + pixel density + matching user agent + mobile/touch). All profiles cost the same. Default: desktop Full HD. Set a custom width/height below to override.

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

Override the device profile width. Leave empty to use the selected device.

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

Override the device profile height. Ignored when Full page is enabled. Leave empty to use the selected device.

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

Override pixel density (1 = standard, 2 = retina). Leave empty to use the selected device.

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

Navigation lifecycle event to wait for before capturing.

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

Additional delay after the page is ready, to let animations or late content settle.

## `timeoutMs` (type: `integer`):

Maximum time to wait for navigation and rendering before failing.

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

Emulated `prefers-color-scheme` media feature.

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

Optional CSS selector. When set, only the first matching element is captured instead of the page.

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

CSS selectors for elements to hide (set `visibility:hidden`) before capturing.

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

Block common advertising and tracking network requests.

## `acceptCookies` (type: `boolean`):

Click the 'Accept / I understand / Kabul et' button on consent dialogs (CMP vendors + text heuristic, iframes included). This GRANTS consent, which unlocks content gated behind it (e.g. recommendation lists). On by default.

## `blockCookieBanners` (type: `boolean`):

Visually hide any cookie/GDPR banner still present after auto-accept (CSS display:none). Note: hiding does NOT grant consent — use Auto-accept for consent-gated content.

## `blockImages` (type: `boolean`):

Skip loading images for faster, text-only captures.

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

Optional CSS selector to wait for (visible) before capturing. Useful for single-page apps and late-rendered content. Fails if the element never appears within the timeout.

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

Capture only a rectangular region: { "x": 0, "y": 0, "width": 800, "height": 600 }. Takes precedence over Full page; ignored for PDF and element capture.

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

Emulated locale, e.g. en-US, de-DE, tr-TR. Affects Accept-Language and JS locale APIs.

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

Emulated IANA timezone, e.g. Europe/Istanbul, America/New\_York.

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

Override the browser User-Agent string. Leave empty to use the device profile's realistic UA.

## `stealth` (type: `boolean`):

Mask obvious automation tells (navigator.webdriver, missing window.chrome, empty plugins, HeadlessChrome UA) so the page does not look like a bot. Does NOT solve CAPTCHAs/Cloudflare challenges — pair with a residential proxy and/or cookies for protected sites. On by default.

## `isMobile` (type: `boolean`):

Emulate a mobile device (touch + mobile viewport meta). Pair with a small width/height for phone screenshots.

## `hasTouch` (type: `boolean`):

Enable touch events. Defaults to true when Mobile emulation is on.

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

Spoof GPS location and grant the geolocation permission: { "latitude": 41.0082, "longitude": 28.9784 }.

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

Cookies for authenticated / paywalled pages. Each: { "name": "sid", "value": "...", "domain": ".example.com", "path": "/" }. Cookies without a domain/url are scoped to the target URL.

## `headers` (type: `object`):

Custom request headers, e.g. { "Authorization": "Bearer ..." }. Sent ONLY to first-party (same-origin) requests — never leaked to cross-origin subresources or after a cross-origin redirect. Hop-by-hop and spoofable headers (Host, Cookie, Content-Length, ...) are rejected.

## `proxy` (type: `string`):

Route this capture through YOUR OWN proxy, e.g. http://user:pass@host:port or socks5://host:1080 (capture the page as seen from your proxy's location/country). The proxy address must be public. Schemes: http, https, socks4, socks5. Note: Chromium ignores auth for socks proxies.

## Actor input object example

```json
{
  "url": "https://apify.com",
  "format": "png",
  "quality": 80,
  "omitBackground": false,
  "fullPage": false,
  "device": "desktop",
  "waitUntil": "load",
  "delayMs": 0,
  "timeoutMs": 30000,
  "colorScheme": "no-preference",
  "blockAds": true,
  "acceptCookies": true,
  "blockCookieBanners": true,
  "blockImages": false,
  "stealth": true,
  "isMobile": false,
  "hasTouch": 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 = {
    "url": "https://apify.com"
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Screenshot API — Full-Page, Element & Device Capture",
        "description": "Website Screenshot API: capture any URL as PNG, JPEG or WebP (PDF too) — true full-page, element & region capture, 13 device profiles, dark mode, retina, ad/cookie-banner blocking, stealth, auth & geo. Self-scaling and SSRF-safe. Standby HTTP + batch.",
        "version": "1.0",
        "x-build-id": "K3VnVKcEOTh07V6i5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cheapapi~website-screenshot-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cheapapi-website-screenshot-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/cheapapi~website-screenshot-api/runs": {
            "post": {
                "operationId": "runs-sync-cheapapi-website-screenshot-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/cheapapi~website-screenshot-api/run-sync": {
            "post": {
                "operationId": "run-sync-cheapapi-website-screenshot-api",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "url"
                ],
                "properties": {
                    "url": {
                        "title": "Target URL",
                        "type": "string",
                        "description": "The URL of the page to capture. Must be http(s) and resolve to a public address."
                    },
                    "urls": {
                        "title": "Target URLs (batch)",
                        "type": "array",
                        "description": "Optional list of URLs to capture in a single batch run. When provided, each URL produces one output. Overrides nothing — `url` is still used if `urls` is empty.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "format": {
                        "title": "Output format",
                        "enum": [
                            "png",
                            "jpeg",
                            "webp",
                            "pdf"
                        ],
                        "type": "string",
                        "description": "Output file format. `pdf` always captures the full page.",
                        "default": "png"
                    },
                    "quality": {
                        "title": "Quality",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Compression quality for `jpeg` and `webp` (1-100). Ignored for `png` and `pdf`.",
                        "default": 80
                    },
                    "omitBackground": {
                        "title": "Transparent background",
                        "type": "boolean",
                        "description": "Hide the default white page background, producing a transparent capture. Only meaningful for `png` and `webp`.",
                        "default": false
                    },
                    "fullPage": {
                        "title": "Full page",
                        "type": "boolean",
                        "description": "Capture the entire scrollable page instead of just the viewport. Height is capped at 16384 px (the Chromium texture limit).",
                        "default": false
                    },
                    "device": {
                        "title": "Device profile",
                        "enum": [
                            "desktop",
                            "desktop_hd",
                            "desktop_1440",
                            "desktop_mac",
                            "square",
                            "portrait",
                            "portrait_2x3",
                            "widescreen_720",
                            "iphone_15",
                            "iphone_se",
                            "pixel_8",
                            "galaxy_s23",
                            "ipad"
                        ],
                        "type": "string",
                        "description": "Realistic, consistent device profile (viewport + pixel density + matching user agent + mobile/touch). All profiles cost the same. Default: desktop Full HD. Set a custom width/height below to override.",
                        "default": "desktop"
                    },
                    "width": {
                        "title": "Custom viewport width (px)",
                        "minimum": 1,
                        "maximum": 3840,
                        "type": "integer",
                        "description": "Override the device profile width. Leave empty to use the selected device."
                    },
                    "height": {
                        "title": "Custom viewport height (px)",
                        "minimum": 1,
                        "maximum": 4320,
                        "type": "integer",
                        "description": "Override the device profile height. Ignored when Full page is enabled. Leave empty to use the selected device."
                    },
                    "deviceScaleFactor": {
                        "title": "Device scale factor",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "Override pixel density (1 = standard, 2 = retina). Leave empty to use the selected device."
                    },
                    "waitUntil": {
                        "title": "Wait until",
                        "enum": [
                            "load",
                            "domcontentloaded",
                            "commit"
                        ],
                        "type": "string",
                        "description": "Navigation lifecycle event to wait for before capturing.",
                        "default": "load"
                    },
                    "delayMs": {
                        "title": "Extra delay (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Additional delay after the page is ready, to let animations or late content settle.",
                        "default": 0
                    },
                    "timeoutMs": {
                        "title": "Navigation timeout (ms)",
                        "minimum": 1000,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Maximum time to wait for navigation and rendering before failing.",
                        "default": 30000
                    },
                    "colorScheme": {
                        "title": "Color scheme",
                        "enum": [
                            "no-preference",
                            "light",
                            "dark"
                        ],
                        "type": "string",
                        "description": "Emulated `prefers-color-scheme` media feature.",
                        "default": "no-preference"
                    },
                    "selector": {
                        "title": "Element selector",
                        "type": "string",
                        "description": "Optional CSS selector. When set, only the first matching element is captured instead of the page."
                    },
                    "hideSelectors": {
                        "title": "Hide selectors",
                        "type": "array",
                        "description": "CSS selectors for elements to hide (set `visibility:hidden`) before capturing.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "blockAds": {
                        "title": "Block ads",
                        "type": "boolean",
                        "description": "Block common advertising and tracking network requests.",
                        "default": true
                    },
                    "acceptCookies": {
                        "title": "Auto-accept cookie consent",
                        "type": "boolean",
                        "description": "Click the 'Accept / I understand / Kabul et' button on consent dialogs (CMP vendors + text heuristic, iframes included). This GRANTS consent, which unlocks content gated behind it (e.g. recommendation lists). On by default.",
                        "default": true
                    },
                    "blockCookieBanners": {
                        "title": "Hide leftover cookie banners",
                        "type": "boolean",
                        "description": "Visually hide any cookie/GDPR banner still present after auto-accept (CSS display:none). Note: hiding does NOT grant consent — use Auto-accept for consent-gated content.",
                        "default": true
                    },
                    "blockImages": {
                        "title": "Block images",
                        "type": "boolean",
                        "description": "Skip loading images for faster, text-only captures.",
                        "default": false
                    },
                    "waitForSelector": {
                        "title": "Wait for selector",
                        "type": "string",
                        "description": "Optional CSS selector to wait for (visible) before capturing. Useful for single-page apps and late-rendered content. Fails if the element never appears within the timeout."
                    },
                    "clip": {
                        "title": "Clip region",
                        "type": "object",
                        "description": "Capture only a rectangular region: { \"x\": 0, \"y\": 0, \"width\": 800, \"height\": 600 }. Takes precedence over Full page; ignored for PDF and element capture."
                    },
                    "locale": {
                        "title": "Locale",
                        "type": "string",
                        "description": "Emulated locale, e.g. en-US, de-DE, tr-TR. Affects Accept-Language and JS locale APIs."
                    },
                    "timezoneId": {
                        "title": "Timezone",
                        "type": "string",
                        "description": "Emulated IANA timezone, e.g. Europe/Istanbul, America/New_York."
                    },
                    "userAgent": {
                        "title": "User agent",
                        "type": "string",
                        "description": "Override the browser User-Agent string. Leave empty to use the device profile's realistic UA."
                    },
                    "stealth": {
                        "title": "Stealth mode",
                        "type": "boolean",
                        "description": "Mask obvious automation tells (navigator.webdriver, missing window.chrome, empty plugins, HeadlessChrome UA) so the page does not look like a bot. Does NOT solve CAPTCHAs/Cloudflare challenges — pair with a residential proxy and/or cookies for protected sites. On by default.",
                        "default": true
                    },
                    "isMobile": {
                        "title": "Mobile emulation",
                        "type": "boolean",
                        "description": "Emulate a mobile device (touch + mobile viewport meta). Pair with a small width/height for phone screenshots.",
                        "default": false
                    },
                    "hasTouch": {
                        "title": "Touch support",
                        "type": "boolean",
                        "description": "Enable touch events. Defaults to true when Mobile emulation is on.",
                        "default": false
                    },
                    "geolocation": {
                        "title": "Geolocation",
                        "type": "object",
                        "description": "Spoof GPS location and grant the geolocation permission: { \"latitude\": 41.0082, \"longitude\": 28.9784 }."
                    },
                    "cookies": {
                        "title": "Session cookies",
                        "type": "array",
                        "description": "Cookies for authenticated / paywalled pages. Each: { \"name\": \"sid\", \"value\": \"...\", \"domain\": \".example.com\", \"path\": \"/\" }. Cookies without a domain/url are scoped to the target URL."
                    },
                    "headers": {
                        "title": "Extra HTTP headers",
                        "type": "object",
                        "description": "Custom request headers, e.g. { \"Authorization\": \"Bearer ...\" }. Sent ONLY to first-party (same-origin) requests — never leaked to cross-origin subresources or after a cross-origin redirect. Hop-by-hop and spoofable headers (Host, Cookie, Content-Length, ...) are rejected."
                    },
                    "proxy": {
                        "title": "Upstream proxy",
                        "type": "string",
                        "description": "Route this capture through YOUR OWN proxy, e.g. http://user:pass@host:port or socks5://host:1080 (capture the page as seen from your proxy's location/country). The proxy address must be public. Schemes: http, https, socks4, socks5. Note: Chromium ignores auth for socks proxies."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
