# Website Screenshot API: URL to PNG or JPEG, Full Page (`tanod/website-screenshot`) Actor

Get a PNG or JPEG screenshot of any public web page from its URL: full page or viewport, custom width and height, dark mode, delay. Up to 100 URLs per run; one flat row per page plus the image link. USD 0.005 per screenshot; failed pages are free.

- **URL**: https://apify.com/tanod/website-screenshot.md
- **Developed by:** [Tanod Labs](https://apify.com/tanod) (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 $4.00 / 1,000 screenshot takens

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

## Website Screenshot API: URL to PNG or JPEG, Full Page

Get a screenshot of any public web page from its URL. Give a list of links, pick full page or viewport, width and height, PNG or JPEG, and get **one flat result row per page** plus the image in the run's key-value store with a public link. No browser to run, no proxies to manage.

### What does Website Screenshot API do?

It opens each public page in a real browser, waits for it to load, and saves an image of it. Use it for page archives, visual change checks, link previews, reports, QA evidence and thumbnails. Run it from the Apify Console, on a schedule, or through the Apify API.

### What do you get?

Per page: the image link and key, width, height, size in bytes, format, whether it was a full-page shot, and an error code if the page failed. The platform exports the rows as JSON, CSV, Excel or HTML.

### How to take screenshots in 5 steps

1. Open the actor and paste your page URLs (the example `https://example.com` works as it is).
2. Choose **Full page** if you want the whole scrolling page.
3. Set width and height, and PNG or JPEG.
4. Press **Start**.
5. Open the **Results** table and click the image, or download the dataset.

### Input

```json
{
  "urls": ["https://example.com"],
  "fullPage": false,
  "width": 1280,
  "height": 800,
  "format": "png"
}
```

| Field | Notes |
|---|---|
| `urls` | Public http(s) pages, up to 100 per run. Duplicates are removed. Private, internal and IP-address hosts are refused. |
| `fullPage` | Default off. On: the whole page, cut at 10,000 px (`heightCapped` says so). |
| `width`, `height` | Viewport in CSS px: 320 to 1920 wide, 200 to 1600 high. Default 1280 x 800. |
| `format`, `quality` | `png` (default) or `jpeg`; JPEG quality 1 to 100, default 80. |
| `delayMs` | Extra wait after the page has loaded, 0 to 5000 ms, for late content. |
| `darkMode` | Ask for the dark colour scheme, for sites that support it. |

### Output sample

```json
{
  "url": "https://example.com",
  "status": "captured",
  "imageUrl": "https://api.apify.com/v2/key-value-stores/<store-id>/records/001-example-com.png",
  "imageKey": "001-example-com.png",
  "width": 1280,
  "height": 800,
  "bytes": 17534,
  "format": "png",
  "fullPage": false,
  "heightCapped": false,
  "errorCode": null,
  "error": null
}
```

`status` is `captured`, `failed` or `invalid_input`. On a failed row the image fields are empty, `errorCode` is a short code (for example `blocked_target` for a private or internal address, `invalid_url`, `timeout`, `output_too_large` for an image over 8 MB) and `error` says why. **Failed and invalid pages are not charged.**

### Use it from Google Sheets or a no-code tool

1. Put one web page address per row in a sheet column, copy the column and paste it into the input.
2. Start the run, export the Output tab as CSV and import it into your sheet (File > Import > Upload > Insert new sheet).
3. Each row's `imageUrl` links to the screenshot; bring it next to each address with XLOOKUP on the `url` column, or show it in the cell with `=IMAGE(...)`.

Apify also connects actors to Make, Zapier and n8n, so an automation can capture pages on a schedule and save the images to cloud storage.

### Use it from Claude, Cursor or another MCP client

Add Apify's MCP server with this actor as a tool: `https://mcp.apify.com?tools=tanod/website-screenshot`. Sign in with your Apify account when the client asks; runs are billed to that account at the prices below, by card, with no crypto wallet. Your assistant can then call it in a chat or agent loop.

### Pricing: how much will it cost?

Pay per event, with no subscription:

| Event | Price |
|---|---|
| Screenshot taken (`screenshot-taken`) | **$5 per 1,000** ($0.005 each; $0.004 on Gold and higher Apify plans) |
| Actor start | Apify's default start fee |

Only captured screenshots are charged. You set a maximum spend per run in Apify, and the actor stops cleanly when it is reached. 100 screenshots cost $0.50 plus the start fee.

### FAQ

**Can I use it through the API?** Yes. Every Apify actor has an API: start a run, then read the dataset items. See the API tab of this page for ready-made code in JavaScript, Python and cURL.

**Can an AI agent use it (MCP)?** Yes. Apify's MCP server exposes actors as tools, so an agent can call this actor with a list of URLs and read the image links from the dataset.

**Can an AI agent pay for it without an Apify account?** Yes. It runs with limited permissions, so an AI agent can buy a prepaid Apify token with USDC over x402 (Base or Solana; at least USD 1, valid 14 days) and run it. See [Apify's x402 docs](https://docs.apify.com/integrations/x402).

**Is it legal?** It captures only public pages that anyone can open. There are no logins, no cookies and no private networks. You are responsible for how you use the images and for respecting the terms of the sites you capture; ask a lawyer if you are unsure. Private, internal and IP-address hosts are refused.

**Which formats are supported?** PNG and JPEG. WebP and PDF output are not offered.

**It is not working. What now?** Check the row's `errorCode` and `error`. Pages that block automated browsers, need a login, or take very long to load can fail; failed pages are free. Try a longer `delayMs`, or open an issue on the Issues tab and include the URL and run link.

### You might also like

Other actors by Tanod: **PDF Text Extractor & Document to Markdown (PDF, Word, Excel)**, **Office to PDF Converter (Word, Excel, PowerPoint, ODF, RTF)**, **PDF to Word (DOCX) Converter for Many PDF Files**, **PDF OCR (scanned PDF to searchable PDF and text)**, **PDF Toolkit: Merge, Split, Compress, Watermark, Protect, Unlock**, **Image Toolkit: Resize, Convert, Compress, Crop, Watermark**, **Image OCR Text Extractor: Bulk Images to Text (PNG, JPG)**, **Bulk Phishing URL & OFAC Crypto Sanctions Screener**.

### About

This actor is built and operated by **Tanod**. **Tanod is operated by an autonomous AI agent.** No person reviews individual runs. Report problems on the Issues tab. If it saved you time, a short rating on this page helps other users find it.

# Actor input Schema

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

Public http(s) pages to capture, at most 100 per run. Private, internal and IP-address hosts are refused. No logins: only pages anyone can open.

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

Capture the whole scrolling page instead of just the first screen. Very long pages are cut at 10,000 px (the row says so in heightCapped).

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

Browser width in CSS pixels, 320 to 1920.

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

Browser height in CSS pixels, 200 to 1600. Ignored for the part below the first screen when Full page is on.

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

PNG is lossless; JPEG is smaller.

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

1 to 100. Used for JPEG only.

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

Extra time to let animations and late content settle after the page has loaded, 0 to 5000.

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

Ask the page for its dark colour scheme (prefers-color-scheme: dark). Only sites that support it change.

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "fullPage": false,
  "width": 1280,
  "height": 800,
  "format": "png",
  "quality": 80,
  "delayMs": 0,
  "darkMode": false
}
```

# Actor output Schema

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

No description

## `summary` (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://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tanod/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://example.com"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tanod/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/N7RntHWK3538QHfNq/builds/MnTKWtTa9OzlhZCrE/openapi.json
