ScreenshotNeo

BlogComparisons

CaptureKit Alternatives for Full-Page Website Screenshots

Compare CaptureKit alternatives for full-page website screenshots, including hosted APIs and Playwright. Learn how to handle lazy-loaded content and choose a capture workflow.

By the ScreenshotNeo team4 October 20269 min read

If you need a full-page website screenshot API, the documented alternatives to CaptureKit include ScreenshotNeo, Urlbox, ScreenshotOne, and Browserless. Playwright is the do-it-yourself option for teams that want to run their own browser capture workflow. These products document relevant capture capabilities, but the available evidence does not establish a winner for price, speed, uptime, or reliability.

Choose based on what you need to capture: a viewport, an entire scrollable page, or a particular element. For long pages, also check how the tool handles content that only loads when the page scrolls. A full-page option by itself does not guarantee that every lazy-loaded image or section has appeared before the screenshot.

What CaptureKit alternatives should you compare?

CaptureKit describes its screenshot endpoint as a browser-like way to capture a URL in PNG, JPEG/JPG, WebP, or PDF, with full-page and element capture. The alternatives below are supported by their official documentation for at least one relevant full-page workflow. Product documentation establishes capabilities; it does not provide a reproducible head-to-head comparison.

Option Documented full-page approach Lazy-loaded content and long pages Best fit to investigate
ScreenshotNeo Full-page capture with lazy images loaded Offers controls for waiting, including a selector, delay, or network idle; individual options can be configured Try first if you want a hosted API with consent-banner cleanup, response verdict and billing headers, or an MCP server for AI agents
Urlbox Set full_page to true Its default workflow scrolls to the bottom before capture to allow lazy content to load and determine the page height. skip_scroll: true disables that scroll; Urlbox says this can save time depending on page height. Evaluate when you want a hosted API and its documented scroll behavior suits your page
ScreenshotOne Start with full_page=true Documents viewport, scrolling, waiting, motion-reduction, and alternative algorithm controls. Its by_sections algorithm captures sections and combines them into one image, scrolling automatically. Evaluate when you need to tune full-page behavior or want to investigate section-based capture
Browserless Its REST API example sets fullPage: true Its FAQ documents scrollPage: true for scrolling before capture to trigger lazy-loaded content; use with full-page mode. Evaluate when a hosted REST API and its documented screenshot options fit your workflow
Playwright Supports full-scrollable-page screenshots You control the browser workflow and can implement scrolling, waiting, and page-specific handling in your own code. Use when you want to build and operate the capture process yourself

For Urlbox, ScreenshotOne, Browserless, and Playwright, the documentation referenced here establishes the behaviors summarized above. Check each provider’s current official documentation for request syntax, authentication, output formats, quotas, and prices before choosing. Comparable plan prices, latency, uptime, and benchmark results were not established by the available research.

How to choose an alternative

  1. Define the capture target. Decide whether you need the visible viewport, the entire scrollable page, or one element. Confirm that the chosen tool supports that mode.
  2. Check content loading. If important content appears below the fold, look for a documented scroll-before-capture behavior or implement one. Test pages with lazy images, infinite feeds, and sections that load after interaction.
  3. Consider page length. A single full-page capture and a section-based capture-and-combine workflow can behave differently on very long pages. ScreenshotOne documents a section-based option; compare the result on your own layouts.
  4. Choose hosted or DIY. A hosted API provides a service endpoint for captures. Playwright is software for building your own browser workflow. The latter gives you control over the workflow, while your team takes on operating it; this is a category-level tradeoff, not a measured cost comparison.
  5. Verify operational details. Check formats, authentication, request limits, pricing, and any required controls in current official documentation. Do not infer service quality from a feature list.
  6. Test representative pages. Include a short page, a very long page, a page with lazy images, and any page that requires authentication or custom waits. Compare completeness and repeatability, not just whether a request returned an image.

DIY full-page screenshots with Playwright

Playwright supports viewport, element, and full-scrollable-page screenshots. The example below captures the full page at a fixed viewport. It uses the official Playwright package and its documented fullPage screenshot option. Install the package and browser using Playwright’s documented setup for your environment before running it.

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: true });
  try {
    const page = await browser.newPage({
      viewport: { width: 1440, height: 900 }
    });
    await page.goto('https://example.com', { waitUntil: 'load' });
    await page.screenshot({ path: 'full-page.png', fullPage: true });
  } finally {
    await browser.close();
  }
})();

Save this as capture.js and run it with Node.js after installing Playwright and its browser. Replace the example URL with a page you are authorized to capture. The load event means the page load event fired; it does not prove that every application-specific request or lazy image has finished.

Wait for the content your page needs

For pages with known lazy content, add a page-specific wait before taking the screenshot. For example, wait for a selector that only appears when the target content is ready:

await page.goto('https://example.com', { waitUntil: 'load' });
await page.locator('.article-content img').last().waitFor({ state: 'visible' });
await page.screenshot({ path: 'full-page.png', fullPage: true });

That selector is an example and must match the site being captured. A selector wait can fail when the selector is absent, hidden, or never becomes visible. For pages that load content only after scrolling, a workflow may need to scroll through the page and wait for content before capturing. There is no universal wait that guarantees every site’s lazy-loading logic has completed.

Capture one element instead

If you only need a card, chart, or article region, use a locator screenshot rather than a full-page image:

const target = page.locator('main article');
await target.waitFor({ state: 'visible' });
await target.screenshot({ path: 'article.png' });

Use a selector that uniquely identifies the intended element. If the locator matches multiple elements or the element is outside the visible area, adjust the selector or bring it into view before capture.

DIY reliability and operating considerations

  • Close the browser in a finally block so it is shut down if navigation or capture fails.
  • Set explicit navigation and selector timeouts appropriate to the pages you capture, and handle timeout errors in the surrounding application.
  • Choose a fixed viewport when screenshots must be comparable across runs. Responsive layouts can change substantially with viewport width.
  • Use a fresh browser context when you need isolation between jobs. If a page needs a login, provide the required session state through your own secure workflow.
  • Plan for browser installation, process limits, memory use, retries, and temporary files in the environment where the script runs. The research does not establish a quantified operating cost for a Playwright setup.

Or skip the browser setup

ScreenshotNeo is the first alternative to try if you want a hosted full-page screenshot API: it loads lazy images, removes known consent banners, newsletter popups, and chat widgets before capture, and only bills clean shots. Bot checks, blank pages, failed loads, timeouts, and cache hits cost nothing; responses identify the page verdict and billing status in headers. It also provides an MCP server with take_screenshot, get_page_info, and capture_pdf tools for AI agents.

One GET request returns an image or PDF. This example requests a WebP screenshot of a page. See the ScreenshotNeo API documentation for the available parameters and options.

cURL

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

Python

import requests

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

Node.js

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

These examples use the same request shape with an example target URL. Protect the API key as a secret, check the response status before treating its body as an image, and consult the docs for format selection and the other capture controls.

ScreenshotNeo includes full-page capture with lazy images loaded, element capture by CSS selector, 12 device presets and custom viewports, dark mode, retina scale, custom CSS and JavaScript, selector hiding, pre-capture clicks, wait controls, request and resource blocking, custom headers, cookies, user agent and Authorization, timezone, geolocation, transparent backgrounds, resizing, caching with a chosen TTL, signed links for public image tags, async jobs with signed webhooks, bulk capture up to 100 URLs per call, a usage API, and an OpenAPI spec. PDF options include paper size, margins, landscape, and page ranges. It also accepts parameter names used by other screenshot APIs to make switching easier. Each feature is available on every plan.

Pricing is Free for 1,000 shots per month with no card; Starter is $5 for 3,000; Growth is $15 for 15,000; Pro is $39 for 60,000; Scale is $99 for 250,000; and Business is $249 for 1,000,000. Yearly billing gives two months free. Sign up for 1,000 free screenshots a month with no card.

Common full-page screenshot problems

Symptom Likely cause What to try
Images or sections near the bottom are missing They load only after scrolling, or the capture starts before they are ready Use a documented scroll-before-capture option, add a page-specific wait, or scroll through the page in your Playwright workflow. Verify the target content is present before capture.
The screenshot is shorter than expected The page had not finished rendering, or the capture height was determined before dynamic content appeared Wait for a stable page-specific selector or completion condition, then capture. For Urlbox, note that skip_scroll disables its default initial scroll.
A very long page produces an unwieldy image Full-page output combines a large vertical page into one image Consider whether you need the entire page or selected sections. ScreenshotOne documents a section-based capture-and-combine algorithm; inspect the output on your own page.
Capture hangs or times out The site may keep network activity open, delay rendering, or fail to reach the wait condition Use a bounded, relevant wait rather than assuming all network activity will stop. Check the provider’s current timeout and wait options. In Playwright, handle navigation and selector timeouts explicitly.
Element screenshot is blank or targets the wrong region The selector is incorrect, ambiguous, hidden, or not yet rendered Use a selector unique to the intended element, wait for it to become visible, and verify the page state before capture.
Output differs between runs Responsive layout, animation, changing content, or different load timing Keep viewport and wait conditions consistent. Where supported, consider motion-reduction controls and page-specific stabilization.
API response is not an image Authentication, URL encoding, request options, or a failed capture may be involved Check HTTP status and response headers, confirm the target URL is encoded correctly, and consult the service’s current error documentation. For ScreenshotNeo, inspect X-Page-Verdict and X-Billed to understand the result.

Performance, reliability, and cost

Full-page capture can require more work than a viewport screenshot because the browser must render a taller document and may need to scroll to trigger lazy content. Urlbox explicitly notes that its initial scroll behavior can affect time depending on page height. ScreenshotOne documents scrolling and section-based capture controls, while Browserless documents a scroll option for lazy loading. These are workflow details, not comparative speed benchmarks.

For a reliable workflow, define the content that must be present, use bounded waits, and check whether the page actually reached that state before accepting the image. Retry only failures that may be transient, and keep retries bounded so a broken or slow target does not create an endless job. For high-volume capture, verify current quotas and pricing directly with each service. The research does not support comparing the services’ costs or uptime.

ScreenshotNeo’s stated pricing ranges from a free allowance of 1,000 shots monthly to paid plans beginning at $5 for 3,000 shots. Its billing behavior excludes bot checks, blank pages, timeouts, failed loads, and cache hits; inspect each response’s verdict and billing headers when accounting for captures. These are product-specific facts, not a comparison with competitors.

FAQ

Does full-page mode guarantee lazy-loaded images appear?

No. Lazy loading may depend on scrolling or other page-specific behavior. Check the capture tool’s documented loading workflow and verify the resulting image.

Which alternative has the best performance?

The available documentation does not establish a benchmark or performance ranking. Page behavior, height, and wait conditions affect capture, so compare representative URLs under your own requirements.

Should I use a hosted API or Playwright?

Use a hosted API when you want to make capture requests to a service endpoint. Use Playwright when your team wants to build and operate its own browser capture workflow. Choose after accounting for your control, integration, and operations needs.

Can I capture only part of a page?

Yes. CaptureKit and Browserless document element capture, and Playwright supports element screenshots. ScreenshotNeo also supports capture by CSS selector.

Can these tools produce PDFs?

CaptureKit documents PDF output, and ScreenshotNeo supports PDF capture with paper size, margins, landscape, and page-range options. Confirm other providers’ current format support in their official documentation.