# Website Screenshot API: Bulk, Full-Page & Mobile (`tidyfold/website-screenshot`) Actor

$0.002 per screenshot, failures free. Bulk screenshot any URL or HTML to PNG, JPEG or WebP: full page, iPhone/iPad, retina, OG image sizes, element capture.

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

## Pricing

from $2.00 / 1,000 screenshot captureds

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

## Website Screenshot API: Bulk, Full-Page & Mobile

**Website Screenshot API** captures **bulk screenshots** of any public URL or raw HTML as **PNG, JPEG or WebP**: the visible window, the **full page**, a phone or tablet size, or a single element. You pay **$0.002 per screenshot** ($0.004 for a full page) and **failed captures are free**.

### How to use it

1. Paste one or more URLs into *URLs* (or your own HTML into *Raw HTML*).
2. Pick a device, format and whether you want the full page.
3. Click **Start**. Each image appears in the dataset with a public download link.

### Why this one

- **Flat prices, compute included.** You don't pay separately for browser time, so a slow page costs the same as a fast one
- **Full page, done properly:** scrolls first so lazy-loaded images appear, then captures the whole page (capped at 16,384 px; the row tells you if it was cut)
- **Devices:** desktop, Full HD, laptop, MacBook Retina, iPhone 15, Pixel 8, iPad, plus ready-made **Open Graph (1200×630)**, **Twitter/X card** and **square** sizes. Custom width, height and pixel density too
- **Capture one element** with a CSS selector (a pricing table, a chart, a hero section)
- **Cleaner shots:** hides common cookie/consent banners (OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast and more) and any extra elements you list, such as chat widgets
- **HTML to image:** render your own HTML (social cards, certificates, receipts) to PNG, JPEG or WebP
- **You only pay for screenshots that work.** Unreachable sites, HTTP 400+ pages, timeouts and selectors that match nothing come back with an error and are not charged

### Output

Each URL gives one row in the dataset and one image in the run's key-value store.

```json
{
  "source": "https://example.com",
  "status": "ok",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/example-com-1a2b3c4d.png",
  "format": "png",
  "width": 1280,
  "height": 800,
  "bytes": 19876,
  "fullPage": false,
  "truncatedHeight": false,
  "title": "Example Domain",
  "finalUrl": "https://example.com/",
  "httpStatus": 200,
  "tookMs": 1450
}
```

### Use cases

Visual monitoring of your own or competitors' landing pages (schedule the run daily), website thumbnails for directories and link previews, client reports and audits, mobile-layout checks, archiving pages for compliance, Open Graph images generated from HTML, and screenshots for AI agents and RAG pipelines.

### Input example

```json
{
  "urls": ["https://example.com", "apify.com"],
  "device": "iphone-15",
  "fullPage": true,
  "format": "webp"
}
```

### Notes

Works on public pages only: no logins, cookies or paywalled content, and private/local network addresses are refused. Some sites block automated browsers; those return an error and are not charged. You are responsible for how you use screenshots of third-party sites.

### How much does it cost to screenshot 1,000 websites?

Pay per event: you pay only for results.

- **$0.002 per screenshot** ($2 per 1,000): visible window or a single element, any device or format
- **$0.004 per full-page screenshot** ($4 per 1,000): the whole scrollable page, any length

Failed captures are never charged.

**Example:** 1,000 normal screenshots cost **$2.00**; 1,000 full-page screenshots cost **$4.00**. A single screenshot costs $0.002.

Apify also charges its standard run-start fee of $0.00005 per GB of run memory (a fraction of a cent per run). The exact prices are always on the **Pricing** tab, and you can cap any run with *Maximum cost per run*.

### FAQ

**Do I pay for pages that fail?**
No. Unreachable sites, HTTP 400+ pages, timeouts and selectors that match nothing return an error row and are not charged.

**How long can a full-page screenshot be?**
Up to 16,384 pixels tall. Longer pages are cut at that height and the row shows `truncatedHeight: true`.

**Can I take screenshots on a schedule?**
Yes. Save your input as an Apify task and add a schedule (for example daily) to monitor pages visually.

### More Tidyfold tools

| Tool | Use it for |
|---|---|
| [HTML to PDF Converter API: URL & HTML to PDF](https://apify.com/tidyfold/web-to-pdf) | HTML to PDF |
| [PDF Table Extractor: PDF to Excel, CSV & JSON](https://apify.com/tidyfold/pdf-tables-to-csv) | PDF to Excel |
| [Invoice & Receipt Parser: PDF to JSON (No AI Key)](https://apify.com/tidyfold/invoice-pdf-to-json) | invoice parser |
| [PDF OCR: Scanned PDF to Text Extractor](https://apify.com/tidyfold/pdf-text-ocr) | PDF OCR |
| [NPI Registry Scraper: US Healthcare Provider Leads](https://apify.com/tidyfold/npi-provider-lookup) | NPI registry scraper |
| [Contractor License Scraper: Texas, Colorado & Washington](https://apify.com/tidyfold/trade-license-lookup) | contractor license lookup |
| [New Business Leads: Newly Registered LLCs (CO, NY, OR)](https://apify.com/tidyfold/new-business-filings) | new business leads |
| [Contact Details Scraper: Emails, Phones & Tech Stack](https://apify.com/tidyfold/website-contact-finder) | contact details scraper |
| [Bulk WHOIS Lookup: Domain Expiry & Availability (RDAP)](https://apify.com/tidyfold/domain-whois-lookup) | bulk WHOIS lookup |
| [Sitemap Extractor: Get All URLs from Any Website](https://apify.com/tidyfold/sitemap-url-extractor) | sitemap extractor |

### Use it from code or no-code tools

Every run can be started from the Apify API, the Apify Python/JS clients, or connected to n8n, Make, Zapier and Google Sheets through Apify integrations.

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("tidyfold/website-screenshot").call(run_input={"urls": ["https://example.com"], "fullPage": True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["screenshotUrl"])
```

### Support

Found a bug or need an option added? Open an issue on the **Issues** tab. Tidyfold maintains these tools daily and usually replies within 1 business day.

# Actor input Schema

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

Public web pages to capture (one screenshot each). 'https://' is added if missing.

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

Render this HTML to an image instead of / in addition to URLs. Handy for social cards and OG images (pick the 'og-image' device).

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

Output file format.

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

Compression quality for JPEG and WebP (ignored for PNG).

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

Capture the whole scrollable page instead of just the visible window. Height is capped at 16,384 px.

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

Viewport size, pixel density and mobile emulation. All devices cost the same.

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

Overrides the device width.

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

Overrides the device height (ignored for full page).

## `deviceScaleFactor` (type: `integer`):

1 = standard, 2 = retina. Overrides the device.

## `colorScheme` (type: `string`):

Emulate dark mode for sites that support it.

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

Example: #pricing or .hero. If nothing matches, the row is returned with an error and not charged.

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

CSS selectors to hide before capturing (chat widgets, popups).

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

Hide common cookie/consent banners (OneTrust, Cookiebot, Usercentrics, Didomi, Quantcast and others). Does not click Accept.

## `transparentBackground` (type: `boolean`):

Hide the default white background for pages or HTML without their own background.

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

When the page counts as loaded. 'networkidle' waits up to 8 extra seconds for late content.

## `waitForSelector` (type: `string`):

Wait until this element is visible before capturing (for single-page apps).

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

Extra wait before capturing, for animations.

## `scrollToBottom` (type: `boolean`):

In full-page mode, scroll through the page first so lazy-loaded images appear.

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

Pages that take longer fail and are not charged.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com"
  ],
  "format": "png",
  "quality": 80,
  "fullPage": false,
  "device": "desktop",
  "colorScheme": "light",
  "hideCookieBanners": true,
  "transparentBackground": false,
  "waitUntil": "networkidle",
  "delayMs": 0,
  "scrollToBottom": true,
  "timeoutSecs": 45
}
```

# Actor output Schema

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

One row per URL with a link to the image.

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

Key-value store holding the images.

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

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

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

```

## MCP server setup

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