# Bulk Webpage Screenshot Tool for Slide Decks (`davidbenittah/website-screenshot-export`) Actor

Capture up to 10 public URLs as PNG screenshots in one run, full page or viewport only, at any width from 320 to 1920 pixels. Each row returns the final URL, HTTP status, page title, viewport and screenshot key, and a manifest lists every capture in slide order.

- **URL**: https://apify.com/davidbenittah/website-screenshot-export.md
- **Developed by:** [David](https://apify.com/davidbenittah) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 88.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Bulk Webpage Screenshot Tool for Slide Decks

Screenshot a batch of public URLs in one run and get PNG files plus a manifest that already knows the slide order. Set the viewport between 320 and 1920 pixels wide, choose full page or viewport only, and every capture comes back with the final URL, the HTTP status and the page title, so a weekly report or an audit deck assembles itself instead of being rebuilt by hand.

### What the bulk screenshot tool does

- Batch screenshot export for 3–10 public URLs per run.
- PNG screenshots saved to the default key-value store.
- Dataset rows include URL, final URL, HTTP status, page title, viewport and screenshot key.
- Manifest JSON lists every slide in order, ready for PowerPoint, Google Slides or report assembly.
- Clear error rows for blocked, login/paywall-looking or failed URLs.
- Bounded inputs: maximum 10 URLs, viewport capped at 1920×2160, wait capped at 5 seconds.

### Who uses this webpage screenshot export

- Weekly competitor website screenshots for marketing reports.
- QA evidence packs before and after a website release.
- Agency decks where every slide needs a fresh page capture.
- IT or compliance reports that need visual proof of public page state.

### Input

```json
{
  "startUrls": ["https://example.com", "https://apify.com"],
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "fullPage": true,
  "waitMs": 1000,
  "respectRobotsTxt": true
}
```

### Output

Each successful dataset item includes:

```json
{
  "url": "https://example.com",
  "finalUrl": "https://example.com/",
  "status": 200,
  "title": "Example Domain",
  "viewport": { "width": 1440, "height": 900 },
  "fullPage": true,
  "screenshotKey": "screenshots/001-example-com.png",
  "screenshotContentType": "image/png",
  "slide": { "number": 1, "caption": "Example Domain", "imageKey": "screenshots/001-example-com.png" }
}
```

### Data returned for each screenshot

| Field | What it holds |
|---|---|
| `url` / `finalUrl` | The URL requested and the one actually rendered |
| `status` | HTTP status of the page |
| `title` | Page title at capture time |
| `viewport` | Width and height used for the render |
| `fullPage` | Whether the whole scrollable page was captured |
| `screenshotKey` | Key of the PNG in the default key-value store |
| `slide` | Slide number, caption and image key for deck assembly |

The key-value store also holds `MANIFEST`, with `slides`, `errors` and `hardLimits`.

### Pricing

Pay per event: one billable event per successful screenshot result. Error rows are not intended as billable value.

### FAQ

#### Does it log into websites?

No. It only captures public URLs without login, paywall or private access.

#### Can it capture more than 10 URLs?

Not in this Actor. The v1 scope is intentionally bounded to keep runs predictable for buyers and for Apify compute.

#### Does it create a PPTX file?

No. It creates PNG screenshots and a PowerPoint-ready manifest, so another workflow can assemble the deck without guessing slide order or captions.

# Actor input Schema

## `startUrls` (type: `array`):

Public http/https URLs to screenshot. Hard maximum: 10 URLs per run. No login, paywall, or private URLs.

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

Browser viewport width in pixels. Bounded between 320 and 1920.

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

Browser viewport height in pixels. Bounded between 480 and 2160.

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

When enabled, captures the whole scrollable page. Disable for slide-shaped viewport-only screenshots.

## `waitMs` (type: `integer`):

Optional wait after page load for lazy content, capped at 5000 ms.

## `respectRobotsTxt` (type: `boolean`):

Skip URLs disallowed by robots.txt. Recommended and enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    "https://example.com",
    "https://apify.com"
  ],
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "fullPage": true,
  "waitMs": 1000,
  "respectRobotsTxt": true
}
```

# Actor output Schema

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

Structured result items.

# 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 = {
    "startUrls": [
        "https://example.com",
        "https://apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("davidbenittah/website-screenshot-export").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 = { "startUrls": [
        "https://example.com",
        "https://apify.com",
    ] }

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/c51rEEz7gTPDAMxpD/builds/kHVBYRSsoGONqDV6f/openapi.json
