How Reader handles it
Inauto mode (the default), Reader tries standard first (datacenter proxy). If the response looks like a bot wall (a challenge page, 403, or HTML that doesn’t match what a browser would see), Reader retries with stealth automatically. stealth uses residential proxy IPs that bypass the common bot detection vendors.
In most cases you don’t need to do anything. The retry happens under the hood and you get clean content. You can see what happened in the response:
proxyEscalated: true means Reader hit a wall on standard, retried with stealth, and that worked. 3 credits charged instead of 1.
When auto doesn’t work
Some sites are hostile enough that even stealth can’t get in, or the automatic escalation heuristics miss a block that looks like a normal response. Symptoms:metadata.statusCodeis 200 but the markdown is very short- The markdown contains phrases like “please enable JavaScript”, “checking your browser”, or “access denied”
- The same URL in a browser shows totally different content
Force stealth explicitly
If you suspect the auto-escalation isn’t kicking in, force stealth:When stealth doesn’t work either
If stealth-mode scrapes also come back thin, the site is beyond Reader’s reach. Common offenders:- Sites with CAPTCHAs that require human interaction
- Sites using very new or custom bot detection that our stealth mode hasn’t learned
- Sites that require a logged-in session
- Use the site’s official API if they have one
- Scrape with your own session (cookies, auth, manual CAPTCHA solving) and only use Reader for the public parts
- File an issue. Sometimes we can tune stealth for a specific site
The waitForSelector trick
If a page loads a shell and then hydrates content client-side, even stealth won’t give you the real markdown unless the page has finished hydrating. Combine stealth with waitForSelector:
.product-price to appear before capturing, ensuring you see the fully-rendered post-hydration DOM.

