# Bulk Website Screenshot & URL to PDF: Full Page, Mobile (`alpine-data/web-screenshot-pdf`) Actor

Bulk website screenshots and URL to PDF, no coding: paste URLs in the form, click Start, download the files. Full-page or viewport PNG/JPEG, desktop or mobile, cookie banners removed. $3.75 per 1,000 files.

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

## Pricing

from $3.00 / 1,000 screenshot or pdf files

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bulk Website Screenshot & URL to PDF: Full Page, Mobile

Take **bulk website screenshots** (full page, PNG or JPEG) and convert any **webpage to PDF**, for one URL or a thousand at once. Paste web addresses, click **Start**, and download the images and PDFs. Desktop or **mobile** layout. **Cookie banners and pop-ups are removed automatically**, so they don't cover the page. No login, no API key, no coding.

### How to use it (no code needed)

Everything is set in the input form. You don't need code, JSON or an API key.

1. **1. Which web pages? (URLs or domains)**: type or paste the addresses, one per line (or use **+ Add** / **Bulk edit**). `https://` is optional, so `apify.com` and `www.example.com/pricing` both work. The form already contains two working examples.
2. **Pick the options** in the form: **2. Image format** (PNG or JPEG), **3. Full-page screenshot** (on = whole page, off = visible area only), **4. Device** (Desktop or Mobile phone). Tick **Also save the page as PDF** under *PDF export (optional)* if you need PDFs. Everything else has sensible defaults.
3. Click **Start**. Most pages take 3–15 seconds. **Note: Start with the pre-filled example is a small paid run:** 2 screenshots × $0.005 = $0.01 (with *Also save the page as PDF*: 2 files per page = 2 × $0.005). **An empty input is not free either:** with no web address (empty form or `{}` via the API) the Actor takes a paid example screenshot of https://apify.com (~$0.005 = 1 screenshot event at the base price).
4. Open the **Output** tab: click a **Screenshot** or **PDF** link to download it, **Thumbnails** shows previews, and **Export** downloads the table as **Excel, CSV or JSON** with a download link for every file. Optional: click **Save as a new task** and then **Schedule** to capture the same pages every day or week.

If an input is wrong (for example no valid web address), the run stops with a plain-English message and **nothing is charged**.

### What you get: screenshots, webpage PDFs and a results table

![Bulk website screenshot example output: results table with screenshot and PDF per URL](https://api.apify.com/v2/key-value-stores/jVsR1fgZbtwc50gQM/records/web-screenshot-pdf-example-output)

| URL | Status | Page title | Screenshot | Width × height | Image size | HTTP | Cookie banner removed |
|---|---|---|---|---|---|---|---|
| https://apify.com/ | ok | Apify: Marketplace of ready-to-run tools for AI | apify-com-b2cbec-001.png | 1280 × 10052 | 918 KB | 200 | yes |
| https://www.wikipedia.org/ | ok | Wikipedia | wikipedia-org-72e64c-002.png | 1280 × 1103 | 245 KB | 200 | no banner |
| https://example.com/does-not-exist | failed | | | | | 404 | (free: "the site returned HTTP 404 (page not found)") |

*(Real rows from test runs on 23 Oct 2026, full page, desktop, PNG.)*

The files are saved in the run's **key-value store**. Each row has a download link (`screenshotUrl`, `pdfUrl`) that works without logging in. Rows also contain the final URL after redirects, the device, the format, the PDF size, the load time, `truncated` (true if a very long page was cut at *Max page height*; `fullPageHeight` then shows the real height) and an `errorMessage` that explains in plain words why a page failed.

> **Monitor how a page looks over time:** click **Schedule** to capture your homepage, a competitor's pricing page or a landing page every day or week. Send the results to Google Drive, Slack, email, Make, Zapier or n8n under *Integrations*.

### Use cases

- **Bulk website screenshots** for SEO audits, client reports, web-design portfolios and mockups.
- **Mobile screenshots** to check a responsive layout on a phone-sized screen.
- **URL to PDF converter**: archive articles, terms and conditions, price lists or documentation as searchable PDFs (A4 or US Letter).
- **Visual proof and archiving**: what a page showed on a given date (prices, legal notices; switch off *Block ads and trackers* to keep the ads).
- **AI agents and automations**: a website screenshot API for n8n, Make, Zapier or your own code. Send URLs, get image links back.
- **QA**: quick before/after screenshots of many pages after a release.

### Input fields in plain words

![Bulk website screenshot and URL to PDF input form: URLs, full page, mobile and format](https://api.apify.com/v2/key-value-stores/jVsR1fgZbtwc50gQM/records/web-screenshot-pdf-input-form)

The names below are exactly as they appear in the form. Sections marked *(optional)* are folded away; you only open them if you need them.

| Form field | What it does | Default / example |
|---|---|---|
| **1. Which web pages? (URLs or domains)** | Web addresses, one per line (commas work too). Duplicates are removed; invalid lines are skipped for free. | `apify.com`, `https://example.org/about` |
| **2. Image format** | PNG (sharp, lossless) or JPEG (smaller). | PNG |
| **3. Full-page screenshot** | On = the whole scrolling page. Off = only the visible screen area. | on |
| **4. Device** | Desktop (1280 px) or Mobile phone (412 px, mobile browser, touch). | Desktop |
| *PDF export (optional):* **Also save the page as PDF** | Adds a searchable PDF per page. | off |
| *PDF export:* **PDF paper size** / **PDF look** | A4 or US Letter. "As printed" uses the site's print layout; "As on screen" looks like the website. | A4, as printed |
| *PDF export:* **Save the screenshot image** | Switch off to get PDFs only. | on |
| *Page loading and clean-up (optional):* **Remove cookie banners and consent pop-ups** | Accepts common consent tools and hides cookie overlays. | on |
| *Page loading and clean-up:* **Close pop-ups and overlays** | Closes or hides big newsletter, paywall-teaser and ad pop-ups. | on |
| *Page loading and clean-up:* **Block ads and trackers** | Blocks ad networks and tracking scripts, so pages load faster and look cleaner. Switch off to capture the ads too. | on |
| *Page loading and clean-up:* **Wait until** | Network idle (recommended), page loaded, or HTML ready. | Network idle |
| *Page loading and clean-up:* **Extra delay before the screenshot (seconds)** | Extra seconds before the shot, e.g. for animations. | 1 |
| *Page loading and clean-up:* **Hide these elements (CSS selectors)** | One selector per line, e.g. chat widgets. | `#chat-widget` |
| *Advanced (optional):* **Custom viewport width (px)** / **Custom viewport height (px)** | Custom size in pixels (0 = device default). | 0 (e.g. 1920) |
| *Advanced:* **JPEG quality (1-100)**, **High resolution (2x, retina)** | Image quality and retina-sharp pixels. | 80, off |
| *Advanced:* **Scroll down first to load lazy images** | Loads lazy images before the shot. | on |
| *Advanced:* **Max page height (px)** | Full-page shots are cut at this height. | 15,000 (max 20,000) |
| *Advanced:* **Timeout per page (seconds)**, **Capture error pages (404, 403, 500...)**, **Accept invalid HTTPS certificates**, **Pages in parallel** | Per-page timeout, whether to capture error pages (off = free), whether pages with a bad certificate are captured, parallel pages. | 30, off, on, 3 |

### Pricing

You pay only for files that were saved (pay per event). There is no monthly fee and no start fee.

| What | Price | Per 1,000 |
|---|---|---|
| One saved file (one screenshot image **or** one PDF) | $0.005 | **$5.00 per 1,000 files** |

- **Screenshot only:** 1 URL = 1 file = $0.005.
- **Screenshot + PDF:** 1 URL = 2 files = $0.01.
- **PDF only:** 1 URL = 1 file = $0.005.

**Example:** 1,000 screenshots = **$5.00**. 500 pages as full-page PNG plus PDF = 1,000 files = **$5.00**. The pre-filled example (2 pages, screenshots only) costs **$0.01**. An empty input runs 1 example screenshot (~$0.005).

**Volume discount by Apify plan:** Free and Starter plans pay $0.005 per file. On the **Scale** plan the price is **$0.0045** (−10 %), on **Business** and higher **$0.004** (−20 %), so 1,000 files cost $4.50 or $4.00. Apify applies the discount automatically.

**One price, even for very long pages:** full-page screenshots are capped at *Max page height* (default 15,000 px), so an endless news homepage costs the same $0.005 as a short page. The row then says `truncated: true`.

**Free:** invalid inputs, unreachable or non-existent sites, pages that time out before showing anything, and pages that return an HTTP error (404, 403, 500…) unless you switch on *Capture error pages*. To cap your cost, set *Max charge per run* in the run options. The Actor then stops cleanly when the limit is reached.

Platform usage (browser time) is included in the per-file price. The default memory is 1 GB, which handles 1 page at a time; with 2 GB or more, several pages run in parallel (about 600 MB each). A page that crashes the browser is retried once on its own.

### FAQ and common mistakes

**How do I take a full page screenshot of a website?** Leave *Full-page screenshot* on (the default). The Actor scrolls through the page once so that lazy-loaded images appear, then captures everything from top to bottom, up to 15,000 px (about 15 screen heights). Longer and endless-scroll pages, such as news homepages or long Wikipedia lists, are cut there: the row says `truncated: true`, `fullPageHeight` shows the real page height and the note explains the cut. You can change this under *Max page height* (500 to 20,000 px). The price per file stays the same.

**Why is my screenshot cut off at the bottom?** The page is taller than *Max page height* (default 15,000 px). Raise it up to 20,000 px, or capture the page as PDF instead (PDFs are not cut).

**How do I take a website screenshot on mobile?** Set *Device* to *Mobile phone*. The page is loaded at 412 px width with a mobile browser user agent and touch support, so you get the site's real mobile layout. For tablet or Full-HD sizes, set a custom viewport width (768 or 1920).

**How do I convert a URL to PDF, or many web pages to PDF at once?** Switch on *Also save the page as PDF*, choose A4 or US Letter, and paste as many URLs as you like (up to 1,000 per run). The text in the PDFs stays selectable and searchable. Switch off *Save the screenshot image* if you only need PDFs.

**Why is there still a cookie banner, a pop-up or a login wall on my screenshot?** Removal is best effort. It covers the common consent tools (OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast, TrustArc, Sourcepoint, consentmanager, Complianz, CookieYes, iubenda, Borlabs and others) plus buttons labelled "Accept all", "Alle akzeptieren", "Tout accepter" and similar. Unusual banners may stay. Add their CSS selector under *Hide these elements*. Paywalls and logins are not bypassed.

**A page failed with HTTP 403 or "blocked". Why?** Some sites block automated browsers (anti-bot protection). We do not try to get around this. These pages are free and listed in the status message.

**Where are my files, and how long are they kept?** In the run's key-value store (Output tab → *Files*, or the links in the table). Apify keeps run storage according to your plan's data retention (usually 7+ days). Download the files or send them to Google Drive or S3 with an integration.

**Is this a website screenshot API?** Yes. Start it via the Apify API, the n8n/Make/Zapier integrations, or as an MCP tool for AI agents. You get JSON with links to the images.

**Webseite als PDF speichern / Screenshot der ganzen Webseite erstellen?** Ja. Paste the addresses, switch on *Also save the page as PDF* (A4) and leave *Full-page screenshot* on. It works for German, Austrian and Swiss sites; cookie banners are clicked away automatically.

### Limits

- Up to 1,000 URLs per run. Each page has a 30-second loading timeout (adjustable up to 180 s); after it, the Actor captures what is shown.
- The total time per page grows with your settings (loading timeout, extra wait, scrolling, screenshot and PDF); a page that is stuck beyond that is reported as failed (not charged) and only that page is closed.
- HTTPS pages are loaded only on port 443 or on a port written in your URL (for example `https://example.com:8443/`).
- Public pages only: no logins, no paywalls, no CAPTCHAs, no proxy rotation. Sites with strong anti-bot protection may return 403 (free).
- Private and internal network addresses (localhost, 10.x, 172.16–31.x, 192.168.x, cloud metadata such as 169.254.169.254) are blocked, including via redirects, embedded images/frames, scripts, pop-ups and WebSockets. Every host name is looked up and checked when the browser connects (all of its addresses must be public), and the connection goes to exactly the checked address, so DNS tricks cannot switch to an internal address later. A page that leads there fails with *not a public website* and is not charged.
- Full-page screenshots are cut at *Max page height* (default 15,000 px, max 20,000 px); cut rows say `truncated: true`. Pages taller than 20,000 px cannot be captured in full as one image. Ads and trackers are blocked by default. Very heavy pages (huge images, WebGL) can exceed memory; use viewport-only or more memory.
- Videos, canvas animations and some web fonts may look different from your own browser. Cookie and pop-up removal is best effort.
- Each run starts with a fresh browser, so pages show the "first visit" version (no saved logins or preferences).

### Data source and legal notes

This Actor opens **public web pages** in a normal headless Chrome browser, as a visitor would, and saves what is shown. It does not log in, does not bypass paywalls, CAPTCHAs or bot protection, and blocks private network addresses. The files are stored only in **your own** Apify run storage. Only capture pages you are allowed to capture, respect the websites' terms of use and copyright, and do not use it to collect personal data. Screenshots of third-party pages are for your own documentation, analysis or archiving. All trademarks and website names belong to their owners; Alpine Data Labs is not affiliated with them.

### Support

Is something not working, or a cookie banner not removed? Open an **Issue** on the Actor page (Issues tab) and include the URL. We usually respond within one working day. Built by **Alpine Data Labs**.

### For developers: API, webhooks, Make/Zapier/n8n

You don't need this section to use the Actor. **The form and the API take the same input:** every form field has a JSON name (for example `urls` = *1. Which web pages?*, `format` = *2. Image format*, `fullPage`, `device`, `savePdf`, `maxPageHeight`), and a JSON input sent via the API, a webhook, a schedule, a saved task or Make/Zapier/n8n gives exactly the same result as the form. Field names, output fields and file names stay stable, so existing workflows and websites that call the Actor keep working.

**Minimal input:**

```json
{"urls": ["apify.com"]}
```

**cURL** (start a run and get the results in one call; replace `<YOUR_APIFY_TOKEN>` with your token from Apify Console → Settings → API & Integrations):

```bash
curl -X POST "https://api.apify.com/v2/acts/alpine-data~web-screenshot-pdf/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["apify.com"]}'
```

**JavaScript** (`npm install apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('alpine-data/web-screenshot-pdf').call({"urls": ["apify.com"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("alpine-data/web-screenshot-pdf").call(run_input={"urls": ["apify.com"]})
print(client.dataset(run["defaultDatasetId"]).list_items().items)
```

**Integrations:** *Schedules* run a saved task automatically (e.g. every morning). *Webhooks* (Integrations tab → "Run succeeded") send the finished run to your own URL. Ready-made **Make, Zapier and n8n** modules start the Actor and read its results. AI agents can use it as a tool through the **Apify MCP server** (mcp.apify.com).

#### Full example input (all main options)

```json
{
  "urls": ["apify.com", "https://www.wikipedia.org", "example.com/pricing"],
  "format": "jpeg",
  "jpegQuality": 80,
  "fullPage": true,
  "device": "mobile",
  "savePdf": true,
  "pdfFormat": "A4",
  "dismissCookieBanners": true,
  "hideSelectors": ["#chat-widget"]
}
```

#### Example output (one row, JSON)

```json
{
  "url": "https://www.wikipedia.org/",
  "finalUrl": "https://www.wikipedia.org/",
  "title": "Wikipedia",
  "status": "ok",
  "httpStatus": 200,
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/wikipedia-org-72e64c-002.png?<access-signature>",
  "pdfUrl": null,
  "format": "png",
  "device": "desktop",
  "width": 1280,
  "height": 1103,
  "truncated": false,
  "fullPageHeight": 1103,
  "fileSizeBytes": 244555,
  "cookieBannerHandled": false,
  "filesCharged": 1,
  "errorMessage": null,
  "capturedAt": "2026-10-23T02:31:12Z"
}
```

# Actor input Schema

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

One address per line (commas also work). https:// is optional: apify.com, www.example.com/pricing and https://example.org all work. Duplicates are removed, invalid lines are skipped for free. Public pages only (no logins). Up to 1,000 URLs per run. If you leave this empty, a paid example screenshot of https://apify.com is taken (~$0.005).

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

PNG = sharp, lossless (best for text and UI). JPEG = smaller files (best for photo-heavy pages and large batches).

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

On = the whole page from top to bottom (scrolling screenshot). Off = only the visible screen area (viewport, 'above the fold').

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

Desktop = 1280 px wide laptop browser. Mobile = 412 px wide smartphone (Android Chrome) with a mobile user agent and touch, so you get the site's mobile layout.

## `savePdf` (type: `boolean`):

Creates a searchable PDF of each page (text stays selectable). Counts as a second file per URL.

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

A4 (Europe/most of the world) or US Letter.

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

As printed = like the browser's 'Save as PDF' (uses the site's print layout, often cleaner). As on screen = looks like the website on screen.

## `saveScreenshot` (type: `boolean`):

Switch off to get only PDFs (URL to PDF converter mode).

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

Clicks 'Accept' on common consent tools (OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast and others) and hides remaining cookie overlays, so they don't cover the page. Best effort: unusual banners may stay.

## `closePopups` (type: `boolean`):

Closes or hides big pop-ups that cover the page (newsletter sign-ups, subscription teasers, full-screen ads), using their close button where possible. Switch off if you want the page exactly as a first-time visitor sees it.

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

Blocks ad networks and tracking scripts (Google Ads, Taboola, Criteo, analytics...). Pages load faster and screenshots are cleaner. Switch off if you need the page with its ads, e.g. to document ad placements.

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

When to take the picture. 'Network idle' waits until the page stopped loading data (max 10 s extra), best for modern sites. 'Page loaded' is faster. 'HTML ready' is fastest but images may be missing.

## `delaySeconds` (type: `number`):

Waits this long after loading, e.g. for animations, sliders or charts. 0 to 30 seconds.

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

Optional. One CSS selector per line, e.g. #chat-widget, .newsletter-popup, header. Matching elements are hidden before the screenshot.

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

0 = device default (1280 desktop, 412 mobile). For example 1920 for a Full-HD screen or 768 for a tablet.

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

0 = device default (800 desktop, 915 mobile). Only changes the picture size when 'Full-page screenshot' is off.

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

Only used for JPEG. 80 is a good balance of quality and size; 100 = best quality, largest files.

## `retina` (type: `boolean`):

Doubles the pixel density for crisp images on retina screens. Files get about 3-4x bigger.

## `scrollToLoadImages` (type: `boolean`):

For full-page screenshots: scrolls through the page once so that images loaded on scroll appear.

## `maxPageHeight` (type: `integer`):

Height cap for full-page screenshots. Taller pages are cut at this height (default 15,000 px, about 15 screen heights); the row then says truncated: true and the note gives the real page height. Keeps very long or endless-scroll pages (news homepages, long lists) fast, the file size reasonable and the price per file fixed. Maximum 20,000 px.

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

Stop waiting for a page to finish loading after this many seconds (default 30) and capture what is shown. Pages that show nothing in time are free.

## `captureErrorPages` (type: `boolean`):

Off = pages that return an HTTP error are reported as failed and not charged. On = capture them anyway (charged), e.g. to document a broken page.

## `ignoreHttpsErrors` (type: `boolean`):

On = pages with an expired or self-signed certificate are still captured (as before). Off = such pages fail with a certificate error and are not charged.

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

How many pages are opened at the same time. More is faster but needs more memory (about 600 MB per page; it is reduced automatically to fit).

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://www.wikipedia.org"
  ],
  "format": "png",
  "fullPage": true,
  "device": "desktop",
  "savePdf": false,
  "pdfFormat": "A4",
  "pdfMedia": "print",
  "saveScreenshot": true,
  "dismissCookieBanners": true,
  "closePopups": true,
  "blockAds": true,
  "waitUntil": "networkidle",
  "delaySeconds": 1,
  "hideSelectors": [],
  "viewportWidth": 0,
  "viewportHeight": 0,
  "jpegQuality": 80,
  "retina": false,
  "scrollToLoadImages": true,
  "maxPageHeight": 15000,
  "timeoutSeconds": 30,
  "captureErrorPages": false,
  "ignoreHttpsErrors": true,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

One row per URL: status, page title, screenshot link, PDF link, size and any error.

## `gallery` (type: `string`):

Preview images of every captured page.

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

All saved PNG/JPEG/PDF files.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "urls": [
        "https://apify.com",
        "https://www.wikipedia.org"
    ],
    "format": "png",
    "fullPage": true,
    "device": "desktop",
    "savePdf": false,
    "pdfFormat": "A4",
    "pdfMedia": "print",
    "saveScreenshot": true,
    "dismissCookieBanners": true,
    "closePopups": true,
    "blockAds": true,
    "waitUntil": "networkidle",
    "delaySeconds": 1,
    "hideSelectors": [],
    "viewportWidth": 0,
    "viewportHeight": 0,
    "jpegQuality": 80,
    "retina": false,
    "scrollToLoadImages": true,
    "maxPageHeight": 15000,
    "timeoutSeconds": 30,
    "captureErrorPages": false,
    "maxConcurrency": 3
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "urls": [
        "https://apify.com",
        "https://www.wikipedia.org",
    ],
    "format": "png",
    "fullPage": True,
    "device": "desktop",
    "savePdf": False,
    "pdfFormat": "A4",
    "pdfMedia": "print",
    "saveScreenshot": True,
    "dismissCookieBanners": True,
    "closePopups": True,
    "blockAds": True,
    "waitUntil": "networkidle",
    "delaySeconds": 1,
    "hideSelectors": [],
    "viewportWidth": 0,
    "viewportHeight": 0,
    "jpegQuality": 80,
    "retina": False,
    "scrollToLoadImages": True,
    "maxPageHeight": 15000,
    "timeoutSeconds": 30,
    "captureErrorPages": False,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("alpine-data/web-screenshot-pdf").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://apify.com",
    "https://www.wikipedia.org"
  ],
  "format": "png",
  "fullPage": true,
  "device": "desktop",
  "savePdf": false,
  "pdfFormat": "A4",
  "pdfMedia": "print",
  "saveScreenshot": true,
  "dismissCookieBanners": true,
  "closePopups": true,
  "blockAds": true,
  "waitUntil": "networkidle",
  "delaySeconds": 1,
  "hideSelectors": [],
  "viewportWidth": 0,
  "viewportHeight": 0,
  "jpegQuality": 80,
  "retina": false,
  "scrollToLoadImages": true,
  "maxPageHeight": 15000,
  "timeoutSeconds": 30,
  "captureErrorPages": false,
  "maxConcurrency": 3
}' |
apify call alpine-data/web-screenshot-pdf --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alpine-data/web-screenshot-pdf"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eT3dxTh5XRP16hPpx/builds/5M2fgiPH5HDlNLXsZ/openapi.json
