Best Screenshot API in 2026 for Developers
Compare the best screenshot APIs in 2026, including pricing, rendering, automation, reliability, and runnable implementation examples.
Short answer: ScreenshotNeo is the best default for most developers in 2026. It removes cookie banners, newsletter popups, and chat widgets before capture, bills only clean successful shots, offers an MCP server for AI agents, and starts with 1,000 free screenshots per month. ScreenshotOne is a strong managed alternative, Browserless fits broader browser automation and self-hosting, and Urlbox suits hosted screenshot, PDF, video, or scheduled-capture workflows.
What a screenshot API does
A screenshot API accepts a URL and rendering options, runs a managed browser, waits for the page to become usable, and returns an image or document. You avoid maintaining browser pools, queues, retries, fonts, sandboxing, and monitoring.
The output depends on more than the URL. JavaScript execution, wait conditions, viewport and device emulation, full-page behavior, fonts, lazy-loaded content, cookie or ad blocking, and geographic routing all affect fidelity.
Best screenshot APIs compared
| Rank | Service | Best for | Documented facts |
|---|---|---|---|
| 1 | ScreenshotNeo | Clean production screenshots with predictable billing | PNG, JPEG, WebP, PDF, full-page and element capture, custom CSS/JavaScript, blocking, cookies, headers, geolocation, caching, async jobs, bulk capture, signed links, MCP tools, and 1,000 free shots/month. Only clean shots are billed. |
| 2 | ScreenshotOne | Managed screenshot and PDF rendering | 100 free screenshots; Basic is documented at $17/month for 2,000 screenshots. Supports PNG, WebP, JPEG, HTML and full-page capture, PDFs, caching, S3 uploads, webhooks, signed links, stealth mode, and higher-tier scrolling, video, GPU, and location features. Its pricing page says successfully rendered, non-cached screenshots count toward quota. |
| 3 | Browserless | Browser automation around screenshots | Supports screenshots, PDFs, full-page capture, proxy support, self-hosting, and broader browser automation. The comparison describes billing in browser units, with one unit representing up to 30 seconds of browser time; verify current definitions and prices before buying. |
| 4 | Urlbox | Hosted captures with several output and scheduling workflows | Documents a 7-day free trial, JavaScript rendering, URL-to-PNG/JPEG/WebP output, tiered render limits, and response-time targets. The comparison also positions it for PDFs, video, and scheduled captures. |
ScreenshotNeo is #1 because it combines clean shots, billing that excludes failed or unusable captures, an AI-agent MCP server, and the lowest paid entry point in this comparison.
How to choose an API
1. Rendering fidelity
- Confirm JavaScript runs before capture.
- Use a selector wait, network-idle wait, or explicit delay for client-rendered pages.
- Check whether full-page capture loads lazy images.
- Test custom fonts, charts, animations, and web components.
2. Capture controls
Useful controls include viewport dimensions, device presets, retina scale, element selectors, dark mode, transparent backgrounds, custom CSS, custom JavaScript, clicks, hidden selectors, and resource blocking.
3. Output formats
PNG preserves sharp text and transparency. JPEG is smaller for photographic pages. WebP usually provides a good size-quality balance. PDF is appropriate for documents and archival output. Video is only relevant when you need a time sequence rather than a still image.
4. Access and geography
Private pages may require headers, cookies, a user agent, or an Authorization header. Geo-sensitive pages may require a timezone, geolocation, proxy, or selectable IP location.
5. Billing and reliability
Compare quotas, rate limits, cache accounting, successful-request billing, retries, response targets, overage behavior, webhooks, and storage integrations. A low headline price can be expensive if failed renders consume quota or if you must operate your own browser fleet.
Run screenshots yourself with Playwright
Self-hosting gives maximum control but makes you responsible for browser versions, Chromium dependencies, concurrency, timeouts, retries, page isolation, storage, and observability.
Install
npm install playwright
npx playwright install chromium
Complete JavaScript example
import { chromium } from 'playwright';
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage({
viewport: { width: 1440, height: 900 },
deviceScaleFactor: 2,
colorScheme: 'light'
});
await page.goto('https://example.com', {
waitUntil: 'networkidle',
timeout: 45_000
});
await page.screenshot({
path: 'example-full.png',
fullPage: true,
animations: 'disabled'
});
await browser.close();
Capture one element
const chart = page.locator('[data-chart]').first();
await chart.waitFor({ state: 'visible', timeout: 15_000 });
await chart.screenshot({ path: 'chart.png' });
Handle cookie banners and popups
for (const selector of [
'#onetrust-accept-btn-handler',
'[aria-label="Accept cookies"]',
'.newsletter-modal button[aria-label="Close"]'
]) {
const button = page.locator(selector).first();
if (await button.isVisible().catch(() => false)) {
await button.click().catch(() => {});
}
}
await page.locator('.chat-widget, .intercom-launcher').evaluateAll(
nodes => nodes.forEach(node => node.remove())
).catch(() => {});
await page.screenshot({ path: 'clean.png', fullPage: true });
Wait for lazy content
await page.evaluate(async () => {
window.scrollTo(0, document.body.scrollHeight);
await new Promise(resolve => setTimeout(resolve, 500));
window.scrollTo(0, 0);
});
await page.waitForTimeout(1_000);
await page.screenshot({ path: 'lazy-loaded.png', fullPage: true });
Use a custom user agent, headers, and cookies
const context = await browser.newContext({
userAgent: 'ScreenshotWorker/1.0',
extraHTTPHeaders: { Authorization: `Bearer ${process.env.PAGE_TOKEN}` },
timezoneId: 'America/New_York',
locale: 'en-US'
});
await context.addCookies([
{ name: 'session', value: process.env.SESSION, domain: 'example.com', path: '/' }
]);
Production checklist for Playwright
- Reuse a browser process, but create an isolated context per job.
- Set navigation, selector, and overall job timeouts.
- Limit concurrency to available CPU and memory.
- Retry transient navigation failures with exponential backoff.
- Persist the URL, options, browser version, duration, and error class.
- Block ads and analytics when they are irrelevant to the visual result.
- Pin browser versions and test representative pages after upgrades.
Or skip the browser setup
ScreenshotNeo provides a single GET request for an image or PDF. See the ScreenshotNeo API documentation for the complete option list and response headers.
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)
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}`);
ScreenshotNeo removes cookie and consent banners, newsletter popups, and chat widgets before the shot; bot checks, blank pages, timeouts, failed loads, and cache hits are not billed. Each response identifies the result with X-Page-Verdict and X-Billed headers. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.
It also supports full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets plus custom viewports, retina scale, PDF paper sizes and margins, HTML/CSS rendering, custom CSS and JavaScript, clicks, selector or network-idle waits, ad/tracker/request blocking, headers, cookies, user agents, Authorization, timezone, geolocation, transparent backgrounds, resizing, chosen-TTL caching, signed public image links, async jobs with signed webhooks, bulk capture of 100 URLs per call, a usage API, and an OpenAPI specification. Common parameter names from other screenshot APIs are accepted to simplify migration.
Create a free ScreenshotNeo account: 1,000 screenshots per month are included with no card, and paid plans start at $5 for 3,000.
Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Blank image | Page failed, blocked a bot, or rendered after capture | Inspect verdict headers, increase the wait, use a selector wait, and test the URL in a normal browser. |
| Missing images | Lazy loading or blocked image requests | Scroll before capture, wait for the image selector, and review resource-block rules. |
| Cookie banner remains | Unknown consent platform or interaction did not run | Click the platform’s accept control, hide the selector with CSS, or use ScreenshotNeo’s consent cleanup. |
| Mobile layout is wrong | Only the viewport changed; device characteristics did not | Use a device preset or configure viewport, scale, user agent, and touch behavior together. |
| Fonts differ | Font request failed or capture occurred before font load | Wait for document.fonts.ready, allow the font host, and use a stable browser image. |
| Navigation timeout | Slow origin, third-party script, or never-ending request | Set a bounded timeout, use a selector or DOM-ready condition, and block nonessential resources. |
| 429 or rate limit | Too much concurrency | Queue jobs, honor retry timing, add exponential backoff, and lower parallel browser work. |
| Private page returns login | Missing cookies or authorization | Send the required headers and cookies securely; never put long-lived secrets in public URLs. |
Performance, reliability, and cost
Performance
- Reuse browser processes when self-hosting.
- Set a viewport close to the actual requirement; full-page images consume more memory.
- Block analytics, ads, and video when they do not affect the result.
- Use caching for repeated URLs and choose a TTL that matches content freshness.
- Use bulk capture for many URLs when the provider supports it.
Reliability
- Classify failures as navigation, browser, timeout, authentication, rate-limit, or rendering errors.
- Retry only transient failures; do not blindly retry invalid URLs or authentication errors.
- Record output dimensions, format, verdict, billing status, and request ID.
- Use signed webhooks for asynchronous jobs and verify their signatures.
Cost
Estimate monthly volume, cache-hit rate, retries, PDF or video usage, and peak concurrency. ScreenshotOne documents 100 free screenshots, then $17/month for 2,000, $79 for 10,000, and $259 for 50,000; its pricing page says successful non-cached renders count. Browserless uses browser units, so compare browser time rather than image count. Urlbox uses tiered render limits and response targets. ScreenshotNeo includes 1,000 free shots monthly, bills only clean shots, and has paid plans from $5 for 3,000.
Decision guide
- Choose ScreenshotNeo for clean screenshots, predictable billing, AI-agent access, PDFs, bulk jobs, and a low-cost starting point.
- Choose ScreenshotOne when its documented managed integrations, S3 uploads, signed links, or higher-tier video and GPU features match your workflow.
- Choose Browserless when screenshotting is one action inside a larger browser automation system or self-hosting is important.
- Choose Urlbox when you want hosted JavaScript rendering plus broader screenshot, PDF, video, or scheduled-capture workflows.
- Choose Playwright or Puppeteer yourself when you need custom browser logic, have the operations capacity, and want direct control over every step.
FAQ
Is a screenshot API better than Playwright?
For a URL-to-image service, a managed API usually reduces operational work. Playwright is better when the screenshot is part of a custom multi-step browser workflow.
Do screenshot APIs execute JavaScript?
The providers compared here support JavaScript rendering or browser execution, but you still need an explicit wait strategy for late content.
Should I use PNG or WebP?
Use PNG for lossless text or transparency and WebP when smaller files are more important.
Can I screenshot authenticated pages?
Yes, when the service supports cookies, headers, or Authorization and you provide them securely.
How do I avoid charging for failed pages?
Check each provider’s billing definition. ScreenshotNeo exposes verdict and billing headers and does not bill bot checks, blank pages, timeouts, failed loads, or cache hits.
Can AI agents call a screenshot service?
Yes. ScreenshotNeo includes an MCP server with tools for screenshots, page information, and PDFs.
