Skip to main content
The default fetcher is fast and cheap, and works on most public sites. Stealth mode swaps it for a real Chrome session — the right tool when a site throws challenges, returns empty shells, or sits behind a bot wall.

How to enable

Add "stealth": true to the request body of any endpoint that supports it:
{
  "website_url": "https://example.com",
  "stealth": true
}
Endpoints that accept stealth:
  • POST /v1/scrape
  • POST /v1/smartscraper
POST /v1/smartbrowse/recipes/:id/run already runs in real Chrome, so stealth is built in.

When to use it

Use stealth when…

  • You’re getting 403 / 429 / “Just a moment…” challenge pages
  • The page is client-rendered and the default fetch returns an empty shell
  • You need to get past a CAPTCHA or challenge interstitial

Skip stealth when…

  • The default fetch already returns what you need (most marketing, news, listing, and product pages)
  • You’re hitting a JSON API or RSS feed
  • You’re at high volume and the default fetcher is working

What it costs

Stealth adds a per-endpoint surcharge on top of the base cost — see Credits for the full table. Most endpoints roughly double in cost with stealth on.

Try the cheap path first

A common pattern: try without stealth, retry with it on failure. Because the first call is free when it fails, the fallback only spends the surcharge when stealth was needed.
import requests

API = "https://api.webscrape.ai/v1/scrape"
HDR = {"X-API-Key": "wsg_live_..."}

def fetch(url):
    env = requests.post(API, headers=HDR, json={"website_url": url}).json()
    if env.get("status") != "completed":
        env = requests.post(API, headers=HDR, json={"website_url": url, "stealth": True}).json()
    return env