🔥 Website Screenshot Generator — Full-Page, Bulk & Mobile avatar

🔥 Website Screenshot Generator — Full-Page, Bulk & Mobile

Pricing

from $3.00 / 1,000 results

Go to Apify Store
🔥 Website Screenshot Generator — Full-Page, Bulk & Mobile

🔥 Website Screenshot Generator — Full-Page, Bulk & Mobile

Capture full-page, viewport, or element screenshots of any website as PNG, JPEG, WebP, or PDF. Bulk-process hundreds of URLs, emulate mobile devices (iPhone, iPad, Android), dismiss cookie banners, block ads, inject CSS, and extract page metadata — all via API or no-code UI.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

extractmaster01

extractmaster01

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

2

Monthly active users

2 days ago

Last modified

Share

Website Screenshot Generator

Capture high-quality screenshots of any website at scale. Generate full-page screenshots, viewport screenshots, or capture a specific page element. Supports desktop and mobile devices, with output in PNG, JPEG, WebP, or PDF.

Perfect for website monitoring, SEO audits, QA testing, competitor tracking, visual regression testing, website archiving, and thumbnail generation.


Why this Actor

Most screenshot tools give you a raw image and stop there. This one delivers results that are actually ready to use:

  • Mobile screenshots that look right — sites respond with their actual mobile layout, not a squished desktop version
  • PDFs that match what you see in the browser — no layout surprises, no font changes
  • Clean images by default — cookie banners, popups, and overlays are handled before capture
  • Metadata included in every result — title, description, Open Graph tags, and canonical URL come with each screenshot at no extra step

What you can capture

  • Full page — the entire content from top to bottom, including what's below the fold
  • Viewport — only what's visible on screen when the page first loads
  • Element — a single part of the page by CSS selector: a chart, a hero image, a pricing card

Features

  • 11 device presets — iPhone 15 Pro, iPhone 14, iPhone SE, Pixel 7, Samsung Galaxy S23, iPad Pro, iPad Mini, and 4 desktop sizes; or set any custom width and height
  • 4 output formats — PNG, JPEG, WebP, and PDF
  • Lazy content support — captures images and content that only appear after scrolling
  • Smart wait — knows when the page has truly finished loading before capturing
  • Carousel and slider support — captures animated sections at their best visible state
  • Cookie banner auto-dismiss — covers OneTrust, Didomi, Cookiebot, CookieYes, Quantcast, and more
  • Element hiding — remove any element before capture: chat widgets, floating banners, overlays
  • Ad and tracker blocking — cleaner screenshots with distractions removed
  • Dark mode support — captures the dark version of any site that supports it
  • Custom CSS — override any style before the screenshot is taken
  • Authenticated pages — pass session cookies to capture logged-in or personalized content
  • Custom HTTP headers — add tokens, flags, or any header your target site needs
  • Redirect tracking — records both the original URL and the final destination
  • Batch processing — up to 1,000 URLs per run with adjustable concurrency
  • Retry on failure — automatically retries flaky or slow pages (up to 5 retries, 3 by default)
  • Every URL accounted for — each input URL returns exactly one row: a screenshot, or an error row explaining why it failed
  • HTTP status in every result — spot 404s, 500s, and broken redirects without opening the image
  • Apify Proxy support — for sites that block automated requests

Use cases

Website monitoring — schedule regular runs to detect visual changes, layout breaks, or content updates. Every run creates a timestamped archive you can compare over time.

Competitive intelligence — capture competitor landing pages, pricing pages, and product listings at scale. No manual browsing.

QA and visual testing — verify how your site looks across iPhone, Android, and desktop before every release.

Thumbnail and preview generation — generate website preview images for link cards, OG images, or any product that needs a visual of a URL.

SEO and content audits — get a screenshot and full metadata for hundreds of URLs in a single run.

Compliance and archiving — save visual records of web pages for legal, regulatory, or historical purposes.

Bug reporting — document rendering issues across viewports and send a link, not a description.


Quickstart

  1. Add one or more URLs to the urls field
  2. Choose a device preset and output format
  3. Click Start — results appear in the dataset as they complete

Each URL produces one dataset row: a public screenshot URL with page metadata, or an error row if the page could not be loaded. Export as JSON, CSV, or Excel.


Input

FieldTypeDefaultDescription
urlsURL[]—URLs to capture. Required.
screenshotTypestringfullPagefullPage, viewport, or element
formatstringpngpng, jpeg, webp, or pdf
qualityinteger85Quality for JPEG and WebP (1–100). Ignored for PNG and PDF.
devicestringDesktop 1920x1080Device preset. See table below. Use custom for manual dimensions.
viewportWidthinteger1280Width in pixels. Only when device is custom.
viewportHeightinteger1080Height in pixels. Only when device is custom.
selectorstring—CSS selector. Required when screenshotType is element.
waitUntilstringloadload, domcontentloaded, networkidle, networkidle0, networkidle2
waitForSelectorstring—Wait for this element to appear before capturing.
delayinteger0Extra wait in ms before capture. Max 3,600,000.
waitForImagesbooleanfalseWait for all images to load. Recommended for carousels and galleries.
scrollToBottombooleanfalseScroll to the bottom before capturing.
delayAfterScrollinginteger2500Wait in ms after scrolling. Used when network idle is off.
waitUntilNetworkIdleAfterScrollbooleanfalseWait for the page to settle after scrolling instead of a fixed delay.
waitUntilNetworkIdleAfterScrollTimeoutinteger30000Max ms to wait after scrolling.
blockCookieBannersbooleantrueAuto-dismiss cookie banners before capture.
selectorsToHidestring—CSS selectors to hide before capture. e.g. .chat-widget, #cookie-bar
blockAdsbooleanfalseRemove ads and trackers before capturing.
darkModebooleanfalseCapture the site in dark mode.
javascriptbooleantrueRun JavaScript on the page. Disable for faster captures on static sites.
extractMetadatabooleantrueInclude title, description, OG tags, canonical URL, and language in results.
customHeadersobject{}HTTP headers to send. e.g. {"Authorization": "Bearer TOKEN"}
cookiesarray[]Cookies to inject before navigating. Each needs name, value, and domain.
injectCssstring—CSS to apply before capture.
timeoutinteger30000Max time in ms for the page to load (5,000–120,000). If it doesn't load in time, the attempt fails and is retried.
maxRetriesinteger3Retries per failed URL (0–5). Retries are not charged.
maxConcurrencyinteger3Simultaneous pages. Higher is faster but uses more memory.
maxItemsinteger—Stop after this many screenshots. Leave empty for no limit.
proxyConfigurationobject—Apify Proxy or custom proxy URL.

Device presets

PresetViewportMobileTouch
Desktop 1920x10801920×1080——
Desktop 1440x9001440×900——
Desktop 1280x8001280×800——
Laptop 1366x7681366×768——
iPhone 15 Pro393×852✓✓
iPhone 14390×844✓✓
iPhone SE375×667✓✓
Pixel 7412×915✓✓
Samsung Galaxy S23360×780✓✓
iPad Pro 12.91024×1366—✓
iPad Mini768×1024—✓
customviewportWidth × viewportHeight——

Output

Each URL produces exactly one row in the default dataset:

  • Captured page (success: true) — the image is saved in the Key-Value Store and the row links to it.
  • Failed URL (success: false) — the page could not be loaded after all retries (timeout, DNS error, refused connection, blocked). The row explains why.

Filter by success to separate the two. Error rows count as results for billing because they use the same browser time as a capture (see Pricing).

Pages that load with an HTTP error are still captured. A 404 or 500 page is a real page, so you get its screenshot with success: true and the status in statusCode. Filter statusCode >= 400 to find broken links.

The exceptions are 401, 403, and 429: they usually mean the site is blocking automated visitors, so the URL is retried. If it is still blocked after all retries, you get an error row with errorType: "blocked".

Captured page rows (success: true)

FieldTypeDescription
startUrlstringOriginal input URL
urlstringFinal URL after redirects
screenshotUrlstringPublic direct-download link
screenshotKeystringKey in the Key-Value Store
formatstringpng, jpeg, webp, or pdf
screenshotTypestringfullPage, viewport, or element
viewportobject{ width, height } used for capture
devicestringDevice preset name
titlestringPage title
descriptionstringMeta description
ogTitlestringOpen Graph title
ogImagestringOpen Graph image URL
ogDescriptionstringOpen Graph description
canonicalUrlstringCanonical URL
languagestringPage language
statusCodenumberHTTP status of the captured page after redirects (e.g. 200, 404, 500)
timestampstringISO 8601 capture time
successbooleanAlways true

Error rows (success: false)

FieldTypeDescription
startUrlstringOriginal input URL
urlstringURL that failed
screenshotUrlnullNo screenshot was produced
successbooleanAlways false
errorstringError message after all retries
errorTypestringtimeout, dns, connection, blocked, or other
retryCountnumberRetries attempted before giving up
timestampstringISO 8601 time of final failure

Sample output

{
"startUrl": "https://example.com",
"url": "https://example.com/",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/screenshot_example_com_a1b2c3d4.png",
"screenshotKey": "screenshot_example_com_a1b2c3d4.png",
"format": "png",
"screenshotType": "fullPage",
"viewport": { "width": 1920, "height": 1080 },
"device": "Desktop 1920x1080",
"title": "Example Domain",
"description": "This domain is for use in illustrative examples.",
"ogTitle": null,
"ogImage": null,
"canonicalUrl": "https://example.com/",
"language": "en",
"statusCode": 200,
"timestamp": "2026-01-15T12:00:00.000Z",
"success": true
}

Sample error row

{
"startUrl": "https://slow-site.example",
"url": "https://slow-site.example",
"screenshotUrl": null,
"screenshotKey": null,
"success": false,
"error": "page.goto: Timeout 30000ms exceeded.",
"errorType": "timeout",
"retryCount": 3,
"timestamp": "2026-01-15T12:01:30.000Z"
}

A copy of each error is also saved in the run's Key-Value Store as FAILED-0001, FAILED-0002, and so on.


Tips

JavaScript-heavy sites and SPAs: Use waitUntil: "networkidle" for React, Vue, and Angular apps. The default (load) works for most sites — switch to networkidle only if content is missing after capture.

Lazy-loaded content: Enable scrollToBottom: true. Add waitUntilNetworkIdleAfterScroll: true for the smartest possible wait — no fixed delay needed.

Carousels, sliders, and hero animations: Enable waitForImages: true to make sure every visual element is ready before the screenshot is taken.

Cookie banners not auto-dismissed: Add the banner's CSS selector to selectorsToHide. For example: .cookie-overlay, #consent-modal.

Authenticated pages: Pass session cookies in the cookies field. Get them from your browser's DevTools after logging in (Application → Cookies).

Mobile screenshots: Pick a device preset. The site will respond as if a real phone is visiting — you get the actual mobile layout, not a resized desktop.

Bot detection: Enable Apify Proxy (residential) in proxyConfiguration for sites that block automated visitors.

Large file sizes: Use format: "webp" for the smallest files, or format: "pdf" for printable output.

Cost control: Set maxItems to limit the total screenshots per run, and set a maximum cost per run in Apify Console. Adjust maxConcurrency based on available memory.

Lists with many dead or slow URLs: Lower maxRetries (0 or 1) and timeout (e.g. 15000). Failed URLs then return an error row in seconds instead of retrying.

Slow sites that time out: Increase timeout (up to 120000) before increasing maxRetries. A longer wait usually fixes slow pages; extra retries just repeat the same wait.

Capturing one section of a page: Use screenshotType: "element" with a selector like #pricing-table or .hero-section.


Pricing

This Actor uses pay-per-event pricing. You pay for:

EventPriceWhen it is charged
Result$3.00 per 1,000Once per dataset row: a captured screenshot, or an error row for a URL that still failed after all retries
Actor start$0.01 per GB of run memoryOnce per run (e.g. $0.04 at the default 4 GB)
  • Retries are never charged. A failed URL costs one result, no matter how many retries it took.
  • Spending limit: the Actor stops automatically when it reaches the maximum cost per run you set in Apify Console.
  • Small runs: for a handful of simple pages you can lower the run memory (minimum 1 GB) to reduce the start fee. Keep 4 GB for full-page captures of heavy sites or maxConcurrency above 3.

Limitations

  • Sites with aggressive bot protection may require residential proxies
  • Very long pages produce large PNG files — use WebP or PDF for those
  • Cookie injection works for session-based authentication only; it cannot fill and submit a login form

API usage

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('extractmaster01/website-screenshot-generator').call({
urls: [
{ url: 'https://example.com' },
{ url: 'https://news.ycombinator.com' },
],
screenshotType: 'fullPage',
format: 'png',
device: 'iPhone 15 Pro',
blockCookieBanners: true,
waitForImages: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const captured = items.filter((item) => item.success);
const failed = items.filter((item) => !item.success);
console.log(captured.map((item) => item.screenshotUrl));
console.log(failed.map((item) => `${item.url}: ${item.errorType}`));

Scheduling

Go to Schedules in the Apify Console, point it at this Actor, and set your cron expression. Every run produces a new timestamped set of screenshots — useful for visual monitoring over time.


Frequently asked questions

Do I get charged if a page fails? Each URL that still fails after all retries is returned as one error row (success: false) and charged as one result, because it used the same browser time. Retries are never charged. Set maxRetries to 0 to fail fast.

Why did I get a screenshot of a "404 Not Found" page? The site answered with an error page, and that page was captured. Check statusCode in the row. Filter statusCode >= 400 to find broken links. (401, 403, and 429 responses are treated as blocking instead and end as error rows if they persist.)

How do I know why a URL failed? Look at the error row: errorType (timeout, dns, connection, blocked, other) and the error message. For timeout, raise timeout. For blocked, enable Apify Proxy.

What is the difference between fullPage and viewport? fullPage captures everything from top to bottom. viewport captures only what is visible when the page first loads.

Can I take mobile screenshots? Yes. Choose any mobile preset and the site will respond with its actual mobile layout.

Why does the PDF look exactly like the screenshot? By design. The PDF preserves the visual appearance of the page as captured, not the browser's print version.

How do I hide a cookie banner? Automatic dismissal is on by default. For anything not covered, add the selector to selectorsToHide.

Can I screenshot a page behind a login? Yes, using session cookies. Pass them in the cookies field after grabbing them from your browser.

How fast does it run? With maxConcurrency: 3, three pages run in parallel. Most complete in 10–40 seconds depending on the site.

What happens to screenshots after the run? They are stored in the run's Key-Value Store. Each dataset row has a screenshotUrl — a direct public link.

Does it work without a proxy? Yes, for most public websites. Enable proxy only if the site blocks automated visitors.


You might also like

If you found this Actor useful, you might also like:

Apify Store Scraper — Extract Actor listings, pricing, ratings, and metadata from the Apify Store. Ideal for market research, competitor tracking, and finding automation opportunities.

Website Contact Scraper — Extract email addresses, phone numbers, and social media links from any website. Great for lead generation and outreach campaigns.

Google Ads Scraper — Collect Google Ads data at scale. See what competitors are bidding on, what creatives they run, and how their ads are structured.


Feedback

Found a bug or want a feature? Open an issue in the Issues tab. We respond within 2 business days.