Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For most teams, the best website capture approach is a hosted screenshot API. It removes browser installation, navigation, scaling, and failure handling from your application. Use local Playwright when you need complete control over Chromium, network traffic, and artifacts inside your own infrastructure. Use a focused URL-to-image service for simple previews; choose a broader browser platform when you also need PDFs, scraping, sessions, or CDP access.

ScreenshotNeo is the first API to try when clean, production-ready captures matter: consent banners, newsletter popups, and chat widgets are removed before capture, and failed or unusable pages are not billed.

Choose the execution model before choosing a product

Website capture is not just “save the pixels at a URL.” A reliable job must launch or reach a browser, wait for JavaScript, handle redirects and cookies, trigger lazy loading, select the correct viewport, and return an image or document. Your first decision is who owns that work.

Hosted browser or screenshot API

A hosted service runs the browser remotely and exposes an HTTPS endpoint, SDK, webhook, or browser connection. Your code sends capture instructions and receives an image, PDF, or metadata. This is usually the shortest path for preview cards, report attachments, scheduled archives, and user-submitted URLs. The provider owns browser binaries, patching, concurrency, and most navigation failures.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Self-managed Playwright

Running Playwright in your process or CI job gives you direct control over Chromium, context state, proxying, request interception, and where files are stored. It also makes you responsible for browser downloads, memory limits, parallelism, sandboxing, retries, and upgrades. shot-scraper is an open-source Playwright-based option designed for repeatable jobs and GitHub Actions.

Direct browser-control platforms

Some hosted products expose more than a screenshot endpoint. Browserless documents REST endpoints as well as Playwright, Puppeteer, and Chrome DevTools Protocol (CDP) connections. That model suits teams that need screenshots alongside scraping, custom functions, browser sessions, or interactive automation.

Best website capture APIs and tools

The right choice depends on output, control, and operational ownership. ScreenshotNeo ranks first for a clean, developer-oriented capture API; the other tools below are strong fits for different requirements.

Tool Execution and integration Capture and output capabilities documented Best fit
1. ScreenshotNeo Hosted GET API plus an MCP server for AI agents PNG, JPEG, WebP, PDF; full-page and CSS-selector capture; JavaScript, waits, cookies, headers, blocking, devices, geolocation, signed links, async jobs, bulk capture, and usage API Clean screenshots with no charge for bot checks, blank pages, failed loads, timeouts, or cache hits; the lowest paid plan in this comparison
2. Browserless REST API, WebSocket CDP, and Playwright/Puppeteer connections PNG, JPEG, WebP screenshots; full-page, selector, viewport and clip controls; PDFs, scraping, downloads, custom functions, unblocking, crawls, and sessions Hosted Chromium with direct automation control
3. Urlbox Render links plus synchronous or asynchronous JSON APIs and webhook-oriented workflows Screenshots, PDFs, videos, extracted text, HTML, and metadata; full-page, element capture, and scroll/stitch behavior Workflows that produce several rendered or extracted artifacts
4. ScreenshotOne Simple HTTPS GET or POST URL or supplied HTML to PNG or JPEG; selectors, full-page behavior, and alternative element-capture algorithms A small URL/HTML-to-image integration
5. shot-scraper Local or CI-managed Playwright automation Repository-owned screenshot jobs and GitHub Actions workflows Open-source, versioned artifacts and infrastructure you control

Pricing, quotas, latency, regional rendering, retention, and legal terms for the services other than ScreenshotNeo are not established here; verify them on the provider’s current documentation before committing to a design.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Requirements that change the implementation

Full page versus one element

A viewport screenshot captures what fits in the browser window. A full-page capture must represent content below the fold, often by scrolling and stitching sections or by using the browser’s native full-page mode. An element capture waits for a selector and crops to its bounding box. Treat these as separate requirements: a full-page setting does not automatically produce a precise card, chart, or invoice crop.

JavaScript and lazy-loaded content

Server-rendered HTML may be visible immediately, while a single-page app needs navigation and rendering time. Images and components may load only after they enter the viewport. Use a selector wait, a deliberate delay, or network-idle logic, then scroll long pages to trigger lazy loading. Browserless documents scrolling before capture; Urlbox documents a scroll step and a default stitch mode, with a faster native browser mode.

Output type

Choose the artifact your consumer actually needs:

  • PNG: lossless UI, diagrams, and text-heavy images.
  • JPEG: smaller photographic previews where slight compression is acceptable.
  • WebP: compact web delivery when your clients support it.
  • PDF: paginated invoices, reports, and print-oriented documents.
  • Video, HTML, text, or metadata: available in broader workflows such as Urlbox or Browserless, not in every screenshot API.

Synchrony and volume

A synchronous request is simplest when the caller can wait for the binary response. Use an asynchronous job and webhook when rendering may take longer than your request budget or when you process many URLs. Bulk capture is useful for catalogs and archives, but add queue limits and idempotent job IDs so retries do not duplicate downstream work.

DIY: capture a JavaScript-heavy page with Playwright

This Node.js example launches Chromium, waits for the page to settle, scrolls through the document to trigger lazy-loaded elements, and writes a full-page PNG. It is a good baseline for a self-managed worker or CI job.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  1. Install Playwright: npm install playwright.
  2. Install the browser binary: npx playwright install chromium.
  3. Save the following as capture.mjs and run node capture.mjs https://example.com.
import { chromium } from 'playwright';

const url = process.argv[2];
if (!url) throw new Error('Usage: node capture.mjs https://example.com');

const browser = await chromium.launch();
const context = await browser.newContext({
  viewport: { width: 1440, height: 900 },
  deviceScaleFactor: 1
});
const page = await context.newPage();

await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {});

// Trigger intersection-observer and scroll-based lazy loading.
await page.evaluate(async () => {
  await new Promise(resolve => {
    let y = 0;
    const step = Math.max(400, window.innerHeight - 100);
    const timer = setInterval(() => {
      window.scrollBy(0, step);
      y += step;
      if (y >= document.body.scrollHeight) {
        clearInterval(timer);
        window.scrollTo(0, 0);
        resolve();
      }
    }, 100);
  });
});

await page.screenshot({ path: 'shot.png', fullPage: true, animations: 'disabled' });
await browser.close();

For deterministic output, set a fixed viewport, timezone, locale, and device scale factor. Wait for a meaningful selector such as [data-rendered="true"] rather than assuming a fixed delay. If animations change the frame, disable them with an injected stylesheet or the screenshot option. Keep authentication in a browser context, not in a URL query string, and remove secrets from logs.

Capture one element instead of the whole document

Replace the final screenshot call with a locator. The locator waits for the element and crops to its rendered bounds:

const card = page.locator('.pricing-card').first();
await card.waitFor({ state: 'visible', timeout: 15000 });
await card.screenshot({ path: 'pricing-card.png' });

Produce a PDF

PDF output is a print layout, not simply a tall image. Configure paper size, margins, orientation, and page ranges for the document you are generating:

await page.pdf({
  path: 'report.pdf',
  format: 'A4',
  printBackground: true,
  margin: { top: '12mm', right: '12mm', bottom: '12mm', left: '12mm' }
});

Or skip the browser setup

ScreenshotNeo accepts one GET request and returns a PNG, JPEG, WebP, or PDF. Its capture pipeline can accept the consent banner like a visitor, then remove more than 60 known consent platforms plus newsletter popups and chat widgets before the shot. Each response identifies the page verdict and billing result with X-Page-Verdict and X-Billed headers.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use the complete option reference at ScreenshotNeo’s documentation. The basic calls below are runnable as written after you replace the key.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', data));

ScreenshotNeo exposes 63 options, including full-page capture with lazy images loaded; CSS-selector element capture; dark mode; 12 device presets or any viewport; retina scale; PDF paper size, margins, landscape, and page ranges; HTML/CSS-to-image; custom JavaScript and CSS; clicking before capture; hidden selectors; waits for a selector, delay, or network idle; blocking ads, trackers, requests, or resource types; custom headers, cookies, user agents, and Authorization; timezone and geolocation; transparent backgrounds; resizing; a caller-chosen cache TTL; signed links for public <img> tags; asynchronous jobs with signed webhooks; bulk capture of up to 100 URLs per call; a usage API; and an OpenAPI specification. Parameter names used by other screenshot APIs also work, which can simplify migration.

ScreenshotNeo also provides an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing; only clean shots are billed. Plans include 1,000 shots per month free with no card, then Starter at $5 for 3,000, Growth at $15 for 15,000, Pro at $39 for 60,000, Scale at $99 for 250,000, and Business at $249 for 1,000,000. Yearly billing gives two months free, and every feature is available on every plan. Create a free ScreenshotNeo account to start with 1,000 screenshots a month and no card.

Reliability, performance, and cost decisions

Make jobs repeatable

  • Pin viewport, scale, locale, timezone, and color scheme.
  • Wait for a semantic ready signal or selector; use a maximum timeout as a safety net.
  • Record the target URL, capture options, timestamp, response status, page verdict, and output hash.
  • Retry transient navigation failures with exponential backoff, but do not retry a deterministic 404 or an authentication failure indefinitely.
  • Use idempotency in your queue so a webhook or worker restart cannot publish the same artifact twice.

Control resource use

Full-page stitching and very tall documents consume more memory than a viewport shot. Limit maximum dimensions, split exceptionally long reports, and avoid running too many local Chromium processes per container. Block advertising, analytics, fonts, or media only when doing so does not change the page you intend to document. A cache with an explicit TTL can reduce duplicate work for unchanged URLs; invalidate it when content or credentials change.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Protect users and your infrastructure

Treat submitted URLs as untrusted input. Restrict schemes to HTTP and HTTPS, prevent access to internal address ranges in self-managed deployments, cap redirects, and avoid returning response bodies or cookies to clients that should not see them. Hosted services can reduce this operational burden, but you still need authorization, URL validation, and retention rules in your application.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshooting common failures

The image is blank or shows a loading shell

The page may require JavaScript, a selector wait, or additional time after network idle. Wait for the component that proves the app rendered, scroll to trigger lazy loading, and verify that required API requests are not blocked.

Cookie banners, popups, or chat cover the content

In Playwright, locate and dismiss the consent control before capture or hide known selectors. A hosted clean-capture pipeline such as ScreenshotNeo can accept consent and remove supported consent platforms, newsletter popups, and chat widgets before billing the shot.

The bottom of a long page is missing

Use full-page mode and scroll before capture. For pages whose height changes while images load, wait after the final scroll and check the document height again. Urlbox’s documented stitch mode and Browserless’s scrolling behavior address this class of page; native full-page mode is faster when the browser renders the entire layout correctly.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The selector cannot be found

Confirm that the selector exists in the rendered DOM, not only in server HTML. If the target is inside an iframe or shadow root, address that context explicitly. Increase the wait only after checking that the URL, authentication, and responsive breakpoint are correct.

Fonts or colors differ between runs

Use a fixed browser image, viewport, device scale factor, locale, timezone, and color scheme. Wait for fonts before capture and avoid comparing screenshots produced by different browser versions as if they were pixel-identical.

Best Value
Sale
The Microsoft Office 365 Bible: The Most Updated and Complete Guide to Excel, Word, PowerPoint, Outlook, OneNote, OneDrive, Teams, Access, and Publisher from Beginners to Advanced
  • The Microsoft Office 365 Bible: The Most Updated and Complete Guide to Excel, Word, PowerPoint, Outlook, OneNote, OneDrive, Teams, Access, and Publisher from Beginners to Advanced
  • ABIS BOOK

A request times out or is rejected

Check DNS, redirects, TLS, robots or access controls, and the page’s bot challenge. Do not claim universal anti-bot bypass: provider documentation describes capabilities, not guaranteed success against every protection. Increase the timeout only when the page is legitimately slow, and classify repeated failures so they do not become an expensive retry loop.

The PDF has unexpected page breaks

Set paper size, margins, orientation, print backgrounds, and page ranges deliberately. A responsive screen layout may need print CSS or a dedicated report template; a screenshot and a paginated PDF are different artifacts.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A practical decision checklist

  • Need a clean URL-to-image endpoint with no browser fleet? Start with ScreenshotNeo.
  • Need hosted Chromium plus CDP, Playwright, Puppeteer, scraping, or sessions? Evaluate Browserless.
  • Need screenshots together with PDFs, video, HTML, text, or metadata and webhook workflows? Evaluate Urlbox.
  • Need only URL or HTML to PNG/JPEG over simple GET or POST? Evaluate ScreenshotOne.
  • Need repository-owned execution and GitHub Actions artifacts? Use shot-scraper or direct Playwright.
  • Need a precise card, chart, or invoice region? Require selector capture, not only full-page mode.
  • Need predictable recurring archives? Add fixed rendering settings, cache policy, retries, and artifact checksums.

Frequently Asked Questions

Can a screenshot API capture a page behind authentication?

Yes, when the service or browser workflow supports custom cookies, headers, or Authorization. Keep credentials in secret storage and verify that the resulting artifact is not publicly exposed.

When should I store screenshots as files versus object storage?

Keep small, short-lived artifacts on local disk only for the duration of a job. For reports, archives, or asynchronous workflows, upload the result to controlled object storage and retain the URL and capture metadata separately.

Is a full-page screenshot suitable for visual regression testing?

It can be, but stable viewport, fonts, browser version, animations, dynamic data, and timing are essential. Component-level or selector captures often produce less noisy diffs than an entire page.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.