# Website Screenshot API — Full-Page PNG, JPEG, PDF, WebP (`runlayer/web-screenshot-pro`) Actor

Screenshot any URL as PNG, JPEG, WebP or PDF. Full-page shots that work: sticky headers un-stuck, cookie banners and ads removed, lazy content settled. Device presets, dark mode, retina, authenticated pages, PDF controls, proxy. Charged only per successful screenshot — no startup fee.

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

## Pricing

from $20.00 / 1,000 screenshot captureds

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

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

## What's an Apify Actor?

Actors are 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 & PDF Generator — Full-Page, Cookie-Banner-Free

Capture any public URL as a pixel-perfect **PNG, JPEG, WebP, or PDF** — with the
two things screenshot tools usually get wrong actually solved:

1. **Real full-page capture.** Sticky headers, floating navbars and chat widgets
   are automatically "un-stuck" so they appear **once, in place** — not repeated
   or floating over your content. Lazy-loaded images are scrolled into loading
   before the shot.
2. **Clean shots by default.** Cookie/GDPR consent walls and ad slots are removed
   (or auto-accepted, your choice) so screenshots don't arrive ruined by overlays.

**You are charged only for screenshots that succeed.** No startup fee. Failed
captures cost $0.

### Quick start

```json
{
  "urls": ["https://stripe.com", "https://news.ycombinator.com"]
}
````

That's it — two clean, full-page PNGs land in your run's storage, with direct
image URLs in the dataset:

```json
{
  "url": "https://stripe.com/",
  "status": 200,
  "format": "png",
  "imageUrl": "https://api.apify.com/v2/key-value-stores/…/records/001-stripe-com.png",
  "fullPage": true,
  "device": "Desktop",
  "bytes": 5859948
}
```

### Features

| | |
|---|---|
| **Formats** | PNG (lossless), JPEG & WebP (small, quality dial), PDF (paper size, landscape, scale, margins, page ranges) |
| **Full page** | Auto-scroll settles lazy content; sticky/fixed elements de-stuck; optional max-height cap |
| **Clean-up** | Cookie-banner removal or click-Accept, ad/tracker hiding, hide-any-selector, custom CSS/JS injection |
| **Devices** | Desktop, Desktop HD, iPhone, Android, iPad presets — or custom viewport + retina (@2x/@3x) |
| **Dark mode** | Render the site's dark theme (`prefers-color-scheme`) |
| **Element shots** | Screenshot a single element by CSS selector |
| **Timing** | `load` / `domcontentloaded` / `networkidle`, wait-for-selector, extra delay |
| **Authenticated pages** | Cookies, custom headers, HTTP Basic auth — capture pages you have access to |
| **Localization** | Geolocation, timezone, locale emulation |
| **Reliability** | Optional Apify Proxy (incl. residential) for bot-protected sites; generous navigation timeouts; captures what rendered even if a page never fully "loads" |
| **Speed** | Optional resource blocking (images/fonts/media/CSS) for fast lightweight captures |

### Common recipes

**Marketing site archive (weekly, via Schedules):** all your landing pages, full-page,
banner-free — `{"urls": [...], "format": "jpeg", "quality": 80}`

**Mobile QA:** `{"urls": ["https://your.app"], "device": "iPhone", "darkMode": true}`

**Invoice/report to PDF:** `{"urls": ["https://…/invoice/123"], "format": "pdf", "pdfFormat": "A4", "cookies": [{"name": "session", "value": "…"}]}`

**Element card for social embeds:** `{"urls": ["…"], "selector": "#pricing-table", "format": "webp"}`

### Pricing

Pay per event: a small fixed price **per successful screenshot**, plus standard
Apify platform usage for the browser time your run consumes. No subscription,
no startup fee, failed captures free. Stop or scale any time.

### Use it from code or automation

Run via the Apify API, scheduler, or any Apify SDK/client:

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

Works out of the box with Apify **Schedules** (recurring captures), **Webhooks**
(notify your systems when a batch finishes), **Zapier/Make/n8n** integrations,
and the **MCP server** for AI agents.

### FAQ

**Is this legal / responsible?** The actor renders public web pages you direct it
to — the same thing your browser does — and hides overlay elements cosmetically
before capture. It extracts and stores no page content or personal data. For
authenticated captures, only use credentials for accounts you own or are
authorized to use. You are responsible for the URLs you submit.

**Why did my capture come back different from my browser?** Some sites serve
different content to datacenter IPs. Enable Apify **residential proxy** in the
input for the most human-like rendering.

**A screenshot failed — was I charged?** No. Only successful captures are billed.

***

Something missing, or a site that renders badly? **Open an issue on the actor**
— fixes ship fast. If this actor saves you time, a ⭐ review helps others find it.

### More tools by Runlayer

Part of a suite of fast, no-nonsense web utilities — all pay-per-result, charged only on success, no startup fee:

- [Website Screenshot API](https://apify.com/runlayer/web-screenshot-pro) — full-page PNG / JPEG / WebP / PDF
- [Website to Markdown](https://apify.com/runlayer/website-to-markdown) — clean Markdown for LLMs & RAG
- [PDF & DOCX to Markdown](https://apify.com/runlayer/document-to-markdown) — documents → Markdown for RAG
- [SEO Audit + Core Web Vitals](https://apify.com/runlayer/website-seo-audit) — scored on-page audit with fixes
- [Website Performance Audit](https://apify.com/runlayer/website-performance-audit) — bulk Core Web Vitals & page speed
- [Tech Stack Detector](https://apify.com/runlayer/tech-stack-detector) — CMS, frameworks, analytics, hosting
- [Domain, DNS & WHOIS Lookup](https://apify.com/runlayer/domain-dns-intelligence) — records, registration, SSL
- [RSS Feed Reader](https://apify.com/runlayer/rss-feed-reader) — RSS / Atom / JSON → normalized JSON
- [Job Postings API](https://apify.com/runlayer/job-postings-scraper) — Greenhouse, Lever, Ashby & more

### Use with AI agents (MCP)

This Actor is callable by AI agents through the [Apify MCP server](https://mcp.apify.com/). Agents in Claude, Cursor, Windsurf, LangGraph, CrewAI and others can discover it via `search-actors` and run it as a tool — its inputs and outputs are fully described in the schema for reliable agent use.

# Actor input Schema

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

One or more public URLs. Each produces one image/PDF and one billable event. You may omit the https:// prefix.

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

png (lossless), jpeg or webp (smaller, use Quality), or pdf (full document).

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

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

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

Emulate a common device (viewport, pixel density, mobile/touch). Choose Custom to set your own width/height/scale below.

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

Browser width in pixels. Used only when Device preset = Custom.

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

Browser height in pixels. Used only when Device preset = Custom. Full-page captures grow past this to fit the page.

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

Device pixel ratio. 2 or 3 renders crisp @2x/@3x 'retina' images. Used only when Device preset = Custom.

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

Emulate prefers-color-scheme: dark so sites render their dark theme.

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

Hide the common GDPR/cookie/consent overlays that otherwise ruin ~40% of screenshots.

## `clickAcceptCookies` (type: `boolean`):

If a consent dialog exposes an Accept/Agree button, click it (dismisses banners that reappear after hiding).

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

Remove common ad slots and tracking iframes before capture.

## `hideStickyHeaders` (type: `boolean`):

On full-page shots, convert position:fixed/sticky elements so headers, nav bars and chat widgets appear once in place instead of floating over or repeating down the page. This is the classic full-page bug most tools don't solve.

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

Extra CSS selectors to hide before capture, e.g. '.newsletter-popup' or '#chat-widget'.

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

Capture a transparent background where the page has none (PNG/WebP only).

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

When to consider navigation done before capturing.

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

Wait until this element appears before capturing.

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

Fixed wait after the page settles, for late-rendering content or animations.

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

Screenshot only the element matching this selector instead of the page (ignores Full page).

## `fullPageMaxHeight` (type: `integer`):

Cap the height of full-page captures so pathologically long pages don't produce huge files. 0 = no cap.

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

Compression quality for JPEG/WebP. Higher = better & larger. Ignored for PNG/PDF.

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

Extra CSS applied before capture (e.g. hide elements, tweak layout).

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

JavaScript run in the page before capture (e.g. click a tab, dismiss a modal). Runs after load.

## `blockResources` (type: `array`):

Skip loading these resource types to speed up capture. Blocking 'image'/'media' changes appearance; 'font' rarely does.

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

Max time to wait for a page to load before capturing whatever has rendered.

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

Cookies to set before loading — capture logged-in/paywalled pages you have access to. Array of objects like \[{"name":"session","value":"abc"}]; domain defaults to each target URL. Only use cookies for accounts you own.

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

Extra request headers, e.g. {"Authorization":"Bearer …"}.

## `httpUsername` (type: `string`):

Username for HTTP Basic authentication (optional).

## `httpPassword` (type: `string`):

Password for HTTP Basic authentication. Stored encrypted.

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

Emulate a GPS position, e.g. {"latitude":48.85,"longitude":2.35}. Grants the page geolocation permission.

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

IANA timezone to emulate, e.g. America/New\_York or Europe/London.

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

Locale/language to emulate, e.g. en-US or de-DE (also sets Accept-Language).

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

Paper size for PDF output.

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

Render the PDF in landscape instead of portrait.

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

Rendering scale, 0.1–2 (1 = 100%).

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

Margin on all sides, e.g. 0, 1cm, 0.5in.

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

Include background colors/images in the PDF.

## `pageRanges` (type: `string`):

Restrict PDF to certain pages, e.g. 1-3.

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

Off by default (fast, works on most sites). Enable Apify Proxy — including residential — to capture bot-protected sites that block datacenter IPs.

## Actor input object example

```json
{
  "urls": [
    "https://example.com",
    "https://news.ycombinator.com"
  ],
  "format": "png",
  "fullPage": true,
  "device": "Desktop",
  "viewportWidth": 1280,
  "viewportHeight": 800,
  "deviceScaleFactor": 1,
  "darkMode": false,
  "blockCookieBanners": true,
  "clickAcceptCookies": false,
  "blockAds": true,
  "hideStickyHeaders": true,
  "hideSelectors": [],
  "omitBackground": false,
  "waitUntil": "load",
  "delayMs": 0,
  "fullPageMaxHeight": 0,
  "quality": 85,
  "blockResources": [],
  "timeoutMs": 45000,
  "pdfFormat": "A4",
  "pdfLandscape": false,
  "pdfScale": "1",
  "pdfMargin": "0",
  "pdfPrintBackground": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("runlayer/web-screenshot-pro").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://apify.com"] }

# Run the Actor and wait for it to finish
run = client.actor("runlayer/web-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": [
    "https://apify.com"
  ]
}' |
apify call runlayer/web-screenshot-pro --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Screenshot API — Full-Page PNG, JPEG, PDF, WebP",
        "description": "Screenshot any URL as PNG, JPEG, WebP or PDF. Full-page shots that work: sticky headers un-stuck, cookie banners and ads removed, lazy content settled. Device presets, dark mode, retina, authenticated pages, PDF controls, proxy. Charged only per successful screenshot — no startup fee.",
        "version": "0.2",
        "x-build-id": "DcfBeJ45Rgi2UO6su"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/runlayer~web-screenshot-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-runlayer-web-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/runlayer~web-screenshot-pro/runs": {
            "post": {
                "operationId": "runs-sync-runlayer-web-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/runlayer~web-screenshot-pro/run-sync": {
            "post": {
                "operationId": "run-sync-runlayer-web-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 to capture",
                        "type": "array",
                        "description": "One or more public URLs. Each produces one image/PDF and one billable event. You may omit the https:// prefix.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "format": {
                        "title": "Output format",
                        "enum": [
                            "png",
                            "jpeg",
                            "webp",
                            "pdf"
                        ],
                        "type": "string",
                        "description": "png (lossless), jpeg or webp (smaller, use Quality), or pdf (full document).",
                        "default": "png"
                    },
                    "fullPage": {
                        "title": "Full page",
                        "type": "boolean",
                        "description": "Capture the entire scrollable page instead of just the visible viewport.",
                        "default": true
                    },
                    "device": {
                        "title": "Device preset",
                        "enum": [
                            "Desktop",
                            "Desktop HD",
                            "iPhone",
                            "Android",
                            "iPad",
                            "Custom"
                        ],
                        "type": "string",
                        "description": "Emulate a common device (viewport, pixel density, mobile/touch). Choose Custom to set your own width/height/scale below.",
                        "default": "Desktop"
                    },
                    "viewportWidth": {
                        "title": "Viewport width (px)",
                        "minimum": 200,
                        "maximum": 3840,
                        "type": "integer",
                        "description": "Browser width in pixels. Used only when Device preset = Custom.",
                        "default": 1280
                    },
                    "viewportHeight": {
                        "title": "Viewport height (px)",
                        "minimum": 200,
                        "maximum": 4320,
                        "type": "integer",
                        "description": "Browser height in pixels. Used only when Device preset = Custom. Full-page captures grow past this to fit the page.",
                        "default": 800
                    },
                    "deviceScaleFactor": {
                        "title": "Pixel density / retina (1–3)",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "Device pixel ratio. 2 or 3 renders crisp @2x/@3x 'retina' images. Used only when Device preset = Custom.",
                        "default": 1
                    },
                    "darkMode": {
                        "title": "Dark mode",
                        "type": "boolean",
                        "description": "Emulate prefers-color-scheme: dark so sites render their dark theme.",
                        "default": false
                    },
                    "blockCookieBanners": {
                        "title": "Remove cookie / consent banners",
                        "type": "boolean",
                        "description": "Hide the common GDPR/cookie/consent overlays that otherwise ruin ~40% of screenshots.",
                        "default": true
                    },
                    "clickAcceptCookies": {
                        "title": "…or click 'Accept' instead of hiding",
                        "type": "boolean",
                        "description": "If a consent dialog exposes an Accept/Agree button, click it (dismisses banners that reappear after hiding).",
                        "default": false
                    },
                    "blockAds": {
                        "title": "Block ads & trackers",
                        "type": "boolean",
                        "description": "Remove common ad slots and tracking iframes before capture.",
                        "default": true
                    },
                    "hideStickyHeaders": {
                        "title": "Fix sticky/fixed headers on full-page (recommended)",
                        "type": "boolean",
                        "description": "On full-page shots, convert position:fixed/sticky elements so headers, nav bars and chat widgets appear once in place instead of floating over or repeating down the page. This is the classic full-page bug most tools don't solve.",
                        "default": true
                    },
                    "hideSelectors": {
                        "title": "Hide specific elements (CSS selectors)",
                        "type": "array",
                        "description": "Extra CSS selectors to hide before capture, e.g. '.newsletter-popup' or '#chat-widget'.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "omitBackground": {
                        "title": "Transparent background",
                        "type": "boolean",
                        "description": "Capture a transparent background where the page has none (PNG/WebP only).",
                        "default": false
                    },
                    "waitUntil": {
                        "title": "Wait until",
                        "enum": [
                            "load",
                            "domcontentloaded",
                            "networkidle"
                        ],
                        "type": "string",
                        "description": "When to consider navigation done before capturing.",
                        "default": "load"
                    },
                    "waitForSelector": {
                        "title": "Wait for element (CSS selector)",
                        "type": "string",
                        "description": "Wait until this element appears before capturing."
                    },
                    "delayMs": {
                        "title": "Extra delay after load (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Fixed wait after the page settles, for late-rendering content or animations.",
                        "default": 0
                    },
                    "selector": {
                        "title": "Capture a single element (CSS selector)",
                        "type": "string",
                        "description": "Screenshot only the element matching this selector instead of the page (ignores Full page)."
                    },
                    "fullPageMaxHeight": {
                        "title": "Max full-page height (px, 0 = unlimited)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Cap the height of full-page captures so pathologically long pages don't produce huge files. 0 = no cap.",
                        "default": 0
                    },
                    "quality": {
                        "title": "Image quality (1–100)",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Compression quality for JPEG/WebP. Higher = better & larger. Ignored for PNG/PDF.",
                        "default": 85
                    },
                    "customCss": {
                        "title": "Inject custom CSS",
                        "type": "string",
                        "description": "Extra CSS applied before capture (e.g. hide elements, tweak layout)."
                    },
                    "customJs": {
                        "title": "Inject custom JavaScript",
                        "type": "string",
                        "description": "JavaScript run in the page before capture (e.g. click a tab, dismiss a modal). Runs after load."
                    },
                    "blockResources": {
                        "title": "Block resource types (faster captures)",
                        "type": "array",
                        "description": "Skip loading these resource types to speed up capture. Blocking 'image'/'media' changes appearance; 'font' rarely does.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "image",
                                "font",
                                "media",
                                "stylesheet"
                            ],
                            "enumTitles": [
                                "Images",
                                "Fonts",
                                "Media (video/audio)",
                                "Stylesheets"
                            ]
                        },
                        "default": []
                    },
                    "timeoutMs": {
                        "title": "Navigation timeout (ms)",
                        "minimum": 5000,
                        "maximum": 120000,
                        "type": "integer",
                        "description": "Max time to wait for a page to load before capturing whatever has rendered.",
                        "default": 45000
                    },
                    "cookies": {
                        "title": "Cookies",
                        "type": "array",
                        "description": "Cookies to set before loading — capture logged-in/paywalled pages you have access to. Array of objects like [{\"name\":\"session\",\"value\":\"abc\"}]; domain defaults to each target URL. Only use cookies for accounts you own."
                    },
                    "headers": {
                        "title": "Custom HTTP headers",
                        "type": "object",
                        "description": "Extra request headers, e.g. {\"Authorization\":\"Bearer …\"}."
                    },
                    "httpUsername": {
                        "title": "HTTP Basic auth — username",
                        "type": "string",
                        "description": "Username for HTTP Basic authentication (optional)."
                    },
                    "httpPassword": {
                        "title": "HTTP Basic auth — password",
                        "type": "string",
                        "description": "Password for HTTP Basic authentication. Stored encrypted."
                    },
                    "geolocation": {
                        "title": "Geolocation",
                        "type": "object",
                        "description": "Emulate a GPS position, e.g. {\"latitude\":48.85,\"longitude\":2.35}. Grants the page geolocation permission."
                    },
                    "timezoneId": {
                        "title": "Timezone",
                        "type": "string",
                        "description": "IANA timezone to emulate, e.g. America/New_York or Europe/London."
                    },
                    "locale": {
                        "title": "Locale",
                        "type": "string",
                        "description": "Locale/language to emulate, e.g. en-US or de-DE (also sets Accept-Language)."
                    },
                    "pdfFormat": {
                        "title": "PDF page size",
                        "enum": [
                            "A3",
                            "A4",
                            "A5",
                            "Letter",
                            "Legal",
                            "Tabloid"
                        ],
                        "type": "string",
                        "description": "Paper size for PDF output.",
                        "default": "A4"
                    },
                    "pdfLandscape": {
                        "title": "PDF landscape orientation",
                        "type": "boolean",
                        "description": "Render the PDF in landscape instead of portrait.",
                        "default": false
                    },
                    "pdfScale": {
                        "title": "PDF scale",
                        "type": "string",
                        "description": "Rendering scale, 0.1–2 (1 = 100%).",
                        "default": "1"
                    },
                    "pdfMargin": {
                        "title": "PDF margin",
                        "type": "string",
                        "description": "Margin on all sides, e.g. 0, 1cm, 0.5in.",
                        "default": "0"
                    },
                    "pdfPrintBackground": {
                        "title": "PDF print background",
                        "type": "boolean",
                        "description": "Include background colors/images in the PDF.",
                        "default": true
                    },
                    "pageRanges": {
                        "title": "PDF page ranges",
                        "type": "string",
                        "description": "Restrict PDF to certain pages, e.g. 1-3."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy (improves reliability on protected sites)",
                        "type": "object",
                        "description": "Off by default (fast, works on most sites). Enable Apify Proxy — including residential — to capture bot-protected sites that block datacenter IPs.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
