ScreenshotAPI.net Returns a Blank Screenshot: Causes and Fixes
Diagnose blank ScreenshotAPI.net captures by checking the response, URL, selectors, waits, and blocked resources, then choose a fix that fits the page.
A blank screenshot is a symptom, not a diagnosis. First determine whether ScreenshotAPI.net returned an API error or a valid image that happens to look blank. If it returned an image, check the target URL, selector, wait condition, lazy-loaded content, and resource-blocking options before increasing the timeout.
ScreenshotAPI.net documents fixed delays, selector waits, network-idle waiting, lazy-loading controls, timeouts, and JavaScript injection. No one setting fixes every blank capture; choose a readiness signal that matches the page. ScreenshotAPI.net rendering documentation
1. Check whether the response is an error or an image
Do not treat every empty-looking result as the same failure. The API error reference distinguishes conditions such as TLS errors, an inactive subscription, an empty response, and temporary unavailability. If the request failed, address that reported error first. If it returned an image, inspect the image and continue through the rendering checks below.
Save the response body and status while diagnosing. A command that writes the response directly to an image filename can leave you with an error body or an empty file instead of a usable capture.
curl -G 'https://shot.screenshotapi.net/screenshot' \
--data-urlencode 'url=https://example.com' \
-o response.bin
file response.bin
Use the endpoint and authentication format from your ScreenshotAPI.net account and current documentation; the example illustrates saving and identifying a response, not a universal account configuration. If the response is an API error, use its error reference rather than changing page waits at random. Documentation · Error reference
2. Verify the URL and any capture selector
Confirm that the URL is the page you intend to capture, is reachable from the rendering service, and does not redirect somewhere unexpected or require an interactive sign-in. A selector-based capture adds another condition: the CSS selector must match the intended element after the page renders.
ScreenshotAPI.net documents that a selector which does not match does not necessarily make the request fail; rendering may continue normally. That means a successful response alone does not prove that the selector matched. Check the selector in the page’s DOM and account for elements that are inserted later or hidden until interaction.
- Try the page without element-only capture. If the full page has content, investigate the selector and the element’s visibility or size.
- Check spelling, case, nesting, and whether the selector is scoped to the right element.
- If the element is added by client-side code, wait for a stable selector that appears when it is ready.
- If the page requires a click, login, or other interaction before content appears, determine whether that interaction is supported and configure it deliberately.
3. Wait for the page’s actual readiness signal
A screenshot taken immediately after navigation can miss content that appears later. ScreenshotAPI.net documents three useful readiness strategies: wait for a CSS selector, wait for network activity to become idle, or add a fixed delay. They solve different timing problems.
| Strategy | Use it when | Watch for |
|---|---|---|
wait_for_selector |
A known element reliably indicates the content is ready. | The selector must exist and become visible in time; a wrong selector may leave the capture waiting or capture without the expected content, depending on the request behavior. |
wait_for_event=networkidle |
The page fetches data asynchronously and eventually settles. | Pages with polling, analytics, or long-lived requests may not become idle promptly. |
delay |
Content needs a short known interval for animation or delayed rendering. | It guesses elapsed time: too short misses content, too long adds latency without fixing unrelated failures. |
Prefer a stable selector when the page provides one. Use network idle when network activity is a useful readiness signal. Reserve a fixed delay for known animation or delayed-rendering behavior. ScreenshotAPI.net describes “Blank captures are almost always a wait parameter problem” on its feature page; treat that as the vendor’s stated position, not as proof that every blank image is caused by a wait setting. Feature page · Rendering documentation
4. Account for lazy-loaded content
Images and sections can be deferred until they approach the viewport or the page is scrolled. The initial viewport may render correctly while lower sections remain empty or incomplete. ScreenshotAPI.net documents lazy-loading and delay controls for this case.
- Enable the documented lazy-load behavior when capturing deferred page content.
- For content triggered specifically by scrolling, ensure the relevant area is reached before capture if the API’s supported options allow it.
- Distinguish a blank full-page capture from a blank element capture: the latter may simply target content that has not loaded or become visible.
Do not add a large fixed delay as a substitute for making the lazy content load. Use the documented behavior that corresponds to how the site defers its content. Lazy-loading and delay options
5. Review blocked resources and page scripts
Resource blocking can remove the content or styling you are trying to capture. In particular, ScreenshotAPI.net warns that blocking JavaScript can prevent dynamic content and client-side behavior from loading. Blocking stylesheets removes visual formatting, so the result may appear unstyled or nearly blank even when text exists.
Temporarily remove block_js and stylesheet-blocking settings while diagnosing. If the expected content returns, reintroduce blocking selectively and check which resource category or script is required by the page. Avoid blocking first and trying to compensate with longer waits: a wait cannot load content whose script was disabled.
JavaScript blocking documentation
6. Use timeout changes and injection for the cases they fit
Timeouts
A timeout is the maximum time the service allows the page to load before aborting. ScreenshotAPI.net documents a default timeout of 100,000 milliseconds in its lazy-loading and delay documentation, along with a configurable timeout. Raise it when a genuinely slow or heavy page needs more time. A longer timeout does not repair an invalid URL, access restriction, incorrect selector, blocked JavaScript, or a page that never reaches the selected readiness condition.
JavaScript injection
Use JavaScript injection when you know a specific page action or change is needed before capture. For example, a page may need a known interaction to reveal a section. Injection is a targeted technique, not a general blank-image fix; first establish what action is needed and make sure it is safe and repeatable for the target page. Injection documentation
7. A practical diagnostic sequence
- Save the raw response, inspect its status and file type, and consult the vendor error reference if it is an error.
- Open the target URL and verify that it loads with the content and access conditions you expect.
- Remove selector capture temporarily. If the full-page result works, check selector match, visibility, and timing.
- Remove JavaScript or stylesheet blocking during diagnosis. Restore options one at a time after the page renders.
- Choose one readiness strategy based on the page: a stable selector, network idle, or a measured delay for animation or deferred rendering.
- For missing below-the-fold content, enable the documented lazy-loading behavior and ensure scroll-triggered sections are reached.
- Increase timeout only if evidence points to a slow load, then retry and compare the response.
- Use injection only for a known interaction that must occur before capture.
8. Common errors and fixes
| Symptom | Likely cause to check | Fix |
|---|---|---|
| The request returns an error instead of an image | TLS problem, inactive subscription, empty response, temporary service availability, or another API error. | Read the specific error and follow the matching branch in the vendor error reference before changing render timing. |
| Full-page capture has content, selected capture looks blank | The selector does not match, or the target element is hidden, empty, or not ready. | Verify the selector against the loaded DOM; wait for a stable element and check its visibility. |
| A JavaScript application looks empty | Capture occurred before its data or client-side content appeared, or JavaScript was blocked. | Allow JavaScript and wait for the relevant selector or a suitable network-idle condition. |
| The page is plain, unstyled, or appears blank | Stylesheets may be blocked. | Remove stylesheet blocking and confirm that the page’s visual formatting returns. |
| Top content appears, lower images or sections are missing | Lazy loading or scroll-triggered loading. | Use lazy-load behavior and make sure the relevant area loads before capture. |
| The capture times out | The page is genuinely slow, or a wait condition never becomes true. | Check the page and readiness condition; increase timeout only when the page needs more load time. |
| Adding a longer delay changes nothing | The problem is unrelated to timing, such as an inaccessible URL, wrong selector, or blocked resource. | Return to response, URL, selector, and resource checks instead of increasing the delay again. |
9. Performance, reliability, and cost considerations
Waiting longer increases capture latency. A fixed delay also spends that time on pages that rendered quickly, while an unbounded or unsuitable network-idle wait can be a poor fit for pages with continuous traffic. A selector wait can be more targeted when the page has a reliable readiness element. These are practical consequences of the documented wait strategies; the best choice depends on the target page.
Timeouts help accommodate slow pages but do not make a failing page reliable. If a page is inconsistent, inspect whether it depends on delayed API responses, access checks, or resources blocked by the request configuration, and use a readiness condition tied to the content you need. The available research does not establish a universal performance benchmark or cost outcome for these settings; consult your account’s current plan and API terms for billing details.
10. Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server from Yorker Media. Its API takes a URL and returns an image or PDF; the one-call example below saves the response. See the ScreenshotNeo API documentation for request options and formats.
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,
)
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}`);
await Bun.write('shot.webp', res);
ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before the shot; each cleanup step can be turned off. Bot checks, blank pages, and failed loads are never billed, and the response says which result occurred. Its MCP server lets AI agents using Claude, Cursor, or another MCP client take screenshots. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card.
FAQ
Does a successful request mean the selector matched?
No. ScreenshotAPI.net says a non-matching selector does not necessarily throw an error, so verify the captured element and the selector separately.
Should I always use network idle?
No. It is useful when the page’s requests eventually settle. Use a selector when a stable element indicates readiness, or a delay for a known animation or delayed render.
Can a longer timeout fix a blank page?
Only when the page needs more time. It cannot correct an invalid URL, inaccessible content, a wrong selector, or resources blocked from loading.
Why might a Puppeteer element screenshot be white?
Readiness, hidden elements, and delayed rendering are relevant browser-rendering hypotheses. A vendor guide discussing them for Puppeteer is adjacent context, not proof of the cause of a particular ScreenshotAPI.net result. Puppeteer element screenshot guide


