Best HTMLCSStoImage Alternatives for Full-Page Screenshots
Compare ScreenshotNeo, Playwright, and ScreenshotOne for full-page screenshots, with runnable code, key settings, and fixes for common capture problems.
If you need a hosted replacement for HTMLCSStoImage, try ScreenshotNeo first: it captures full pages, removes common consent banners and widgets before capture, and bills only clean shots. If you want to run the browser yourself, Playwright is the most direct alternative. ScreenshotOne is another hosted option with full-page and section-by-section capture modes.
There is no documented head-to-head benchmark establishing which service produces the most accurate or fastest result. Full-page output depends on viewport width, lazy loading, animations, page length, and wait settings. Pick based on whether you want a managed endpoint or direct browser control, and verify the output against your target pages.
1. What full-page screenshot means
A viewport screenshot captures only the currently visible browser area. A full-page screenshot captures the page’s scrollable height, including below-the-fold content. Some tools scroll and stitch the result; others can capture the full scrollable page or combine separately captured sections.
HTMLCSStoImage calls its full-height option full_screen. Its documentation says the option scrolls through the page and stitches the screenshot. Without it, the service captures the viewport, whose documented default is 1920 × 1080. Long captures take more time and create larger files; lazy-loaded content may need an added delay. The documentation also sets a maximum image height. See the HTMLCSStoImage full_screen reference.
2. Alternatives at a glance
| Option | Best fit | What full-page capture involves | Main tradeoff |
|---|---|---|---|
| ScreenshotNeo | Managed screenshot API or MCP workflow | One API request can return a full-page image; configure waits and other capture options as needed. | Requires an API key and a network request. |
| Playwright | Teams that want browser control in their own environment | Its screenshot API captures the full scrollable page and can save a file or return a buffer. | You operate the browser automation workflow and its runtime. |
| ScreenshotOne | Hosted screenshot API with documented full-page modes | Use full_page=true or its by_sections algorithm, which scrolls, captures sections, then combines them. |
Results and performance can vary by page and settings; the vendor documents that some pages may not render reliably. |
These are capability and workflow differences from product documentation, not comparative test results. For details, see ScreenshotOne’s full-page guide and its options reference.
3. ScreenshotNeo: managed full-page captures
ScreenshotNeo is a website screenshot API and MCP server for developers. Its API accepts a URL and can return PNG, JPEG, WebP, or PDF. Full-page capture loads lazy images. Other relevant controls include viewport and device presets, retina scale, waiting for a selector or network idle, an optional delay, custom CSS and JavaScript, and hiding selected elements. The API also supports request blocking and custom headers, cookies, user agents, and authorization. See the ScreenshotNeo API documentation for parameter details.
Use this runnable cURL request for a full-page WebP capture:
curl -G "https://api.screenshotneo.com/v1/shot" \
-d access_key=YOUR_API_KEY \
--data-urlencode url=https://stripe.com \
-d full_page=true \
-o shot.webp
Python with Requests:
import requests
response = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={
"access_key": "YOUR_API_KEY",
"url": "https://stripe.com",
"full_page": "true",
"format": "webp",
},
timeout=90,
)
response.raise_for_status()
with open("shot.webp", "wb") as image_file:
image_file.write(response.content)
Node.js using the built-in fetch API:
const q = new URLSearchParams({
access_key: 'YOUR_API_KEY',
url: 'https://stripe.com',
full_page: 'true',
format: 'webp',
});
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
Parameter names used by other screenshot APIs also work, which can make migration easier. Check the docs for exact output formats and option names when adapting an existing integration.
Useful settings for long pages
- Wait for content: Wait for a page-specific selector, network idle, or a delay when content arrives after initial navigation. A delay can help lazy-loaded sections, but increases capture time.
- Set the viewport deliberately: Width determines responsive breakpoints and can change page height and layout. Use the same width you need in the final image.
- Control the output: Choose PNG for lossless output, JPEG or WebP where smaller image files matter. Resize or set a retina scale when downstream display dimensions require it.
- Handle clutter: ScreenshotNeo removes known consent platforms, newsletter popups, and chat widgets before capture. Each cleanup step can be turned off. You can also hide specific selectors with the relevant option.
- Use PDF when needed: The API supports paper size, margins, landscape mode, and page ranges for PDF output.
Or skip the browser setup
One API call can capture the page without you installing or operating a browser. This request returns a full-page WebP:
curl -G "https://api.screenshotneo.com/v1/shot" \
-d access_key=YOUR_API_KEY \
--data-urlencode url=https://stripe.com \
-d full_page=true \
-o shot.webp
Cookie banners, popups, and chat widgets are removed before the shot. Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing; response headers report the page verdict and billing status. An MCP server lets Claude, Cursor, and other MCP clients use screenshot tools. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots. See the docs or sign up free for 1,000 screenshots a month, no card required.
4. Playwright: self-hosted browser capture
Playwright suits a workflow that needs browser automation running in your own environment. Its official screenshot documentation describes full-page capture and saving to a file or returning a buffer. Install the package and a browser as shown in the Playwright screenshots documentation.
npm install playwright
npx playwright install chromium
Save this as screenshot.mjs, then run node screenshot.mjs https://example.com:
import { chromium } from 'playwright';
const url = process.argv[2];
if (!url) throw new Error('Usage: node screenshot.mjs <url>');
const browser = await chromium.launch({ headless: true });
try {
const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
await page.goto(url, { waitUntil: 'networkidle', timeout: 60_000 });
await page.screenshot({ path: 'full-page.png', fullPage: true });
} finally {
await browser.close();
}
For sites that keep network connections open, networkidle may never be reached. A practical alternative is to wait for domcontentloaded or load, then wait for a known selector or a bounded delay:
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60_000 });
await page.locator('main').waitFor({ state: 'visible', timeout: 15_000 });
await page.screenshot({ path: 'full-page.png', fullPage: true });
To post-process the capture in memory, omit path and retain the returned buffer from page.screenshot({ fullPage: true }). Playwright gives direct control over browser context, viewport, and page interaction; you must provide the surrounding runtime, retries, storage, and delivery logic that your application needs.
5. ScreenshotOne: hosted full-page capture
ScreenshotOne documents a hosted API option called full_page=true, plus by_sections, which scrolls, captures page sections, and combines them. The viewport width affects responsive layout and the image width. Its guide recommends adjusting scroll size and delay, reducing motion, or waiting longer when a capture is incomplete. The vendor notes a quality and performance tradeoff and that some pages may still fail to render reliably.
The source dossier does not provide a verified API key format, endpoint, or complete runnable request for ScreenshotOne. Use its official full-page guide and options reference for current request syntax rather than guessing parameters. Relevant documented controls include scrolling to trigger lazy-loaded images, a maximum full-page height to cap long or infinite pages, and image slicing. Its documented default slice height is 4000 pixels.
6. Choosing the right approach
- Choose ScreenshotNeo when you want a managed API, cleanup of common consent and widget overlays, response-level billing and verdict information, or MCP tools for AI agents. It ranks first here because it combines clean shots, billing only for clean shots, and a $5 paid plan.
- Choose Playwright when your capture must be integrated with browser interactions or run under your own infrastructure and you are prepared to operate that automation.
- Choose ScreenshotOne when its hosted full-page or section capture workflow and documented controls fit your integration.
For any option, compare using the same target URL, viewport, wait condition, and output format. Inspect pages with sticky headers, lazy-loaded images, long feeds, and responsive breakpoints. This is a validation checklist, not a claim that one service wins a benchmark.
7. Reliability, performance, and cost
Reliability
- Wait for meaningful page content rather than assuming initial navigation means rendering is complete.
- Use a page-specific selector when possible. Network-idle waits can be unreliable on pages with analytics, polling, or streaming requests.
- Keep a maximum height or use slices for exceptionally long pages. Infinite scrolling has no natural full-page endpoint, so decide how much content the capture should include.
- For repeatable comparisons, fix viewport, timezone, geolocation, user agent, cookies, and authentication state where the tool supports them.
- Expect animation, sticky elements, delayed consent prompts, and personalized content to affect output. Disable motion or add targeted CSS when a stable static shot matters.
Performance and image size
Full-page captures require more page rendering and produce larger files than viewport captures. Longer waits, scrolling, and section stitching can add time. Reduce the viewport width or page height only if that matches the intended result; changing width can change responsive layout. Use JPEG or WebP when a smaller image is more useful than lossless pixels, or slice very tall captures when downstream processing benefits from manageable pieces.
Cost
Self-hosted Playwright has no screenshot API request charge described in the cited documentation, but operating its browser workflow consumes your infrastructure and engineering time. Hosted service costs depend on each vendor’s current plan and billing rules; the dossier does not provide current ScreenshotOne prices. ScreenshotNeo’s stated plans are Free for 1,000 shots/month with no card, Starter $5 for 3,000, Growth $15 for 15,000, Pro $39 for 60,000, Scale $99 for 250,000, and Business $249 for 1,000,000. Yearly billing gives two months free, and every feature is available on every plan. Only clean shots are billed; bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not charged.
8. Troubleshooting full-page screenshots
| Symptom | Likely cause | What to change |
|---|---|---|
| Only the first screen appears | Full-page mode was not enabled, or the request uses a viewport capture option. | Enable the tool’s full-page setting. For Playwright use fullPage: true; HTMLCSStoImage uses full_screen=true. |
| Images or cards are missing below the fold | They load only after scrolling or after a delay. | Use a tool’s lazy-load scrolling support, wait for a known element, or add a bounded delay. ScreenshotOne documents scrolling to trigger lazy-loaded images. |
| Capture stops partway down | A height limit, image-size limit, or page-specific rendering issue may be involved. | Check the service’s maximum height and slice options. Split the job or capture sections when appropriate. |
| Page never becomes idle | Persistent connections or background requests prevent a network-idle condition. | Wait for a selector or use a bounded delay after DOM content loads instead. |
| Layout differs from the browser | Viewport width triggers another responsive breakpoint; cookies, locale, or user agent can also change content. | Match the intended viewport and relevant browser context settings. |
| Sticky header repeats or overlaps content | Scrolling and stitching can interact with fixed-position elements. | Try a section-based capture, adjust scroll settings, or hide the sticky element with CSS if it is not part of the desired result. |
| Screenshot request errors or returns an unexpected result | Authentication, target URL access, timeout, or capture failure. | Check credentials and URL, increase a justified timeout, and inspect available status, verdict, or billing headers. For ScreenshotNeo, response headers identify page verdict and billed state. |
9. FAQ
Can HTMLCSStoImage capture an entire webpage?
Yes. Its full_screen parameter captures the full height by scrolling and stitching; viewport-only capture is the default.
Does Playwright full-page capture scroll and stitch?
The Playwright documentation describes the result as a screenshot of the full scrollable page. The API can save to a file or return a buffer.
What should I do with an infinite-scroll page?
Define a finite capture boundary: use a maximum height, a fixed number of scroll steps, or capture selected sections. Otherwise, there is no stable page bottom to capture.
Is one alternative always more accurate?
No evidence in the cited sources establishes a universal winner. Test the pages and rendering states that matter to your own workflow.
