Website Screenshot Generator

Capture bulk website screenshots and downloadable PDFs with full-page, element, mobile, dark-mode, and overlay-hiding controls.

Data fields

FieldTypeDescription
urlstringPublic URL requested for capture.
finalUrlstring | nullFinal page URL after redirects.
statusCodeinteger | nullMain page response status when available.
titlestring | nullRendered page title when available.
screenshotKeystring | nullKey-value store key for an image capture.
screenshotUrlstring | nullDirect API URL for the saved image.
pdfKeystring | nullKey-value store key for a PDF capture.
pdfUrlstring | nullDirect API URL for the saved PDF.

Input preview

startUrlsPage URLs *
screenshotTypeScreenshot type
outputFormatOutput format
viewportViewport
waitUntilWait until
delayMsExtra delay in milliseconds

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Capture downloadable screenshots and PDFs from public web pages in bulk, with full-page, element, mobile, dark-mode, overlay-hiding, timing, and proxy controls.

Use it to create visual QA evidence, SEO audit snapshots, client reports, web archives, or browser-rendered page captures that can be downloaded from Apify key-value store records and tracked in a dataset.

At a glance

  • Bulk page capture: Save PNG, JPEG, or PDF outputs for one or many public URLs.
  • Viewport control: Capture desktop, mobile, tablet, or custom browser dimensions.
  • Full-page screenshots: Capture the visible viewport or the full scrollable page.
  • Element screenshots: Use a CSS selector to capture only the first matching visible element.
  • Cleaner captures: Hide cookie banners, ads, sticky headers, and other matching elements before capture.
  • Rendering controls: Wait for client-rendered elements, choose light or dark mode, and tune JPEG quality.
  • Automation-ready records: Save output keys, public API record URLs, status codes, dimensions, page titles, and errors.
  • Failure-safe batches: Preserve completed captures and write a RUN_SUMMARY before the run time budget expires.

What can it do?

Website Screenshot Generator launches a browser, visits each public URL, waits for your chosen page-load milestone, saves a screenshot or PDF to the default key-value store, and writes one dataset row per requested URL.

  • Capture images: Save viewport or full-page PNG/JPEG screenshots.
  • Capture PDFs: Render pages to A4 PDF with backgrounds.
  • Capture elements: Save screenshots for a selector such as h1, .hero, or main.
  • Wait for rendering: Choose domcontentloaded, load, or networkidle, then add a small delay for late widgets.
  • Wait for content: Require a CSS selector to become visible before taking the capture.
  • Remove overlays: Hide selected cookie banners, ads, or sticky elements without modifying the source website.
  • Track failures: Error rows include the URL, final URL when known, dimensions, format, timestamp, and error message.

Who is it for?

  • Developers and QA teams collecting visual regression evidence across releases.
  • SEO and marketing teams archiving landing pages and campaign variants.
  • Agencies and analysts producing repeatable screenshot or PDF deliverables.
  • Automation builders feeding browser-rendered captures into Apify workflows, APIs, or agents.

Common workflows

  • Visual regression baselines: Capture public pages before and after releases or redesigns.
  • SEO audit evidence: Save screenshots of landing pages, search templates, public forms, or documentation pages.
  • Client deliverables: Generate PNG/JPEG screenshots or PDF snapshots for reports.
  • Content monitoring: Schedule captures and compare page appearance over time.
  • Agent visual context: Pair screenshots with extracted page text for QA, research, and RAG review workflows.

What data do you get?

The actor saves screenshots/PDFs in the default key-value store and writes a dataset row for each requested URL.

Field Description
url Requested public URL
finalUrl Final browser URL after redirects
statusCode HTTP response status code when available
title Browser page title
screenshotKey Key-value store key for PNG/JPEG captures
screenshotUrl API URL for the saved screenshot record
pdfKey Key-value store key for PDF captures
pdfUrl Direct API URL for the saved PDF record
width Capture width in pixels
height Capture height in pixels
fullPageHeight Measured document height for full-page image requests
truncated Whether a full-page image exceeded maxFullPageHeight and was safely clipped
format Output format: png, jpeg, or pdf
capturedAt ISO timestamp for the capture attempt
error Error message when capture failed

Example input

{
  "startUrls": [
    { "url": "https://example.com" },
    { "url": "https://docs.apify.com" }
  ],
  "screenshotType": "fullPage",
  "outputFormat": "png",
  "viewport": {
    "width": 1366,
    "height": 768,
    "deviceScaleFactor": 1,
    "isMobile": false
  },
  "waitUntil": "load",
  "delayMs": 1000,
  "hideSelectors": [".cookie-banner"],
  "maxFullPageHeight": 20000,
  "captureTimeoutSecs": 60,
  "maxRetries": 2,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

Example output

{
  "url": "https://example.com/",
  "finalUrl": "https://example.com/",
  "statusCode": 200,
  "title": "Example Domain",
  "screenshotKey": "0001-example-com.png",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/0001-example-com.png",
  "pdfKey": null,
  "pdfUrl": null,
  "width": 1366,
  "height": 768,
  "fullPageHeight": 768,
  "truncated": false,
  "format": "png",
  "capturedAt": "2026-07-03T10:00:00.000Z",
  "error": null
}

Tips for reliable captures

  • Start with one URL: Confirm the site renders correctly before adding a large list.
  • Use load first: Switch to networkidle only when the page needs extra network quiet time.
  • Add a small delay: Use delayMs for animations, cookie banners, or client-rendered content.
  • Prefer a selector for app content: waitForSelector is more predictable than a long fixed delay.
  • Hide known overlays: Add their CSS selectors to hideSelectors; the Actor does not try to guess consent choices.
  • Keep concurrency modest: Lower maxConcurrency for very long pages, PDFs, or memory-heavy sites.
  • Use the default proxy: Cloud captures use Apify Proxy because direct browser egress can be rejected by the runtime. Country and proxy-group choices remain configurable.
  • Check the key-value store: Screenshot and PDF files are stored there; the dataset keeps their keys and URLs.
  • Check RUN_SUMMARY: It reports requested, successful, failed, and time-budget-stopped counts for automation.

Limits and practical notes

  • The actor captures public HTTP/HTTPS pages.
  • Private, loopback, link-local, and reserved network destinations are rejected, including redirects and browser subrequests.
  • Private, login-gated, paywalled, or bot-blocked pages may fail or show limited content.
  • CSS selector captures require the target element to be visible within the timeout.
  • PDF output ignores screenshotType and selector.
  • Full-page image captures taller than maxFullPageHeight are clipped and return truncated: true; this prevents browser failures on effectively unbounded pages.
  • A batch can finish with partial results when individual pages fail or the capture time budget is reached. The Actor fails only when no page was captured successfully.
  • Some sites render different content by country, cookie state, viewport, or bot detection.

API usage

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~website-screenshot-generator/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"startUrls":[{"url":"https://example.com"}],"screenshotType":"fullPage","outputFormat":"png"}'

Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/website-screenshot-generator').call({
  startUrls: [{ url: 'https://example.com' }],
  screenshotType: 'fullPage',
  outputFormat: 'png'
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
import os

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fetch_cat/website-screenshot-generator").call(run_input={
    "startUrls": [{"url": "https://example.com"}],
    "screenshotType": "fullPage",
    "outputFormat": "png",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

MCP and AI agents

Use this actor from MCP-compatible tools through Apify MCP Server.

MCP URL:

https://mcp.apify.com/?tools=fetch_cat/website-screenshot-generator

Claude CLI:

claude mcp add --transport http apify 'https://mcp.apify.com/?tools=fetch_cat/website-screenshot-generator'

MCP client configuration:

{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=fetch_cat/website-screenshot-generator"
    }
  }
}

Example prompts:

  • "Capture full-page screenshots for these public landing pages."
  • "Save a PDF snapshot of this documentation page."
  • "Capture the hero section from this URL using a CSS selector."

Legality and responsible use

This actor captures publicly accessible web pages.

Use screenshots and PDFs responsibly, follow the target website's terms, Apify's terms, and applicable laws, and do not use the actor to bypass access controls.

Support

If a URL produces an error row, start with a single page, use waitUntil: "load", add a small delayMs, and inspect statusCode, finalUrl, and error.

For a reproducible support report, include the run ID or run URL, the exact input JSON, the expected output, the actual output the Actor returned, and one reproducible public URL when it is safe to share. Do not include passwords, session cookies, private URLs, or other secrets.

Privacy and data handling

This Actor runs with Apify limited permissions and only processes data needed for the documented run. It uses the inputs you provide and the public records needed to produce the documented dataset to produce the output dataset and sends requests to the website URLs you provide; results are stored in Apify run storage for your account. FetchCat does not use your inputs or outputs for advertising, does not use them for model training, and does not retain them outside the Apify run except for transient support debugging when you explicitly share run details. You are responsible for using the Actor lawfully, respecting the target site's terms, and avoiding unnecessary personal or sensitive data in inputs.

Common questions

Questions and answers reused from the canonical actor README.

Are the image and PDF files downloadable?

Yes. Each successful row includes screenshotUrl or pdfUrl, and the file also appears in the run's key-value store.

Can it capture mobile and dark-mode pages?

Yes. Set a mobile viewport and isMobile: true; use colorScheme: "dark" for sites that honor the preferred color scheme.

Are failed pages charged as successful captures?

No. The capture event is charged only when the output file and its dataset row are saved successfully. The one-time run-start charge still applies.

Why was a full-page image truncated?

The page exceeded maxFullPageHeight. The row reports the measured fullPageHeight and returns truncated: true so automation can identify the clipped image.

Can cookie banners always be removed automatically?

No universal method can reliably remove every consent interface. Add the site's known CSS selectors to hideSelectors for a deterministic capture.