# Bulk Website Screenshots & PDF — Low-Cost Capture (`exceptional_nugget/bulk-website-screenshot-pdf`) Actor

PNG/JPEG screenshots and A4 PDFs from public URLs. $3/1K successful captures + $0.002/run; execution included. 25% lower unit rate than Clearrun, with narrower features. Desktop/mobile, private files, no external API key.

- **URL**: https://apify.com/exceptional\_nugget/bulk-website-screenshot-pdf.md
- **Developed by:** [LibriHouse](https://apify.com/exceptional_nugget) (community)
- **Categories:** Developer tools, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 successful unique webpage captures

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

## Bulk Website Screenshots & PDF

Capture authorized public webpages as full-page PNG/JPEG images or A4 PDFs. Submit a URL list; receive a file and structured status per unique URL. No external API key or subscription to another screenshot service is required.

**$3 per 1,000 successful captures + $0.002 per run. Execution included.** Failed and skipped URLs have no capture fee; the startup fee still applies to failed or invalid runs. Browser memory is fixed at 1 GB.

### Why choose this Actor?

- Low, transparent batch pricing with no outside screenshot API bill.
- Desktop (1440×900) and mobile-width (390×844) images; optional A4 PDF exports.
- Private output storage and explicit failed/blocked-resource reports.
- Duplicate URLs billed once per run; safe billing caps and repeat-run charge protection.

### Is it cheaper than competitors?

Our $3/1,000 capture rate is **25% below [Clearrun's $4/1,000 rate](https://apify.com/clearrun/page-screenshot/pricing)**, checked September 17, 2026. Including our $0.002 startup fee, batches of more than two successful captures cost less, provided neither run adds other costs. At 1,000 captures across twenty 50-URL runs, our total is $3.04 versus $4.00. Features differ: we do not automatically remove consent banners or offer their full feature set.

[Power On advertises rates from $7/1,000](https://apify.com/power_on/screenshot-url-pdf/pricing). This is not a cheapest-on-Apify claim: [Apify's own Screenshot Generator](https://apify.com/apify/screenshot-url) has no Actor fee and charges platform usage instead.

| Successful captures | Total Actor charge |
| --- | --- |
| 1 | $0.005 |
| 10 | $0.032 |
| 50 | $0.152 |

The 1,000-capture comparison is a normalized price example. Maximum 50 unique URLs per run: 1,000 captures across twenty 50-URL runs cost $3.04, still below $4.00.

### Quick start

1. Paste 1–50 public webpage URLs you are permitted to capture.
2. Confirm authorization. Choose PNG, JPEG or PDF and desktop or mobile width.
3. Run and open the dataset. Download files from the run's key-value store while signed in.

#### Desktop screenshot example

```json
{"urls":["https://api.apify.com/v2/key-value-stores/xH6IAd5D387CpFvGp/records/capture-fixture"],"authorized":true,"format":"png","device":"desktop","fullPage":true}
```

#### Mobile screenshots

Use the same input with `"device":"mobile"`. This changes viewport size, not the browser user agent or complete device emulation.

#### PDF export

Use `"format":"pdf"` to generate an A4 document with print backgrounds. Website print styles determine layout; it need not look identical to the screenshot. Each format requires a separate run and capture charge.

### Output and downloads

Each row contains `url`, `status`, and `charged`. Successful rows also include `finalUrl`, `title`, `format`, `device`, `fileUrl`, `storeId`, `key`, `bytes`, `blockedRequests`, `warnings` and `capturedAt`. Failed rows have an `error`. Files and datasets are access-restricted: `fileUrl` is an authenticated API endpoint, not a public share link. Use Apify Console or the SDK with your own scoped token; do not expose your token in a public URL.

### API, automation and AI-agent use

Use the API tab for JavaScript, Python and HTTP examples. Use the MCP tab for supported AI-agent integrations. Connect through your own Apify account; no separate third-party screenshot credential is needed. Typical workflows include agency page reviews, website archives, landing-page QA and report attachments. No claim is made that an AI assistant will automatically recommend this Actor.

### Limits and honest failure handling

- Public HTML pages only. No sign-in, cookies supplied by customers, CAPTCHA solving, stealth, geographic proxy, custom scripts, or cookie-banner removal.
- GET requests only; WebSockets, service workers and private/reserved network addresses are blocked. This can prevent complex applications from rendering fully.
- Per page: 18-second deadline, 100 requests, 30 MB downloaded, 8 MB per resource, 10 MB per output; maximum page height 10,000px and width 3,000px.
- A bounded scroll encourages lazy loading but cannot guarantee every lazy image appears. Fonts get a short bounded wait. Some pages need longer and are outside this low-cost product's scope.
- Successful means an HTML page returned successfully and a supported file was produced, not guaranteed pixel-perfect completeness. Check `warnings` and inspect your files. A capture with missing optional resources is billable and carries warnings.
- Three failed pages stop further attempts in that run. Unattempted URLs receive `SKIPPED_FAILURE_LIMIT`; exhausted charge budgets receive `SKIPPED_BILLING_LIMIT`.
- Outputs follow Apify storage retention. Download required archives promptly. Execution is included; your separate downstream storage/integrations are not.

### FAQ

**Do failed screenshots cost money?** No capture fee, but $0.002 startup still applies.

**Does this require an external API key?** No. Only your existing Apify account/API credentials for programmatic use.

**Can I capture private or logged-in pages?** No. Use authorized public pages; do not submit personal or sensitive URLs. Customers are responsible for permission and appropriate use.

**Can I use it for recurring reports?** Yes, via Apify Tasks and Schedules. This product captures snapshots; it does not calculate visual diffs.

**Is it guaranteed cheapest or perfect?** No. The comparison is limited to the named paid competitor and equivalent completed captures. Discovery, earnings and rendering of every website are not guaranteed.

# Actor input Schema

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

1–50 authorized public HTTP(S) URLs. Duplicate URLs share one capture and charge. Standard ports only; no login credentials.

## `authorized` (type: `boolean`):

Required. Do not submit private, sensitive or unauthorized pages.

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

One file per unique URL. PDF uses A4 print layout; images use the selected viewport.

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

Desktop: 1440×900. Mobile: 390×844. Viewport sizing only, not full mobile-device emulation.

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

PNG/JPEG only. PDF always uses the full print document. Max page height 10,000 pixels.

## Actor input object example

```json
{
  "urls": [
    "https://api.apify.com/v2/key-value-stores/xH6IAd5D387CpFvGp/records/capture-fixture"
  ],
  "authorized": false,
  "format": "png",
  "device": "desktop",
  "fullPage": true
}
```

# 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://api.apify.com/v2/key-value-stores/xH6IAd5D387CpFvGp/records/capture-fixture"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("exceptional_nugget/bulk-website-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://api.apify.com/v2/key-value-stores/xH6IAd5D387CpFvGp/records/capture-fixture"] }

# Run the Actor and wait for it to finish
run = client.actor("exceptional_nugget/bulk-website-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://api.apify.com/v2/key-value-stores/xH6IAd5D387CpFvGp/records/capture-fixture"
  ]
}' |
apify call exceptional_nugget/bulk-website-screenshot-pdf --silent --output-dataset

```

## MCP server setup

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