Best Screenshot API for Generating Thumbnails from a List of URLs
Compare documented APIs for turning URL lists into website thumbnails, including batch behavior, capture controls, throughput, and cost.
Short answer: ScreenshotNeo is the first service to try if you want a simple screenshot API call, clean captures, and billing only for clean shots. For a documented endpoint that accepts a list of screenshot requests in one call, ScreenshotOne is the clearest fit in the reviewed documentation. Urlbox also documents workflows for generating thumbnails from URL lists in CSV, Google Sheets, or Airtable. Browserless documents a capable single-URL screenshot endpoint, but its cited page does not establish native batch-list support.
This is a documentation-based comparison, not a hands-on quality, latency, or reliability test. Before choosing, check whether you need a native list endpoint, whether work runs immediately or on retrieval, how concurrency is limited, how results are delivered, and what your expected monthly volume costs.
1. ScreenshotNeo: first service to try for clean, billed-only-when-clean captures
ScreenshotNeo is a website screenshot API and MCP server. Its API takes one GET request per URL and returns an image or PDF. The documented call below is appropriate when you can send one request per URL from your own queue; the product facts supplied for this article do not establish a native URL-list bulk endpoint.
ScreenshotNeo accepts cookie and consent banners before capture and removes more than 60 known consent platforms, along with newsletter popups and chat widgets. Each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing; response headers identify the page verdict and billing status. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.
For URL-list thumbnails, your application can make one request per URL, limit concurrency, and save each response under a stable filename. See the ScreenshotNeo documentation for API details.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
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)
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(`Screenshot request failed: ${res.status}`);
const bytes = new Uint8Array(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', bytes));
Adapt the target URL and output filename for each row in your list. The API supports PNG, JPEG, WebP, PDF, full-page capture with lazy images loaded, CSS selector element capture, dark mode, device presets and custom viewports, retina scale, custom CSS and JavaScript, selector clicks and hiding, selector/delay/network-idle waits, request and resource blocking, headers, cookies, user agent and Authorization, timezone, geolocation, transparent backgrounds, resizing, configurable cache TTL, signed public image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage API, and an OpenAPI spec. It accepts parameter names used by other screenshot APIs to ease migration. Every feature is available on every plan.
2. ScreenshotOne: clearest documented single-call list endpoint
ScreenshotOne’s official bulk documentation describes a POST to /bulk containing a list of screenshot requests. It supports URL, HTML, or Markdown inputs and wraps the regular screenshot endpoints. This is the most direct documented match among the reviewed options for submitting a list together.
A key detail is execution behavior. Bulk responses can be lazy: screenshots may be taken when the returned URLs are downloaded. Set execute to true when the API should execute the requests before returning, and allow time for those captures to finish. For a user-facing workflow that needs thumbnails ready before responding, account for this completion time rather than treating a successful bulk submission as completed image generation.
The vendor says bulk requests share the same one-minute request bucket as regular screenshot requests. Bulk therefore does not mean unlimited throughput. Check the usage endpoint’s remaining concurrency before sending a large queue, and drain work in batches appropriate to the available capacity. See the bulk screenshots documentation, options reference, and getting-started guide.
Use this option when one documented list submission is more valuable than a simple one-request-per-URL loop. Verify the current response format, authentication, output retrieval, and any limits in the endpoint documentation before wiring it into production; the dossier does not provide a complete request schema or response example, so a runnable vendor-specific bulk payload is not reproduced here.
3. Urlbox: documented spreadsheet and CSV thumbnail workflows
Urlbox’s documentation explicitly describes generating website thumbnails from URL lists stored in CSV files, Google Sheets, or Airtable, and points readers to batch-processing and webhook guidance. That makes it relevant when source URLs already live in a spreadsheet or when batch processing is part of the workflow.
The reviewed documentation does not specify enough detail to assert the exact request shape, queue limits, completion semantics, or output storage behavior. Follow the linked guides for the workflow you plan to use, then confirm those details and current plan limits before implementation. Start at the Urlbox documentation.
4. Browserless: useful screenshot controls, list batching unverified
Browserless documents a REST POST /screenshot endpoint authenticated with a token. It accepts a URL and Puppeteer-style screenshot options and returns image data in PNG, JPEG, or WebP according to configuration. The documented controls include full-page capture, format and quality, viewport and device scale, clipping, element selectors, and scrolling to trigger lazy-loaded content.
The cited endpoint describes one URL per request. Do not assume that this page establishes native list or bulk processing. Browserless can still be a candidate if its documented browser controls fit your capture and you are prepared to orchestrate the URL queue yourself. See the Browserless screenshot API documentation.
5. How to choose for a URL list
| Need | Best starting point | What to verify |
|---|---|---|
| Clean captures, clear billed status, one request per URL | ScreenshotNeo | Concurrency for your plan and whether its bulk capture flow suits your queue |
| One documented request containing a list | ScreenshotOne | execute behavior, shared request bucket, concurrency, and result retrieval |
| URLs already in CSV, Google Sheets, or Airtable | Urlbox | Batch guide, webhook workflow, queue limits, and output handling |
| Per-page browser screenshot controls | Browserless | How to orchestrate multiple URLs; list batching is not established by the cited endpoint |
For any provider, compare these practical details:
- Input and batching: Does the documented endpoint accept a list, or must your worker call once per URL?
- Completion model: Are images rendered before the response, on later retrieval, or through an asynchronous job or webhook?
- Throughput: What request rate and concurrency apply, and are bulk and single captures counted together?
- Capture consistency: Can you set a fixed viewport, output format, scale, full-page mode, waits, and selector or clipping rules?
- Failures and billing: How are blocked pages, timeouts, empty results, retries, and cache hits represented and charged?
- Output handling: Do you receive bytes or URLs, and where will you store, name, expire, and serve the images?
- Cost at volume: Compare included successful renders, request limits, overages, and taxes at your expected monthly URL count.
6. A reliable thumbnail pipeline
- Normalize the input. Trim whitespace, require an allowed scheme such as HTTPS, reject malformed URLs, and decide whether duplicate URLs should share a cached result.
- Choose a stable capture profile. Use the same viewport, output format, scale, wait policy, and full-page or viewport-only setting for every URL. A fixed profile makes a thumbnail grid easier to compare.
- Queue work with bounded concurrency. Avoid firing the entire list at once. For ScreenshotOne, consult remaining concurrency because bulk and regular requests share the one-minute request bucket.
- Track each URL independently. Keep a job record with the input URL, provider request identifier or result reference, status, attempt count, and output location. One failed page should not discard successful captures.
- Retry selectively. Retry transient network errors and timeouts with backoff and a maximum attempt count. Do not blindly retry a CAPTCHA or a stable invalid URL. Use the provider’s verdict or error details when available.
- Validate the result. Check HTTP status, content type, and non-zero image bytes before publishing a thumbnail. Store failures separately for later review.
- Persist output deliberately. Use deterministic filenames or object keys derived from a normalized URL or your own record ID. Avoid exposing API keys in public image URLs or client-side code.
- Refresh with a cache policy. Re-capture only when the source or your chosen TTL warrants it. For changing pages, define how stale thumbnails are replaced and whether old output stays available during refresh.
7. Capture options that matter for thumbnails
Viewport versus full page
A fixed viewport capture is usually the right starting point for a compact preview card: it gives each URL the same frame. Full-page capture is useful when the thumbnail must represent the entire document, but long pages can create tall outputs that need resizing or cropping. Check how each provider handles lazy-loaded content and page height.
Format, quality, and scale
PNG is lossless and can preserve sharp text, while JPEG and WebP can reduce stored bytes depending on content and settings. The reviewed Browserless endpoint documents format and quality controls; verify the corresponding parameters and output behavior for whichever API you select. Retina or device-scale capture can improve detail at display size while increasing image dimensions and transfer or storage needs.
Waits and dynamic content
Pages may still be rendering after the initial document load. A fixed delay is simple but can waste time on fast pages and be too short for slow ones. Waiting for a meaningful selector or network idle can better match an application, where supported, but network idle may never occur on pages with ongoing requests. Set a sensible timeout and record pages that fail the wait condition.
Element and clipping captures
If cards need a consistent hero image or page region, selector-based or clipped capture can avoid large full-page images. Selectors can be absent or vary by site; define a fallback such as viewport capture and flag the result so a missing element is not mistaken for a successful intended crop.
Privacy and access
Only capture URLs your application is authorized to access. Treat custom headers, cookies, and authorization values as secrets, keep them out of logs, and do not place credentials in public screenshot links. Be careful with internal or private-network URLs: validate destinations and apply network access controls in your own service to prevent a URL capture feature from becoming an unintended proxy into private systems.
8. Pricing, performance, and reliability
There are no independent benchmark results in the reviewed research, so there is no supported speed or image-quality winner. Measure your own representative pages, including slow sites, redirects, bot checks, and dynamic content, using the capture profile you intend to ship.
Pricing and quotas change. The research captured ScreenshotOne’s pricing on 2026-10-03: it advertised up to 100 free screenshots monthly, Basic at $17/month for 2,000 screenshots, Growth at $79/month for 10,000, and Scale at $259/month for 50,000. It listed respective request rates of 40, 80, and 150 per minute and extra-render rates of $0.009, $0.006, and $0.004; prices excluded VAT. Verify the current ScreenshotOne pricing page before budgeting.
The Urlbox pricing page captured in the research listed Lo-Fi at $19/month for 2,000 renders, Hi-Fi at $49/month for 5,000, Ultra at $99/month for 15,000, and Business starting at $498/month, with plan-specific features and prices excluding VAT. Recheck its current pricing. These vendor figures are not directly equivalent without checking each plan’s render definition, limits, features, and overages.
ScreenshotNeo offers 1,000 screenshots a 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. All features are on every plan. Budget against actual clean captures needed, cache policy, retries, and concurrency rather than list size alone.
For reliability, maintain a queue, bounded concurrency, per-URL status, selective retries, and output validation. A successful API submission is not necessarily a completed capture, especially when work is lazy or asynchronous. Keep enough state to resume after worker restarts and make output writes idempotent so retries do not create confusing duplicates.
9. Or skip the browser setup
With ScreenshotNeo, send a GET request for each URL in your list using the same one-call pattern:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the API documentation for options. Cookie banners, popups, and chat widgets are removed before the shot. Bot checks, blank pages, timeouts, and failed loads are never billed; cache hits also cost nothing. An MCP server lets AI agents take screenshots. 1,000 screenshots a month are free with no card, and paid plans start at $5 for 3,000.
Create a free ScreenshotNeo account to get started.
10. Troubleshooting common problems
| Symptom | Likely cause | What to do |
|---|---|---|
| Bulk submission returns before images are ready | The endpoint uses lazy retrieval or asynchronous execution | For ScreenshotOne, use execute: true when pre-execution is needed, allow completion time, and follow the returned result workflow. |
| Requests are throttled during a large batch | Request-rate or concurrency capacity is exceeded | Reduce worker concurrency, batch smaller groups, inspect usage or remaining concurrency, and retry with backoff. |
| Some URLs produce blank or incomplete shots | Slow rendering, client-side navigation, blocked content, or an unsuitable wait condition | Set a suitable wait or selector, increase timeout within provider limits, and record the page verdict or error. Do not treat a blank image as a valid thumbnail. |
| Lazy images are missing | The page loads images only after scrolling or waiting | Use full-page or scroll-to-trigger behavior if supported, or wait for the relevant image selector before capture. |
| Element capture fails on some sites | The selector is absent, changes, or appears after the capture wait | Confirm the selector against the rendered page, wait for it, and define a fallback capture mode. |
| Saved files are HTML or cannot be opened as images | An error response was saved as though it were image bytes | Check status and content type before writing; inspect the response body and provider error details. |
| Duplicate jobs create different filenames | Output names depend on queue order or retry number | Use a stable record identifier or deterministic URL key and make writes idempotent. |
| Costs exceed the initial estimate | Retries, duplicate URLs, plan limits, overages, or different render definitions were omitted | Deduplicate input, cache appropriately, cap retries, and recalculate from current vendor pricing and actual monthly volume. |
11. Frequently asked questions
Does a bulk endpoint mean all thumbnails finish at once?
No. Submission, execution, and retrieval can be separate stages. Check the provider’s documented completion model and plan the application response around it.
Should I store screenshots with the API provider or my application?
That depends on whether you need durable ownership, public delivery, lifecycle rules, and control over caching. Verify each provider’s output and retention model, then choose storage that fits your product’s access and refresh needs.
Can I compare providers by their monthly quota alone?
No. Compare what counts as a billable render, rate and concurrency limits, overages, supported capture settings, and how failed or cached requests are treated.
Which option should I try first?
For a documented list submission, begin with ScreenshotOne’s bulk endpoint. For spreadsheet-based URL workflows, review Urlbox’s batch guidance. For clean captures and transparent billed status in a one-request-per-URL workflow, try ScreenshotNeo first. Treat Browserless as a screenshot-control option when you will manage list orchestration yourself.
