# Website Screenshot Generator (`parseforge/screenshot-url`) Actor

Capture pixel-perfect website screenshots in seconds! Generate full-page or viewport PNG and JPEG shots of any URL with custom viewport sizes, wait times, and device modes. Includes page title, description, OG image, and metadata. Perfect for audits, monitoring, and visual QA. Start capturing today!

- **URL**: https://apify.com/parseforge/screenshot-url.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 26 total users, 13 monthly users, 99.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 📸 URL Screenshot Tool

> 🚀 **Capture full-page screenshots of any website in seconds.** PNG, JPEG, or PDF export with **custom viewport, wait conditions, and meta tag extraction**. No API key, no registration, no browser licensing hassles.

> 🕒 **Last updated:** 2026-05-18 · **📊 22 fields** per capture · **🖼️ 3 output formats** · **⚡ Up to 10 parallel captures** · **📐 Custom viewport**

The **URL Screenshot Tool** renders any URL in a headless Chromium browser and saves the output as PNG, JPEG, or PDF. Each capture ships with page metadata (title, meta tags, OpenGraph, Twitter Card, HTTP status, final URL after redirects, page load time, console errors, and detected technologies) so you can audit SEO, performance, and visuals in one pass. The tool runs up to 10 captures in parallel, blocks heavy resources like fonts and video, and supports custom wait conditions for slow-rendering single-page apps.

Screenshots are uploaded to the run's key-value store, and the public URL is included in each dataset record so you can download or embed images directly. Optional mobile (iPhone-class) snapshots and full HTML snapshots ride along with the desktop capture. Use it for design audits, compliance archives, visual regression testing, or any workflow where you need a pixel-perfect snapshot of a live page.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Designers, QA teams, compliance officers, marketers, product managers, competitive intelligence | Design audits, visual regression, compliance archiving, competitor monitoring, PDF report generation |


---

### 📋 What the URL Screenshot Tool does

Six capture workflows in a single run:

- 🖼️ **Multi-format output.** PNG, JPEG, or PDF export per URL.
- 🖥️ **Custom viewport.** Set width, height, and device emulation for responsive captures.
- 📜 **Full-page capture.** Scroll and stitch the entire page, or capture just the viewport.
- ⏳ **Wait conditions.** Wait for a CSS selector, a fixed timeout, or `domcontentloaded`.
- 🏷️ **Meta tag audit.** Every capture returns the full meta tag dictionary plus parsed OpenGraph, Twitter Card, and heading outline for SEO review.
- 🔗 **Redirect tracking.** Records the final URL after all redirects, HTTP status, console error count, and detected technologies.

Plus response timing (milliseconds), HTTP status, screenshot file size, optional mobile variant, optional HTML snapshot, and a public URL to each artifact.

> 💡 **Why it matters:** visual snapshots are the fastest way to audit a page. Building your own browser farm costs thousands monthly. This Actor keeps pay-per-use pricing with production-quality Chromium rendering.


---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough of design audits across competitor homepages._


---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td>startUrls</td><td>array of URLs</td><td>required</td><td>One or more URLs to screenshot.</td></tr>
<tr><td>viewport</td><td>object</td><td>{width:1920,height:1080}</td><td>Browser viewport size in pixels.</td></tr>
<tr><td>fullPage</td><td>boolean</td><td>true</td><td>Capture full scrollable page or just the viewport.</td></tr>
<tr><td>format</td><td>string</td><td>"png"</td><td>png, jpeg, or pdf.</td></tr>
<tr><td>captureMobile</td><td>boolean</td><td>false</td><td>Also produce a mobile (iPhone-class) screenshot per URL.</td></tr>
<tr><td>captureHtml</td><td>boolean</td><td>true</td><td>Save the rendered HTML next to the screenshot.</td></tr>
<tr><td>waitForSelector</td><td>string</td><td>""</td><td>CSS selector to wait for before capture.</td></tr>
<tr><td>waitMs</td><td>integer</td><td>2000</td><td>Fixed delay after page load.</td></tr>
<tr><td>navigationTimeoutSecs</td><td>integer</td><td>45</td><td>Per-URL navigation timeout in seconds.</td></tr>
<tr><td>proxyConfiguration</td><td>object</td><td>direct</td><td>Optional Apify proxy. Enable residential only when the target serves Cloudflare or Akamai challenges.</td></tr>
<tr><td>maxItems</td><td>integer</td><td>10</td><td>URLs captured. Free plan caps at 10, paid plan at 1,000,000.</td></tr>
</tbody>
</table>

**Example: design audit across 3 homepages.**

```json
{
    "startUrls": [
        { "url": "https://apify.com" },
        { "url": "https://stripe.com" },
        { "url": "https://openai.com" }
    ],
    "viewport": { "width": 1920, "height": 1080 },
    "fullPage": true,
    "format": "png",
    "waitMs": 2000
}
````

**Example: PDF archive of a long-form article.**

```json
{
    "startUrls": [
        { "url": "https://en.wikipedia.org/wiki/Web_scraping" }
    ],
    "format": "pdf",
    "fullPage": true,
    "waitForSelector": "article"
}
```

> ⚠️ **Good to Know:** single-page apps with heavy client-side rendering may need a longer `waitMs` or a specific `waitForSelector` to capture after content loads. Fonts and video are blocked by default to speed up capture; disable that in the source if you need them. Toggle `captureMobile` if you want a paired phone-sized snapshot.

***

### 📊 Output

Each capture produces a **22-field record** plus the image (and optional mobile screenshot and HTML snapshot) stored in the key-value store. Download the dataset as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🔗 `url` | string | `"https://apify.com"` |
| ➡️ `finalUrl` | string | null | `"https://apify.com/"` (after redirects) |
| 🏷️ `title` | string | null | `"Apify: Full-stack web scraping and data extraction platform"` |
| 📐 `viewport` | object | `{"width": 1920, "height": 1080}` |
| 📜 `fullPage` | boolean | `true` |
| 🖼️ `format` | string | `"png"` |
| 🔑 `screenshotKey` | string | `"screenshot-1779065394871-q5jr7a.png"` |
| 🌐 `screenshotUrl` | string | `"https://api.apify.com/v2/key-value-stores/.../records/screenshot-...png"` |
| 📦 `sizeBytes` | number | `1121801` |
| 📱 `mobileScreenshotKey` | string | null | `"mobile-1779065394871-z3a8.png"` (when `captureMobile: true`) |
| 📱 `mobileScreenshotUrl` | string | null | public URL for the mobile capture |
| 📄 `htmlSnapshotKey` | string | null | `"html-1779065395295-xrqpor.html"` |
| 📄 `htmlSnapshotUrl` | string | null | public URL for the saved HTML |
| ⏱️ `pageLoadTimeMs` | number | `1849` |
| 🟢 `httpStatus` | number | null | `200` |
| 🏷️ `metaTags` | object | `{"description": "...", "og:image": "..."}` |
| 🔖 `openGraph` | object | `{"title": "...", "image": "..."}` |
| 🐦 `twitterCard` | object | `{"card": "summary_large_image", "title": "..."}` |
| 🧱 `pageHeadings` | object | `{"h1": [...], "h2": [...]}` |
| 🔇 `consoleErrors` | number | `8` |
| 🧪 `technologies` | array | `["Next.js", "Google Analytics"]` |
| 🕒 `screenshotAt` | ISO 8601 | `"2026-05-18T00:49:50.130Z"` |
| ❗ `error` | string | null | `"Timeout"` on failure |

#### 📦 Sample records

<details>
<summary><strong>📷 Typical capture: rich SPA homepage (apify.com)</strong></summary>

```json
{
    "url": "https://apify.com",
    "finalUrl": "https://apify.com/",
    "title": "Apify: Full-stack web scraping and data extraction platform",
    "viewport": { "width": 1920, "height": 1080 },
    "fullPage": true,
    "format": "png",
    "screenshotKey": "screenshot-1779065394871-q5jr7a.png",
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/screenshot-1779065394871-q5jr7a.png",
    "sizeBytes": 1121801,
    "mobileScreenshotKey": null,
    "mobileScreenshotUrl": null,
    "htmlSnapshotKey": "html-1779065395295-xrqpor.html",
    "htmlSnapshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/html-1779065395295-xrqpor.html",
    "pageLoadTimeMs": 1849,
    "httpStatus": 200,
    "metaTags": {
        "description": "Cloud platform for web scraping, browser automation, AI agents, and data for AI. Use 30,000+ ready-made tools, code templates, or order a custom solution.",
        "og:title": "Apify: Full-stack web scraping and data extraction platform",
        "og:image": "https://apify.com/img/og/landing.png",
        "twitter:card": "summary_large_image"
    },
    "openGraph": {
        "title": "Apify: Full-stack web scraping and data extraction platform",
        "image": "https://apify.com/img/og/landing.png",
        "type": "website"
    },
    "twitterCard": {
        "card": "summary_large_image",
        "creator": "@apify"
    },
    "pageHeadings": {
        "h1": ["Get real-time web data for your AI"],
        "h2": ["Not just a web scraping API", "Build and deploy reliable scrapers", "Publish Actors. Get paid."]
    },
    "consoleErrors": 8,
    "technologies": ["Next.js", "Google Analytics"],
    "screenshotAt": "2026-05-18T00:49:50.130Z"
}
```

</details>

<details>
<summary><strong>🌐 Edge case: multilingual page with structured metadata (wikipedia.org)</strong></summary>

```json
{
    "url": "https://wikipedia.org",
    "finalUrl": "https://www.wikipedia.org/",
    "title": "Wikipedia",
    "viewport": { "width": 1920, "height": 1080 },
    "fullPage": true,
    "format": "png",
    "screenshotKey": "screenshot-1779065392180-hjtwx0.png",
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/screenshot-1779065392180-hjtwx0.png",
    "sizeBytes": 195297,
    "mobileScreenshotKey": null,
    "mobileScreenshotUrl": null,
    "htmlSnapshotKey": "html-1779065392330-9676u6.html",
    "htmlSnapshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/html-1779065392330-9676u6.html",
    "pageLoadTimeMs": 1028,
    "httpStatus": 200,
    "metaTags": {
        "description": "Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.",
        "og:title": "Wikipedia, the free encyclopedia"
    },
    "openGraph": {
        "title": "Wikipedia, the free encyclopedia",
        "type": "website",
        "image": "https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg/250px-Wikipedia-logo-v2.svg.png"
    },
    "twitterCard": {},
    "pageHeadings": {
        "h1": ["Wikipedia\n\nThe Free Encyclopedia"],
        "h2": ["1,000,000+\n\n\narticles", "100,000+\n\n\narticles", "10,000+\n\n\narticles", "1,000+\n\n\narticles", "100+\n\n\narticles"]
    },
    "consoleErrors": 0,
    "technologies": [],
    "screenshotAt": "2026-05-18T00:49:50.131Z"
}
```

</details>

<details>
<summary><strong>🟢 Sparse capture: minimal static page (example.com)</strong></summary>

```json
{
    "url": "https://example.com",
    "finalUrl": "https://example.com/",
    "title": "Example Domain",
    "viewport": { "width": 1920, "height": 1080 },
    "fullPage": true,
    "format": "png",
    "screenshotKey": "screenshot-1779065390629-gnmuvj.png",
    "screenshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/screenshot-1779065390629-gnmuvj.png",
    "sizeBytes": 19955,
    "mobileScreenshotKey": null,
    "mobileScreenshotUrl": null,
    "htmlSnapshotKey": "html-1779065390812-fls6hs.html",
    "htmlSnapshotUrl": "https://api.apify.com/v2/key-value-stores/7nDM3W5xzuiFyFJNz/records/html-1779065390812-fls6hs.html",
    "pageLoadTimeMs": 293,
    "httpStatus": 200,
    "metaTags": {
        "viewport": "width=device-width, initial-scale=1"
    },
    "openGraph": {},
    "twitterCard": {},
    "pageHeadings": {
        "h1": ["Example Domain"],
        "h2": []
    },
    "consoleErrors": 0,
    "technologies": [],
    "screenshotAt": "2026-05-18T00:49:50.131Z"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🖼️ | **Three formats.** PNG, JPEG, and PDF from the same input. |
| 📐 | **Custom viewport.** Desktop, tablet, mobile sizes for responsive audits. |
| ⏳ | **Flexible waits.** CSS selector, millisecond delay, or DOM-ready events. |
| 🏷️ | **Meta tag dump.** Full `<meta>` dictionary, OpenGraph, Twitter Card, and heading outline returned alongside the image. |
| ⚡ | **Parallel capture.** Up to 10 screenshots in parallel on a single run. |
| 📱 | **Optional mobile pair.** Toggle `captureMobile` to ship an iPhone-class snapshot next to the desktop one. |
| 🚫 | **No browser farm.** Full Chromium rendering without infrastructure. |

> 📊 Visual audits are the fastest way to catch design regressions, competitor moves, and layout bugs. One screenshot every day is cheaper than a single missed visual bug in production.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ URL Screenshot Tool** *(this Actor)* | $5 free credit, then pay-per-use | Any public URL | **Live per run** | viewport, fullPage, wait conditions, format | ⚡ 2 min |
| Headless browser cloud services | $$$+/hour | Any URL | Live | Custom scripts | 🕒 Variable |
| Self-hosted Puppeteer | Free | Whatever you host | Your schedule | Your code | 🐢 Days |
| Manual screenshot tools | Free | Single-user, manual | Manual | Basic | 🕒 Slow |

Pick this Actor when you want pixel-perfect captures without running your own browser infrastructure.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the URL Screenshot Tool page on the Apify Store.
3. 🎯 **Set input.** Paste URLs, pick a format, set viewport and wait conditions.
4. 🚀 **Run it.** Click **Start** and let the Actor capture each page.
5. 📥 **Download.** Grab your images directly from the dataset or the key-value store.

> ⏱️ Total time from signup to downloaded screenshots: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 🎨 Design & UX

- Daily snapshots of your own site for regression
- Competitor homepage monitoring
- Cross-device visual audits
- Share design reviews with stakeholders

</td>
<td width="50%" valign="top">

#### 🧪 QA & Testing

- Visual regression across deploys
- Multi-viewport verification
- Pixel-perfect screenshot evidence
- PDF reports for test runs

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 📝 Compliance & Archives

- Legal archives of marketing pages
- Accessibility audits with visual proof
- Regulatory page preservation
- Terms of service snapshots

</td>
<td width="50%" valign="top">

#### 📊 Competitive Intelligence

- Monitor rival landing pages
- Capture pricing page snapshots
- Archive launch announcements
- Track seasonal design changes

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating URL Screenshot Tool

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the `apify-client` NPM package.
- 🐍 **Python.** Use the `apify-client` PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Daily snapshots of key pages build a visual history archive.

***

### ❓ Frequently Asked Questions

<details>
<summary><strong>💳 Do I need a paid Apify plan to run this actor?</strong></summary>

No. You can start right now on the free Apify plan, which includes **$5 in free monthly credit**. That is enough to capture several batches of screenshots before committing to anything. Paid plans unlock higher limits, more concurrent runs, and larger datasets. [Create a free Apify account here](https://console.apify.com/sign-up?fpr=vmoqkp) to get started.

</details>

<details>
<summary><strong>🏢 Can I use the screenshots for commercial purposes?</strong></summary>

Yes. The images and metadata returned by this Actor belong to you and can be used in commercial products, dashboards, internal tooling, or client deliverables. You are responsible for honoring the copyright and terms of service of every site you capture, especially before redistributing screenshots that contain third-party content.

</details>

<details>
<summary><strong>🚨 What happens if my run fails or returns no results?</strong></summary>

Failed runs are not charged. If a target site times out, blocks the request, or a specific URL produces an `error` field, re-run the actor or open our [contact form](https://tally.so/r/BzdKgA) and we will investigate. You can also check the run log in the Apify console to see exactly why a URL was skipped.

</details>

<details>
<summary><strong>⚖️ Is it legal to screenshot websites?</strong></summary>

Capturing publicly accessible pages for archival, audit, research, or competitive intelligence is widely accepted. This Actor only fetches URLs that you provide and only over standard HTTPS, the same way a browser would. You are responsible for honoring the robots policy, terms of service, and copyright of the sites you capture, especially before redistributing images that contain third-party content.

</details>

<details>
<summary><strong>📏 How many URLs can I screenshot per run?</strong></summary>

Free users are limited to **10 captures per run** so you can preview the output and confirm the actor works for your use case. Paid users can raise `maxItems` up to **1,000,000** per run. [Upgrade here](https://console.apify.com/sign-up?fpr=vmoqkp) if you need full scale.

</details>

<details>
<summary><strong>🖼️ Which output formats are supported?</strong></summary>

Three formats, switchable per run: **PNG** (lossless, default), **JPEG** (smaller, lossy), and **PDF** (printable, paginated A4). The image is uploaded to the run's key-value store and a public URL ships in every record so you can embed or download it directly.

</details>

<details>
<summary><strong>📱 Can I capture a mobile version of each page?</strong></summary>

Yes. Toggle `captureMobile: true` and the actor will produce a second screenshot per URL using an iPhone-class viewport and user agent. The mobile artifact is returned alongside the desktop one as `mobileScreenshotKey` and `mobileScreenshotUrl`.

</details>

<details>
<summary><strong>🛡️ What if the target site shows a bot challenge?</strong></summary>

Most public pages render fine on a direct connection, which is the default. If your target shows a Cloudflare or Akamai interstitial, enable **Apify Proxy** with the **residential** group inside `proxyConfiguration`. The actor automatically detects common challenge titles and gives the page extra time to settle.

</details>

<details>
<summary><strong>🕒 How fresh is the data?</strong></summary>

Every run renders the live page at the moment of execution. There is no cache or delay: the screenshot and metadata reflect what the source returned at that moment. Schedule the actor to maintain a rolling visual history of the pages you care about.

</details>

<details>
<summary><strong>🧑‍💻 Can I call this actor from my own code?</strong></summary>

Yes. Apify exposes every actor as a REST endpoint and ships first-class SDKs for [Node.js](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python). You can start a run, read the dataset, fetch the screenshot URL, and handle webhooks from your own app in a few lines. All you need is your Apify API token.

</details>

<details>
<summary><strong>📤 How do I export the data?</strong></summary>

Every Apify dataset can be downloaded in one click from the console as CSV, JSON, JSONL, Excel, HTML, XML, or RSS. The screenshot bytes themselves live in the key-value store and are reachable through the public URLs returned in each record. You can also pull everything programmatically via the [Apify API](https://docs.apify.com/api/v2) or stream it into BigQuery, S3, and other destinations through built-in integrations.

</details>

<details>
<summary><strong>📅 Can I schedule the actor to run automatically?</strong></summary>

Yes. Use the Apify scheduler to run the actor on any cadence, from hourly to monthly. Captures are saved to your dataset and key-value store and can be delivered to webhooks, email, Slack, cloud storage, or automation tools such as Zapier and Make.

</details>

***

### 🔌 Integrate with any app

URL Screenshot Tool connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate visual audit workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Upload captures to Drive, Dropbox, Notion
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Post screenshots to team channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe snapshot logs into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger captures from deploys
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Save images to Drive folders

You can also use webhooks to push new screenshots directly into visual regression tools.

***

### 🔗 Recommended Actors

- [**🔗 Broken Link Checker**](https://apify.com/parseforge/broken-link-checker) - Crawl any site and surface every 4xx or 5xx link
- [**🧩 HTML to JSON Smart Parser**](https://apify.com/parseforge/html-to-json-smart-parser) - Turn raw HTML into structured JSON records
- [**🎨 Image Converter API**](https://apify.com/parseforge/image-converter-api) - Resize, transcode, and optimize the screenshots you capture here
- [**🧷 Watermark Image API**](https://apify.com/parseforge/watermark-image-api) - Stamp logos or notices onto captured images
- [**📄 Markdown to PDF**](https://apify.com/parseforge/markdown-to-pdf-mcp) - Bundle your captures and notes into printable reports

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more site-audit tools.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool. It captures only publicly accessible pages from URLs you provide. Respect the copyright and terms of service of every site you screenshot, especially before redistributing captures.

# Actor input Schema

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

One or more URLs to render. Each URL produces one screenshot record in the dataset.

## `maxItems` (type: `integer`):

Free users: limited to 10 items (preview). Paid users: optional, max 1,000,000.

## `viewport` (type: `object`):

Browser viewport size in pixels.

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

Capture the full scrollable page (true) or just the viewport (false).

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

Output file format.

## `captureMobile` (type: `boolean`):

Also produce a mobile (iPhone-class) screenshot for each URL.

## `captureHtml` (type: `boolean`):

Save the rendered HTML next to the screenshot.

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

Optional CSS selector to wait for before capture.

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

Additional milliseconds to wait after the page reports loaded.

## `navigationTimeoutSecs` (type: `integer`):

How long to wait for each URL to load before giving up.

## `proxyConfiguration` (type: `object`):

Optional proxy configuration. Defaults to a direct connection. Switch on Apify Proxy with the residential group only if the target site blocks direct requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "maxItems": 10,
  "viewport": {
    "width": 1920,
    "height": 1080
  },
  "fullPage": true,
  "format": "png",
  "captureHtml": true,
  "waitMs": 2000,
  "navigationTimeoutSecs": 45
}
```

# Actor output Schema

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

Complete dataset

# 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": [
        {
            "url": "https://apify.com"
        }
    ],
    "maxItems": 10,
    "viewport": {
        "width": 1920,
        "height": 1080
    },
    "fullPage": true,
    "format": "png",
    "captureMobile": false,
    "captureHtml": true,
    "waitMs": 2000,
    "navigationTimeoutSecs": 45
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/screenshot-url").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": [{ "url": "https://apify.com" }],
    "maxItems": 10,
    "viewport": {
        "width": 1920,
        "height": 1080,
    },
    "fullPage": True,
    "format": "png",
    "captureMobile": False,
    "captureHtml": True,
    "waitMs": 2000,
    "navigationTimeoutSecs": 45,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/screenshot-url").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": [
    {
      "url": "https://apify.com"
    }
  ],
  "maxItems": 10,
  "viewport": {
    "width": 1920,
    "height": 1080
  },
  "fullPage": true,
  "format": "png",
  "captureMobile": false,
  "captureHtml": true,
  "waitMs": 2000,
  "navigationTimeoutSecs": 45
}' |
apify call parseforge/screenshot-url --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Screenshot Generator",
        "description": "Capture pixel-perfect website screenshots in seconds! Generate full-page or viewport PNG and JPEG shots of any URL with custom viewport sizes, wait times, and device modes. Includes page title, description, OG image, and metadata. Perfect for audits, monitoring, and visual QA. Start capturing today!",
        "version": "1.0",
        "x-build-id": "XxGT2oDNbTokMRIMY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~screenshot-url/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-screenshot-url",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~screenshot-url/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-screenshot-url",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~screenshot-url/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-screenshot-url",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "URLs to Screenshot",
                        "type": "array",
                        "description": "One or more URLs to render. Each URL produces one screenshot record in the dataset.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: limited to 10 items (preview). Paid users: optional, max 1,000,000."
                    },
                    "viewport": {
                        "title": "Viewport",
                        "type": "object",
                        "description": "Browser viewport size in pixels."
                    },
                    "fullPage": {
                        "title": "Full Page",
                        "type": "boolean",
                        "description": "Capture the full scrollable page (true) or just the viewport (false)."
                    },
                    "format": {
                        "title": "Output Format",
                        "enum": [
                            "png",
                            "jpeg",
                            "pdf"
                        ],
                        "type": "string",
                        "description": "Output file format."
                    },
                    "captureMobile": {
                        "title": "Capture Mobile Variant",
                        "type": "boolean",
                        "description": "Also produce a mobile (iPhone-class) screenshot for each URL."
                    },
                    "captureHtml": {
                        "title": "Capture HTML Snapshot",
                        "type": "boolean",
                        "description": "Save the rendered HTML next to the screenshot."
                    },
                    "waitForSelector": {
                        "title": "Wait for Selector",
                        "type": "string",
                        "description": "Optional CSS selector to wait for before capture."
                    },
                    "waitMs": {
                        "title": "Wait Milliseconds",
                        "minimum": 0,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "Additional milliseconds to wait after the page reports loaded."
                    },
                    "navigationTimeoutSecs": {
                        "title": "Navigation Timeout (seconds)",
                        "minimum": 5,
                        "maximum": 180,
                        "type": "integer",
                        "description": "How long to wait for each URL to load before giving up."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Optional proxy configuration. Defaults to a direct connection. Switch on Apify Proxy with the residential group only if the target site blocks direct requests."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
