Urlbox Screenshots Fail on Cloudflare Protected Websites: What to Check
A successful render can still show a Cloudflare challenge. Learn how to identify hard and soft blocks, configure retries, and choose the next step.
A Urlbox request can complete successfully and still capture the wrong page. A site may return a hard error such as HTTP 403 or 429, or serve a Cloudflare challenge with HTTP 200. Check both the final response status and the captured content. Treat hard blocks as failures, detect soft blocks with a target-specific size or selector check, then retry with stealth rendering and, only when relevant, a proxy you supply. Retries do not guarantee access.
This guide uses Urlbox’s documented options and Cloudflare’s troubleshooting guidance. A challenge can have several possible causes; the render alone may not reveal which one applies.
1. Identify what the screenshot contains
Start with the final status and the image. A 403 or 429 may indicate a hard block. A verification or challenge page may arrive with status 200, so a successful HTTP response does not prove that the requested content was captured.
| Signal | What it can mean | What to check |
|---|---|---|
| 403 or 429 | The target refused the request or rate limited it. | Inspect the final status and configure the render to fail on statuses that indicate failure for this target. |
| HTTP 200, challenge visible | A soft block or verification page was returned as ordinary page content. | Inspect the screenshot, check for a stable challenge selector, or compare output size with normal captures. |
| Very small or nearly blank image | Possibly a soft block, incomplete load, or a genuinely sparse page. | Compare with the target’s normal output; size is a heuristic, not a universal threshold. |
| Repeated challenge | The challenge may be reacting to browser signals, IP reputation, site rules, or browser conditions. | Check challenge troubleshooting conditions before changing render settings repeatedly. |
Use a size threshold only after observing normal output for the specific target. A generic byte count cannot reliably distinguish a challenge from a legitimate short page.
2. Make hard blocks fail visibly
Configure Urlbox to treat relevant statuses as render failures. Its options include fail_on for specified statuses and fail_on_4xx for the client error range. Use the narrowest policy that matches the site: some targets may legitimately use a particular 4xx response, so do not classify every client error as a block without checking.
// Illustrative Urlbox option shape; insert these options into your existing render request.
{
"fail_on": [403, 429]
}
// Use this when every 4xx response should fail for the target.
{
"fail_on_4xx": true
}
These snippets show option values, not a complete authenticated Urlbox request. Follow the current Urlbox Render Options documentation for request construction and plan availability.
3. Detect soft blocks that return HTTP 200
For a challenge returned with status 200, configure a content-based signal as well as a status policy:
min_size_bytescan flag output below a target-specific minimum. Combine it withsmall_sizeinretry_onif small output should trigger another attempt.- If the challenge has a stable element, use
wait_to_leavewithfail_if_selector_presentso the render fails while that selector remains visible.
Choose the threshold and selector by examining the site’s ordinary pages and challenge page. Challenge markup can change, and a selector or size threshold that works for one site may misclassify another.
// Illustrative option values; confirm exact request syntax in Urlbox's options reference.
{
"min_size_bytes": 12000,
"wait_to_leave": {
"fail_if_selector_present": "#cf-challenge-running"
}
}
The sample threshold and selector above are placeholders, not universal values. Validate them against the target before relying on them.
4. Retry progressively
Urlbox documents retry_on to select failures that merit another attempt and retry_with to change options on later attempts. A useful pattern is a plain first render, then stealth on retry, followed by stealth plus a proxy only if the previous attempts remain blocked.
// Configuration sketch based on Urlbox's documented retry pattern.
{
"fail_on_4xx": true,
"retry_on": [403, 429, "small_size"],
"retries": 3,
"retry_with": [
{ "use_stealth": true },
{ "use_stealth": true, "proxy": "YOUR_PROXY_CONFIGURATION" }
]
}
This is an example configuration, not a guarantee or a default recommendation. Confirm the current retry syntax and eligibility in the Urlbox avoiding blocks guide. The dossier notes that retry options, min_size_bytes, and proxy are available on Ultra and above; check the current plan terms before depending on them.
5. Use stealth when browser signals are the likely issue
Urlbox describes hide_headless as a lighter option for basic bot detection and use_stealth as the stronger option to reduce browser automation fingerprints. If both are set, the options reference says use_stealth takes precedence.
Stealth rendering is slower, so applying it to every capture can add latency unnecessarily. Prefer using it on a retry when the ordinary attempt is blocked. It can address browser fingerprint signals, but it cannot guarantee that a site will serve the intended page.
6. Add a proxy only when the block may be IP or location related
A proxy changes the outgoing IP and may help when the target is reacting to IP reputation or geographic origin. It does not change the browser fingerprint in the same way stealth rendering does. Urlbox does not provide proxies; you supply a provider and configure Urlbox to use it. The target or proxy provider may still block the request, and some providers restrict high-value domains or require a web-unlocker product.
Urlbox’s options reference lists proxy and stored use_proxy as requiring Ultra or above. Check both Urlbox plan eligibility and your provider’s access rules before implementing this path. A proxy purchase does not guarantee a successful capture. See Urlbox’s proxy guide.
7. Check challenge and browser conditions
Cloudflare lists several possible reasons for challenges, including IP reputation, bot detection, custom WAF rules, and Browser Integrity Check. Its troubleshooting guidance for challenge loops also mentions network instability, unsupported browsers, disabled JavaScript, missing storage or cookies, blocked access to challenges.cloudflare.com, and user-agent changes. These are possible causes, not a diagnosis of a particular Urlbox render.
Check whether the page relies on JavaScript or storage, whether challenge scripts are reachable, and whether the request conditions are stable across retries. Urlbox also supports options such as headers, cookies, and page-wait conditions; these can support legitimate access requirements or render timing, but changing them alone is not evidence that a Cloudflare challenge will be solved.
8. Troubleshooting checklist
- Screenshot shows 403 or 429: configure the relevant
fail_onstatuses orfail_on_4xx, then retry only if the status is suitable for retry. - Screenshot shows a challenge with status 200: add a stable challenge selector check or a target-calibrated minimum-size check.
- Screenshot is blank or tiny: compare it with ordinary output, inspect load timing, and avoid relying on a universal byte threshold.
- Challenge persists with stealth: check site rules, IP reputation, challenge script access, JavaScript, cookies, storage, and network stability. Stealth does not override site policy.
- Challenge persists with a proxy: verify provider access to the domain, geography, and proxy configuration. The provider or site may block it.
- Retry adds too much latency: narrow
retry_onto meaningful block signals and reserve stealth or proxy changes for later attempts. - Option is rejected or unavailable: confirm the current Urlbox option spelling and plan requirement in the official options reference.
If automated access remains blocked, use an authorized access path or ask the site owner. Repeated retries cannot guarantee access and can add latency without changing the result.
9. Performance, reliability, and cost considerations
- Latency: retries add render attempts; Urlbox says stealth is noticeably slower. A proxy can add another network dependency.
- Reliability: status checks catch hard failures; selector and size checks help catch soft blocks. Neither is perfect, so inspect representative captures and tune rules per target.
- Cost: retries and advanced options may affect plan usage or eligibility. Check current Urlbox terms; do not treat the sample retry count as a measured success rate.
- Access: site policy, WAF rules, and proxy provider restrictions can prevent a capture regardless of configuration.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server from Yorker Media. One GET request returns a screenshot or PDF. It accepts cookie and consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. An MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients. It does not promise access to every Cloudflare-protected site; use it where the target permits capture.
ScreenshotNeo offers 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000 screenshots. Every feature is on every plan. See the API documentation for parameters and response details.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
For Python or Node.js clients, the same GET endpoint and parameters are documented below.
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}`);
Create a free ScreenshotNeo account for 1,000 screenshots a month with no card.
FAQ
Does HTTP 200 mean Cloudflare allowed the screenshot?
No. A challenge page can be returned with status 200. Inspect the captured content as well as the status.
Should every 4xx response be treated as a Cloudflare block?
No. Set the failure policy for the target; it may use some 4xx statuses legitimately.
Will stealth or a proxy always solve the challenge?
No. They address different signals, and the target or provider can still deny access.
What should I do if the target continues to require a human challenge?
Use an authorized access route or contact the site owner rather than assuming more retries will succeed.


