Best Website Screenshot APIs for Capturing Pages in Dark Mode
Compare documented dark-mode screenshot APIs, see what the dark-mode switch can and cannot do, and choose settings for reliable captures.
A screenshot API can request dark-mode rendering, but it cannot make every website dark: the site must respond to the browser’s dark color-scheme preference or provide its own dark theme. Among the services covered here, ScreenshotNeo is the first alternative to try: it supports dark-mode capture, removes common consent banners, popups, and chat widgets before capture, and bills only clean shots. ScreenshotOne and ScreenshotAPI also document explicit dark-mode options. Urlbox documents useful full-page behavior, but the reviewed documentation does not establish its dark-mode support.
This is a comparison of documented capabilities, not a hands-on test or a price, reliability, or image-quality ranking. A dark-mode parameter is a request to the rendering environment; the target page determines the visible result.
1. ScreenshotNeo: dark-mode captures with clean-page handling
ScreenshotNeo is a website screenshot API and MCP server for developers. Its API accepts one GET request with a URL and returns an image or PDF. Dark mode is one of its capture options. For sites that implement dark themes through the browser color scheme, request dark rendering; as with any API, a page that has no dark theme may remain light.
ScreenshotNeo is the first service to try in this comparison because its clean-shot workflow accepts cookie and consent banners like a visitor, removes more than 60 known consent platforms plus newsletter popups and chat widgets, and bills only clean shots. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing; responses identify the page verdict and billing status in headers. Each cleanup step can be turned off. It also offers an MCP server for AI agents using Claude, Cursor, or another MCP client.
See the ScreenshotNeo API documentation for the full option reference. The basic call below demonstrates the documented one-call integration; add the dark-mode option and any other capture options using the API documentation.
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()
with open("shot.webp", "wb") as f:
f.write(r.content)
const q = new URLSearchParams({
access_key: process.env.SCREENSHOTNEO_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}`);
await Bun.write('shot.webp', res);
The JavaScript example uses Bun’s file writer. In Node.js, use the same fetch request and write the returned bytes with fs/promises:
import { writeFile } from 'node:fs/promises';
const q = new URLSearchParams({
access_key: process.env.SCREENSHOTNEO_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}`);
await writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
ScreenshotNeo’s plans include 1,000 screenshots 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. Every feature is on every plan.
2. ScreenshotOne: explicit dark-mode request
ScreenshotOne documents a dark_mode option. Set it to true to request dark rendering when supported, false to request light rendering when supported, or omit it to use the page’s default. Its example uses dark_mode=true on Tailwind CSS. The docs explicitly qualify the result: the site must support the requested mode. ScreenshotOne’s screenshot options also cover full-page capture, viewport configuration, output formats, and image settings.
Example request using the documented API:
curl -G 'https://api.screenshotone.com/take' \
--data-urlencode 'url=https://tailwindcss.com/' \
--data-urlencode 'access_key=YOUR_ACCESS_KEY' \
--data-urlencode 'dark_mode=true' \
-o screenshot.png
ScreenshotOne supports GET and POST requests. Its getting-started documentation advises HTTPS because HTTP does not encrypt API keys, authorization headers, cookies, and other sensitive data in transit. Keep credentials server-side, rather than publishing an unsigned request URL containing a key. See its getting-started guide for request and response behavior.
3. ScreenshotAPI: browser dark-mode emulation
ScreenshotAPI documents a dark_mode parameter for screenshot or PDF rendering. Its documentation says it attempts dark rendering when a target supports a dark theme or built-in dark styles; false requests the default theme, and the documented default is false. The service describes this as browser and request emulation, alongside settings such as user agent, language, headers, and proxy. Read its browser environment emulation documentation for the current parameter format and endpoint details.
The following is the documented request shape with placeholder credentials. Use the endpoint and authentication method from the current provider docs for your account:
curl -G 'https://shot.screenshotapi.net/v3/screenshot' \
--data-urlencode 'token=YOUR_TOKEN' \
--data-urlencode 'url=https://www.apple.com/' \
--data-urlencode 'dark_mode=true' \
-o screenshot.png
4. Urlbox: useful full-page comparison, dark-mode support unverified here
Urlbox’s reviewed documentation explains full-page screenshots, viewport and output options, and how its default full-page flow scrolls to trigger lazy-loaded content. It describes stitch and native full-page modes, with stitching optimized for accuracy and native capture optimized for speed. These capabilities are useful when evaluating screenshot APIs generally, but the reviewed sources do not establish that Urlbox supports a dark-mode request. Confirm the current option in its official docs before choosing it specifically for dark-mode work. See the Urlbox screenshot documentation and options reference.
5. How to choose and validate an API
- Check theme behavior on your target. Test a known site with a real dark theme and a site without one. A successful HTTP response only proves a capture was returned, not that the page switched themes.
- Choose the right page extent. Use viewport capture for a first-screen preview. For long pages, confirm whether full-page capture scrolls the site and triggers lazy loading. Scrolling can also trigger animation, sticky headers, or popups.
- Set a reproducible viewport. Match the intended desktop or mobile width and height. Responsive breakpoints can change layout and sometimes theme controls.
- Pick a format for its purpose. PNG preserves detail; JPEG or WebP can reduce file size. Verify supported formats and quality controls against the provider’s current documentation.
- Protect credentials and private pages. Keep API keys on a server. For authenticated pages, use only a provider’s documented header or cookie mechanisms and protect those secrets as carefully as the API key.
- Inspect more than the HTTP status. Check content type, image dimensions, and whether the screenshot actually appears dark. Where available, inspect verdict or billing headers to distinguish a clean capture from a failed or blocked page.
| Service | Dark-mode evidence in reviewed docs | Other relevant documented behavior | Qualification |
|---|---|---|---|
| ScreenshotNeo | Dark-mode capture option | Full-page and element capture, device and viewport settings, multiple formats, cleanup controls, MCP server | Target page must have a dark theme implementation to visibly change. See docs. |
| ScreenshotOne | dark_mode true or false |
GET and POST; HTTPS guidance; full page, viewport and output options | Docs condition the requested mode on site support. |
| ScreenshotAPI | dark_mode emulation |
Browser and request emulation options | Docs condition dark rendering on site support. |
| Urlbox | Not established by the reviewed pages | Full-page capture, lazy-load scrolling, viewport and format options | Do not select it for dark mode without confirming that option in current docs. |
6. Dark mode is a site behavior, not a filter
Dark-mode emulation generally tells the browser to advertise a dark color scheme. A site can respond with alternate CSS, images, or component colors; it can also ignore the preference. If a site only has a light theme, the capture may stay light. A dark-mode switch should not be described as universally recoloring arbitrary pages.
For a site you own, implement and verify a dark theme in the page itself, commonly using the CSS prefers-color-scheme media feature or an application theme setting, then capture the desired state. A custom stylesheet or script injected by a screenshot tool can be a separate workaround, but it requires site-specific selectors and can break layout or contrast. The sources reviewed here do not establish a universal transformation that reliably creates a good dark theme for every website.
7. Performance, reliability, and cost considerations
- Capture duration: Full-page scrolling and waiting for lazy content take longer than a viewport screenshot. Urlbox specifically notes that skipping its initial scroll can shave time off renders, while that scroll is used to trigger lazy-loaded elements.
- Repeatability: Dynamic content, ads, animations, personalized consent state, and responsive breakpoints can change screenshots between requests. Fix the viewport and relevant page state when comparing captures. A dark-mode preference alone does not freeze other variables.
- Failure handling: Treat timeouts, bot checks, blank output, and navigation errors as distinct outcomes. Retry transient failures with bounded backoff; avoid unlimited retries that can duplicate load or spend.
- Cost comparison: The dossier does not establish current comparable prices for ScreenshotOne, ScreenshotAPI, or Urlbox, so compare their current pricing pages and billing definitions directly before committing. ScreenshotNeo’s listed pricing and no-charge outcomes are described above.
- Security: Use HTTPS and avoid placing secret credentials in browser-visible URLs. ScreenshotOne explicitly warns that HTTP exposes keys and other sensitive request data in transit.
8. Troubleshooting dark-mode captures
| Symptom | Likely cause | What to do |
|---|---|---|
| Screenshot is still light | The site has no dark theme, ignores the browser preference, or requires an in-site theme toggle. | Verify the site manually in dark mode. For a site you control, implement its dark theme or set its supported application theme state before capture. |
| Only some components turn dark | The site has incomplete dark styles or uses fixed-color images and embedded content. | Inspect the target page and treat the result as the site’s actual theme behavior. Replace or restyle those assets in your own application if you control it. |
| Mobile capture differs from desktop | A responsive breakpoint changes the layout, controls, or theme behavior. | Set the intended viewport explicitly and test each device size separately. |
| Images or sections are missing on a full-page capture | Lazy loading may require scrolling or additional time; the page may also load content after interaction. | Use full-page behavior that scrolls the page, allow needed load time, and use a selector wait or interaction if the provider supports it. |
| Cookie banner or popup covers the page | The target presents consent or promotional UI before capture. | Use documented banner handling or a clean-page option. With ScreenshotNeo, consent banners, newsletter popups, and chat widgets are removed before capture; each step can be turned off. |
| Challenge page, blank image, or timeout | The site may block automated traffic, fail to load, or return an interstitial rather than the intended page. | Check the rendered page and response diagnostics. For ScreenshotNeo, page verdict and billing headers identify outcomes; bot checks, blank pages, timeouts, and failed loads are not billed. |
| Authentication does not carry through | The capture request lacks the required session cookie or authorization header, or the target disallows remote access. | Use the API’s documented authentication options, keep credentials private, and ensure you are authorized to access the page. |
9. Or skip the browser setup
ScreenshotNeo takes a screenshot with one API call. Use the documented options in the API docs to configure dark mode and other capture settings.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
ScreenshotNeo removes cookie banners, popups, and chat widgets before the shot. Bot checks, blank pages, and failed loads are never billed. Its MCP server lets AI agents take screenshots. The free plan includes 1,000 screenshots a month with no card, and paid plans start at $5 for 3,000.
Sign up for 1,000 free screenshots a month.
FAQ
Will dark-mode capture change a site that has no dark theme?
Usually not. The API can request a dark color scheme, but the page needs to implement a response to it.
Should I use dark-mode capture or inject custom CSS?
Use the native dark-mode option when the target site supports it. Injected CSS is a site-specific workaround for pages you control or can safely adapt; it is not a universal dark-theme generator.
Does full-page capture guarantee every lazy-loaded image appears?
No. Scrolling can trigger lazy content, but pages may require more time, interaction, or application-specific state.
Can an AI agent request screenshots?
ScreenshotNeo provides an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.
