# Screenshot Pro — Full-Page Screenshot, Element Capture & PDF (`p6t_p10n/screenshot-pro`) Actor

Capture full-page or element screenshots in PNG, JPEG or WebP, or render pages to PDF. Auto-dismisses cookie banners, blocks ads, emulates devices and waits for the element you actually care about.

- **URL**: https://apify.com/p6t\_p10n/screenshot-pro.md
- **Developed by:** [Peerapat Pongnipakorn](https://apify.com/p6t_p10n) (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

from $2.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/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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Screenshot Pro — Full-Page Screenshots, Element Capture & PDF

Turn any URL into a PNG, JPEG, WebP or PDF. Built for the jobs a screenshot tool actually gets used for: visual regression checks, competitor monitoring, OG images, PDF archiving, and feeding page renders to a vision model.

**You are charged per delivered file. Failed URLs cost nothing.**

### What it does that basic screenshot Actors don't

| | Screenshot Pro | Typical basic screenshot Actor |
|---|---|---|
| Full-page flag | ✅ explicit | ⚠️ scroll hack only |
| JPEG / WebP output | ✅ | ❌ PNG only |
| Capture a single element | ✅ CSS selector | ❌ |
| Wait for a selector | ✅ | ❌ fixed delay only |
| Cookie banner dismissal | ✅ 15+ CMPs, 12 languages | ❌ |
| Ad & tracker blocking | ✅ | ❌ |
| Device emulation | ✅ 10 presets | ❌ |
| Retina (2x / 3x) | ✅ | ❌ |
| Dark mode | ✅ | ❌ |
| Viewport height control | ✅ | ❌ width only |
| PDF page setup | ✅ format, margin, scale, media | ⚠️ defaults only |
| Custom CSS / JS injection | ✅ | ❌ |
| Auth via headers & cookies | ✅ | ❌ |
| Per-URL retry with a fresh IP | ✅ | ❌ |
| Failed URLs billed | ❌ never | ⚠️ often |

WebP typically comes out **60–75% smaller than PNG** at visually identical quality, which matters when you are capturing thousands of pages.

### Quick start

```json
{
  "urls": [{ "url": "https://apify.com" }],
  "format": "webp",
  "fullPage": true,
  "quality": 80
}
````

Every run writes the image or PDF to the key-value store and one metadata record per URL to the dataset:

```json
{
  "startUrl": "https://apify.com",
  "url": "https://apify.com/",
  "status": "success",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../screenshot-00000.webp",
  "screenshotKey": "screenshot-00000.webp",
  "format": "webp",
  "width": 1440,
  "height": 9562,
  "bytes": 387078,
  "httpStatus": 200,
  "clipped": false,
  "cookieBannerHandled": true,
  "durationMs": 3749,
  "attempts": 1
}
```

### Recipes

**Mobile screenshot, retina**

```json
{
  "urls": [{ "url": "https://example.com" }],
  "device": "iphone-15",
  "format": "jpeg",
  "quality": 85
}
```

**One element only — pricing table, hero, chart**

```json
{
  "urls": [{ "url": "https://example.com/pricing" }],
  "selector": "#pricing-table",
  "format": "png",
  "omitBackground": true
}
```

**Archive an article as PDF, as the reader sees it**

```json
{
  "urls": [{ "url": "https://example.com/article" }],
  "format": "pdf",
  "pdfFormat": "A4",
  "pdfMedia": "screen",
  "pdfPrintBackground": true,
  "pdfMargin": "1cm"
}
```

**A page that renders late**

```json
{
  "urls": [{ "url": "https://example.com/dashboard" }],
  "waitUntil": "networkidle",
  "waitForSelector": ".chart-rendered",
  "delayMs": 500
}
```

**Behind a login**

```json
{
  "urls": [{ "url": "https://example.com/account" }],
  "cookies": [
    { "name": "session", "value": "abc123", "domain": ".example.com", "path": "/" }
  ]
}
```

**Different wait rules per URL** — any URL entry accepts `waitForSelector`, `selector`, `fullPage` and `delayMs` as overrides:

```json
{
  "urls": [
    { "url": "https://example.com/fast" },
    { "url": "https://example.com/slow", "waitForSelector": "#loaded", "delayMs": 2000 }
  ]
}
```

### Notes on the tricky options

**`dismissCookieBanners`** (on by default) tries known CMP buttons first, then accept buttons matched by text — but only inside a container that looks like consent UI, so an "Accept" button in your target's own content is never clicked. Banners are usually injected after `load` and some only appear on scroll, so the sweep runs on a short poll and again after scrolling. The `cookieBannerHandled` field tells you whether it actually did anything.

**`blockAds`** (on by default) makes pages load faster and captures finish sooner. Be aware that a blocked ad slot leaves its reserved space empty, so some sites show a blank band where the ad would have been. Turn it off if you need a pixel-faithful capture.

**`stickyMode`** defaults to `keep`, which leaves the page untouched. `unstick` returns pinned bars to normal flow — useful when a sticky header is dragging off-screen elements into a tall capture — but it mutates layout, and on some sites that shifts content down by several hundred pixels. Try it per site rather than switching it on globally.

**`customJs`** runs inside the browser page context, in the same sandbox as the site's own scripts. It cannot reach this Actor's token, environment or filesystem.

**Very tall pages**: Chromium cannot rasterise beyond 16,384px. Taller pages are captured down to that limit and flagged with `"clipped": true` rather than failing.

### Cost

Priced per delivered file. A URL that fails every retry produces a dataset record with `status: "failed"` and is not charged — you pay for screenshots you receive, not for attempts.

Runs finish faster with `blockAds` on, and faster still if you also block `media` or `font` resource types on sites that don't need them.

If a run hits your maximum charge limit, remaining URLs are recorded with `status: "skipped"` instead of silently dropped.

### Run locally

```bash
npm install
npx playwright install chromium
mkdir -p storage/key_value_stores/default
echo '{"urls":[{"url":"https://apify.com"}],"format":"webp"}' > storage/key_value_stores/default/INPUT.json
ACTOR_TEST_PAY_PER_EVENT=true npm start
```

Results land in `storage/key_value_stores/default/` and `storage/datasets/default/`.

### Legal

Capture pages you are allowed to capture. Respect the target site's terms of service and robots directives, and take care with personal data — a screenshot of a profile page is still personal data under the GDPR and Thailand's PDPA.

# Actor input Schema

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

Pages to capture. Accepts plain URLs or objects with per-URL overrides for <code>waitForSelector</code>, <code>selector</code>, <code>fullPage</code> and <code>delayMs</code>.

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

PNG is lossless. JPEG and WebP produce much smaller files — WebP is typically 25-35% smaller than JPEG at the same quality. PDF renders the page through Chromium's print pipeline.

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

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

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

Capture only this element instead of the page. CSS selector. Overrides <b>Full page</b>.

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

1-100. Ignored for PNG and PDF.

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

Produce a transparent background where the page has none. PNG and WebP only.

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

Sets viewport, user agent, scale factor and touch support in one go. Choose <code>custom</code> to drive the viewport fields below.

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

Used when <b>Device preset</b> is <code>custom</code>.

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

Used when <b>Device preset</b> is <code>custom</code>. Irrelevant for full-page captures beyond triggering lazy loading.

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

2 gives a retina-quality image at double the pixel dimensions. Leave empty to use the device preset's native scale; setting a value overrides the preset, including forcing 1x on a retina device.

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

Emulate <code>prefers-color-scheme: dark</code>.

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

Navigation completion signal. <code>networkidle</code> is the safest for JS-heavy pages but the slowest.

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

Block until this element is visible before capturing. The most reliable way to avoid capturing a half-rendered page.

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

Fixed pause immediately before capture, for animations that have no observable end state.

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

Scroll through the page to trigger lazy-loaded images, then return to the top. Almost always needed for full-page captures.

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

Give up on a single URL after this long and record it as a failed item.

## `retries` (type: `integer`):

Retry a failed URL this many times, with a fresh browser context each attempt.

## `dismissCookieBanners` (type: `boolean`):

Detect and click through consent dialogs from OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics, Osano, CookieYes, Complianz and generic accept buttons in 12 languages.

## `stickyMode` (type: `string`):

Pinned bars and widgets can be dragged into a tall capture. <code>unstick</code> returns them to normal flow so they render once, in place; <code>hide</code> removes them. Both only touch overlay-sized elements, never full-viewport layout containers — but they do mutate the page, so <code>keep</code> is the default.

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

CSS selectors to hide before capture — chat widgets, sticky headers, newsletter modals.

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

Drop requests to known ad and analytics hosts. Faster pages, cleaner images, lower compute cost.

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

Additional Playwright resource types to block outright.

## `customCss` (type: `string`):

Injected as a <code>\<style></code> tag before capture.

## `customJs` (type: `string`):

Body of an async function evaluated in the page before capture. Runs after cookie handling and element hiding.

## `pdfFormat` (type: `string`):

Paper size of the generated PDF pages.

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

Rotate the PDF pages to landscape orientation.

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

Off by default in Chromium, which is why most PDF scrapers produce washed-out pages. On by default here.

## `pdfMedia` (type: `string`):

<code>screen</code> reproduces what a visitor sees. <code>print</code> applies the site's print stylesheet, which usually strips navigation and ads.

## `pdfScale` (type: `string`):

Render scale between 0.1 and 2.

## `pdfMargin` (type: `string`):

CSS length applied to all four sides, e.g. <code>0</code>, <code>1cm</code>, <code>0.5in</code>.

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

Overrides the device preset's user agent.

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

Sent with every request, e.g. an <code>Authorization</code> header for gated pages.

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

Playwright cookie objects, for capturing pages behind a login.

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

e.g. <code>en-US</code>, <code>th-TH</code>. Affects rendered language and number formatting.

## `timezone` (type: `string`):

IANA timezone, e.g. <code>Asia/Bangkok</code>.

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

How many pages to capture in parallel. Each parallel page is a separate browser context, so memory is the practical limit — around 1 GB per heavy page.

## `proxy` (type: `object`):

Proxy configuration. Residential proxies help on sites that block datacenter IPs.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    }
  ],
  "format": "png",
  "fullPage": true,
  "selector": "#pricing-table",
  "quality": 80,
  "omitBackground": false,
  "device": "custom",
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "darkMode": false,
  "waitUntil": "load",
  "waitForSelector": ".product-grid",
  "delayMs": 0,
  "scrollToBottom": true,
  "timeoutSecs": 60,
  "retries": 2,
  "dismissCookieBanners": true,
  "stickyMode": "keep",
  "hideSelectors": [],
  "blockAds": true,
  "blockResourceTypes": [],
  "pdfFormat": "A4",
  "pdfLandscape": false,
  "pdfPrintBackground": true,
  "pdfMedia": "screen",
  "pdfScale": "1",
  "pdfMargin": "0",
  "cookies": [],
  "maxConcurrency": 5,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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("p6t_p10n/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("p6t_p10n/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 p6t_p10n/screenshot-pro --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Screenshot Pro — Full-Page Screenshot, Element Capture & PDF",
        "description": "Capture full-page or element screenshots in PNG, JPEG or WebP, or render pages to PDF. Auto-dismisses cookie banners, blocks ads, emulates devices and waits for the element you actually care about.",
        "version": "0.1",
        "x-build-id": "tistllFbmhfalg7qy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/p6t_p10n~screenshot-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-p6t_p10n-screenshot-pro",
                "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/p6t_p10n~screenshot-pro/runs": {
            "post": {
                "operationId": "runs-sync-p6t_p10n-screenshot-pro",
                "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/p6t_p10n~screenshot-pro/run-sync": {
            "post": {
                "operationId": "run-sync-p6t_p10n-screenshot-pro",
                "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": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "URLs",
                        "type": "array",
                        "description": "Pages to capture. Accepts plain URLs or objects with per-URL overrides for <code>waitForSelector</code>, <code>selector</code>, <code>fullPage</code> and <code>delayMs</code>.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "format": {
                        "title": "Output format",
                        "enum": [
                            "png",
                            "jpeg",
                            "webp",
                            "pdf"
                        ],
                        "type": "string",
                        "description": "PNG is lossless. JPEG and WebP produce much smaller files — WebP is typically 25-35% smaller than JPEG at the same quality. PDF renders the page through Chromium's print pipeline.",
                        "default": "png"
                    },
                    "fullPage": {
                        "title": "Full page",
                        "type": "boolean",
                        "description": "Capture the entire scrollable page instead of just the visible viewport.",
                        "default": true
                    },
                    "selector": {
                        "title": "Element selector",
                        "type": "string",
                        "description": "Capture only this element instead of the page. CSS selector. Overrides <b>Full page</b>."
                    },
                    "quality": {
                        "title": "Quality (JPEG / WebP)",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "1-100. Ignored for PNG and PDF.",
                        "default": 80
                    },
                    "omitBackground": {
                        "title": "Transparent background",
                        "type": "boolean",
                        "description": "Produce a transparent background where the page has none. PNG and WebP only.",
                        "default": false
                    },
                    "device": {
                        "title": "Device preset",
                        "enum": [
                            "custom",
                            "desktop",
                            "desktop-hd",
                            "macbook-pro-16",
                            "iphone-15",
                            "iphone-15-pro-max",
                            "iphone-se",
                            "pixel-7",
                            "galaxy-s9",
                            "ipad-pro-11",
                            "ipad-mini"
                        ],
                        "type": "string",
                        "description": "Sets viewport, user agent, scale factor and touch support in one go. Choose <code>custom</code> to drive the viewport fields below.",
                        "default": "custom"
                    },
                    "viewportWidth": {
                        "title": "Viewport width",
                        "minimum": 100,
                        "maximum": 3840,
                        "type": "integer",
                        "description": "Used when <b>Device preset</b> is <code>custom</code>.",
                        "default": 1440
                    },
                    "viewportHeight": {
                        "title": "Viewport height",
                        "minimum": 100,
                        "maximum": 4320,
                        "type": "integer",
                        "description": "Used when <b>Device preset</b> is <code>custom</code>. Irrelevant for full-page captures beyond triggering lazy loading.",
                        "default": 900
                    },
                    "deviceScaleFactor": {
                        "title": "Scale factor (retina)",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "2 gives a retina-quality image at double the pixel dimensions. Leave empty to use the device preset's native scale; setting a value overrides the preset, including forcing 1x on a retina device."
                    },
                    "darkMode": {
                        "title": "Dark mode",
                        "type": "boolean",
                        "description": "Emulate <code>prefers-color-scheme: dark</code>.",
                        "default": false
                    },
                    "waitUntil": {
                        "title": "Wait until",
                        "enum": [
                            "commit",
                            "domcontentloaded",
                            "load",
                            "networkidle"
                        ],
                        "type": "string",
                        "description": "Navigation completion signal. <code>networkidle</code> is the safest for JS-heavy pages but the slowest.",
                        "default": "load"
                    },
                    "waitForSelector": {
                        "title": "Wait for selector",
                        "type": "string",
                        "description": "Block until this element is visible before capturing. The most reliable way to avoid capturing a half-rendered page."
                    },
                    "delayMs": {
                        "title": "Extra delay",
                        "minimum": 0,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Fixed pause immediately before capture, for animations that have no observable end state.",
                        "default": 0
                    },
                    "scrollToBottom": {
                        "title": "Scroll to bottom first",
                        "type": "boolean",
                        "description": "Scroll through the page to trigger lazy-loaded images, then return to the top. Almost always needed for full-page captures.",
                        "default": true
                    },
                    "timeoutSecs": {
                        "title": "Timeout per URL",
                        "minimum": 5,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Give up on a single URL after this long and record it as a failed item.",
                        "default": 60
                    },
                    "retries": {
                        "title": "Retries per URL",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Retry a failed URL this many times, with a fresh browser context each attempt.",
                        "default": 2
                    },
                    "dismissCookieBanners": {
                        "title": "Dismiss cookie banners",
                        "type": "boolean",
                        "description": "Detect and click through consent dialogs from OneTrust, Cookiebot, Didomi, Quantcast, TrustArc, Usercentrics, Osano, CookieYes, Complianz and generic accept buttons in 12 languages.",
                        "default": true
                    },
                    "stickyMode": {
                        "title": "Sticky & fixed elements",
                        "enum": [
                            "keep",
                            "unstick",
                            "hide"
                        ],
                        "type": "string",
                        "description": "Pinned bars and widgets can be dragged into a tall capture. <code>unstick</code> returns them to normal flow so they render once, in place; <code>hide</code> removes them. Both only touch overlay-sized elements, never full-viewport layout containers — but they do mutate the page, so <code>keep</code> is the default.",
                        "default": "keep"
                    },
                    "hideSelectors": {
                        "title": "Hide elements",
                        "type": "array",
                        "description": "CSS selectors to hide before capture — chat widgets, sticky headers, newsletter modals.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "blockAds": {
                        "title": "Block ads & trackers",
                        "type": "boolean",
                        "description": "Drop requests to known ad and analytics hosts. Faster pages, cleaner images, lower compute cost.",
                        "default": true
                    },
                    "blockResourceTypes": {
                        "title": "Block resource types",
                        "type": "array",
                        "description": "Additional Playwright resource types to block outright.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "image",
                                "media",
                                "font",
                                "stylesheet",
                                "script",
                                "websocket",
                                "xhr",
                                "fetch"
                            ]
                        },
                        "default": []
                    },
                    "customCss": {
                        "title": "Custom CSS",
                        "type": "string",
                        "description": "Injected as a <code>&lt;style&gt;</code> tag before capture."
                    },
                    "customJs": {
                        "title": "Custom JavaScript",
                        "type": "string",
                        "description": "Body of an async function evaluated in the page before capture. Runs after cookie handling and element hiding."
                    },
                    "pdfFormat": {
                        "title": "PDF page format",
                        "enum": [
                            "A4",
                            "A3",
                            "A5",
                            "Letter",
                            "Legal",
                            "Tabloid"
                        ],
                        "type": "string",
                        "description": "Paper size of the generated PDF pages.",
                        "default": "A4"
                    },
                    "pdfLandscape": {
                        "title": "Landscape",
                        "type": "boolean",
                        "description": "Rotate the PDF pages to landscape orientation.",
                        "default": false
                    },
                    "pdfPrintBackground": {
                        "title": "Print background graphics",
                        "type": "boolean",
                        "description": "Off by default in Chromium, which is why most PDF scrapers produce washed-out pages. On by default here.",
                        "default": true
                    },
                    "pdfMedia": {
                        "title": "Render with media type",
                        "enum": [
                            "screen",
                            "print"
                        ],
                        "type": "string",
                        "description": "<code>screen</code> reproduces what a visitor sees. <code>print</code> applies the site's print stylesheet, which usually strips navigation and ads.",
                        "default": "screen"
                    },
                    "pdfScale": {
                        "title": "Scale",
                        "type": "string",
                        "description": "Render scale between 0.1 and 2.",
                        "default": "1"
                    },
                    "pdfMargin": {
                        "title": "Margin",
                        "type": "string",
                        "description": "CSS length applied to all four sides, e.g. <code>0</code>, <code>1cm</code>, <code>0.5in</code>.",
                        "default": "0"
                    },
                    "userAgent": {
                        "title": "User agent",
                        "type": "string",
                        "description": "Overrides the device preset's user agent."
                    },
                    "headers": {
                        "title": "Extra HTTP headers",
                        "type": "object",
                        "description": "Sent with every request, e.g. an <code>Authorization</code> header for gated pages."
                    },
                    "cookies": {
                        "title": "Cookies",
                        "type": "array",
                        "description": "Playwright cookie objects, for capturing pages behind a login.",
                        "default": []
                    },
                    "locale": {
                        "title": "Locale",
                        "type": "string",
                        "description": "e.g. <code>en-US</code>, <code>th-TH</code>. Affects rendered language and number formatting."
                    },
                    "timezone": {
                        "title": "Timezone",
                        "type": "string",
                        "description": "IANA timezone, e.g. <code>Asia/Bangkok</code>."
                    },
                    "maxConcurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many pages to capture in parallel. Each parallel page is a separate browser context, so memory is the practical limit — around 1 GB per heavy page.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy configuration. Residential proxies help on sites that block datacenter IPs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
