# Website Screenshot & HTML to Image (PNG, JPEG, PDF) (`adaptive_arbor_rtz/website-screenshot`) Actor

Capture full-page website screenshots or PDFs for desktop, tablet or mobile, or render your own HTML to PNG, JPEG or PDF. Cookie banners, popups and ads are removed automatically. Pay only for successful screenshots.

- **URL**: https://apify.com/adaptive\_arbor\_rtz/website-screenshot.md
- **Developed by:** [Björn Ólafur](https://apify.com/adaptive_arbor_rtz) (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 $5.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/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

### What does Website Screenshot do?

**Website Screenshot** captures **full-page screenshots or PDFs of any website** from a list of URLs, **with cookie banners, popups and ads removed automatically**. Choose **desktop, laptop, tablet or mobile**, get a **public image link for every URL**, and **pay only for screenshots that succeed**.

Run it in Apify Console, call it from the API, schedule it, or let your AI agent use it through the Apify MCP server. Connect it to Make, Zapier, n8n, Google Drive or Slack with Apify integrations.

### Why use Website Screenshot?

- 🍪 **Clean screenshots**: cookie-consent dialogs (OneTrust, Cookiebot, Didomi, Usercentrics, Sourcepoint and hundreds more), newsletter popups and chat widgets are **hidden, never accepted**.
- 📱 **Real device emulation**: desktop 1920×1080, laptop 1366×768, iPad and iPhone 14 with a real mobile user agent, touch and retina pixel density.
- 📄 **JPEG, PNG or PDF**: full page, visible screen only, or just one element (e.g. `#pricing`).
- 🧾 **HTML to image or PDF**: paste raw HTML (invoices, social cards, email templates, certificates) and get a PNG, JPEG or PDF back.
- 🔗 **Ready-to-use links**: every result has a public `screenshotUrl`, the page title, HTTP status and final URL, perfect for AI agents, automations and reports.
- 💸 **Fair pricing**: you pay per successful screenshot. Timeouts, dead links and blocked pages are free.
- ⚡ **Fast and cheap**: ads and trackers are blocked, so pages load faster.

**Typical uses:** competitor and landing-page monitoring, visual regression checks and QA, website thumbnails for directories and CRMs, archiving pages as proof (ads, prices, terms), client reports for agencies, and giving AI agents "eyes" on a web page.

### How to take website screenshots

1. Click **Try for free**.
2. Paste your URLs into **URLs**, one per line.
3. Pick a **Device** and **Output format** (JPEG is the default).
4. Click **Start**. Screenshots appear in the **Output** tab within seconds.
5. Download the list as JSON, CSV or Excel, or open each `screenshotUrl`.

### Input

Give **URLs**, **HTML**, or both. See the **Input** tab for all options:

| Option                             | What it does                               | Default      |
| ---------------------------------- | ------------------------------------------ | ------------ |
| `urls`                             | Pages to capture                           | –            |
| `html`                             | Raw HTML to render as an image or PDF      | –            |
| `device`                           | `desktop`, `laptop`, `tablet`, `mobile`    | `desktop`    |
| `fullPage`                         | Whole scrollable page vs. visible screen   | `true`       |
| `format`                           | `jpeg`, `png`, `pdf`                       | `jpeg`       |
| `hideCookieBanners`                | Hide consent dialogs, popups, chat widgets | `true`       |
| `blockAds`                         | Block ads and trackers                     | `true`       |
| `selector`                         | Capture only one element (CSS selector)    | –            |
| `hideSelectors`                    | Extra elements to hide                     | –            |
| `darkMode`                         | Request the site's dark theme              | `false`      |
| `waitUntil` / `delaySecs`          | When to capture                            | `load` / 1 s |
| `viewportWidth` / `viewportHeight` | Custom screen size                         | device size  |
| `maxHeight`                        | Cut very long pages at this height         | 10000 px     |

```json
{
    "urls": ["https://apify.com", "bbc.com"],
    "device": "mobile",
    "fullPage": true,
    "format": "jpeg"
}
```

#### HTML to image

To turn your own HTML into a PNG, JPEG or PDF, put it in `html` (you can leave `urls` empty). Set the size with `viewportWidth`/`viewportHeight`, or capture one element with `selector`. Linked images, fonts and stylesheets are loaded. The result's `url` is `html-1`.

```json
{
    "html": "<div style='width:1200px;height:630px;background:#111;color:#fff;font:64px sans-serif;display:flex;align-items:center;justify-content:center'>Hello world</div>",
    "format": "png",
    "fullPage": false,
    "viewportWidth": 1200,
    "viewportHeight": 630
}
```

### Output

One item per URL:

```json
{
    "url": "https://www.bbc.com/",
    "success": true,
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/screenshot-0001-www-bbc-com.jpg",
    "format": "jpeg",
    "device": "mobile",
    "fullPage": true,
    "statusCode": 200,
    "finalUrl": "https://www.bbc.com/",
    "title": "BBC Home - Breaking News, World News, US News, Sports, Business",
    "fileSizeBytes": 245890,
    "keyValueStoreKey": "screenshot-0001-www-bbc-com.jpg",
    "capturedAt": "2026-09-30T00:10:00.000Z",
    "error": null
}
```

Failed URLs are listed too, with `success: false` and the reason in `error`, and are not charged. You can download the dataset in various formats such as JSON, HTML, CSV or Excel. The image files are in the run's key-value store.

### How much does it cost to screenshot a website?

**$5 per 1,000 screenshots** ($0.005 each), whatever the device or format, plus a start fee of **$0.003 per GB of memory per run** ($0.006 with the default 2 GB). Failed pages are free. Platform usage is included in the price. With Apify's free plan you can try it on a few hundred pages a month at no cost.

Example: 100 full-page screenshots in one run cost $0.506.

You can set a **maximum cost per run** in the run options; the Actor stops cleanly when it is reached.

### Tips

- Use **JPEG** unless you need pixel-perfect PNG; files are 5–10× smaller.
- Use **`networkidle`** for single-page apps that load content late, and `domcontentloaded` for the fastest runs.
- If a site blocks data-centre traffic or shows the wrong country, enable **Proxy** (residential proxies for the toughest sites).
- Screenshot a specific part of a page with **Only this element**, e.g. `main`, `#pricing` or `.product-card`.
- Schedule the Actor daily to build a visual history of competitor pages.

### FAQ

**Are cookie banners accepted?** No. They are hidden with filter lists and CSS, so no consent is given on your behalf.

**Does it work on pages behind a login?** No, it captures public pages only.

**Is taking screenshots of websites legal?** Capturing publicly available pages is generally fine, but you are responsible for how you use them, including copyright and each site's terms.

**Something not working?** Open an issue in the **Issues** tab with the URL and I'll fix it quickly. Custom versions are available on request.

### Related tools

- [Document to Markdown](https://apify.com/adaptive_arbor_rtz/document-to-markdown): PDF, Word, Excel and PowerPoint files to clean Markdown for AI
- [Sitemap Extractor](https://apify.com/adaptive_arbor_rtz/sitemap-extractor): every URL of a website from its sitemaps, plus a broken-link check
- [RSS Feed Reader](https://apify.com/adaptive_arbor_rtz/rss-feed-reader): read and monitor any RSS/Atom feed, only new items, full article text

# Actor input Schema

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

Web page addresses to capture, one per line (e.g. https://example.com). Each URL produces one screenshot or PDF. Addresses without http:// or https:// get https:// added.

## `html` (type: `string`):

Optional. Raw HTML to turn into an image or PDF instead of (or as well as) a URL, e.g. an invoice, social card or email template. Images, fonts and CSS linked from it are loaded.

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

Which screen to emulate. desktop = 1920×1080, laptop = 1366×768, tablet = iPad (touch, tablet user agent), mobile = iPhone 14 (touch, mobile user agent, 3× pixel density).

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

Capture the whole scrollable page instead of only the visible screen. Very long pages are cut at 'Maximum height'.

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

jpeg = small image files (recommended, fast to download), png = lossless image (larger files), pdf = printable A4 document of the page (ignores Device size and Only this element).

## `hideCookieBanners` (type: `boolean`):

Hide cookie-consent dialogs, newsletter popups and chat widgets so the page itself is visible. They are hidden, never accepted.

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

Block ads and tracking scripts. Gives cleaner screenshots and faster, cheaper runs.

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

Optional. Capture only the first element matching this CSS selector, e.g. 'main' or '#pricing'. If nothing matches, the URL is reported as failed and not charged.

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

Optional CSS selectors of elements to hide before capturing, e.g. '.sticky-header' or '#promo-bar'.

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

Ask the site for its dark colour scheme (prefers-color-scheme: dark). Only works on sites that support it.

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

When the page counts as loaded. load = all resources loaded (recommended), domcontentloaded = HTML ready (fastest), networkidle = no network activity for 0.5 s (slowest, best for heavy JavaScript apps).

## `delaySecs` (type: `integer`):

Extra seconds to wait after the page loads, for animations or late content.

## `scrollToLoadLazyContent` (type: `boolean`):

Scroll through the page before capturing so lazy-loaded images appear in full-page screenshots.

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

Optional. Overrides the device width.

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

Optional. Overrides the device height (the visible area when 'Full page' is off).

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

Quality 1–100 when the output format is jpeg.

## `maxHeight` (type: `integer`):

Full-page screenshots taller than this are cut at this height.

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

Give up on a page that has not loaded after this many seconds. Failed pages are not charged.

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

How many pages to capture at the same time.

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

Optional. Use a proxy for sites that block data-centre traffic or show a different country's version.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://www.wikipedia.org"
  ],
  "device": "desktop",
  "fullPage": true,
  "format": "jpeg",
  "hideCookieBanners": true,
  "blockAds": true,
  "darkMode": false,
  "waitUntil": "load",
  "delaySecs": 1,
  "scrollToLoadLazyContent": true,
  "jpegQuality": 80,
  "maxHeight": 10000,
  "timeoutSecs": 60,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

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

No description

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("adaptive_arbor_rtz/website-screenshot").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",
    ] }

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

```

## MCP server setup

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

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/7JnzVkg90nKbB3UbH/builds/aIr3uL3F8lk5dsmSj/openapi.json
