The visual scraper for AI agents. Point, click, save, ship.
Other scrapers ask you to prompt and pray. We let you see what you're extracting — click any element, save the recipe, run it forever. With selectors you can actually debug.
Skip the setup.
Start with a recipe.
Browse community-shared extraction recipes. Fork any one, run it on any matching page, customize the selectors as needed.
Watch what 15 seconds looks like when scraping is visual.
- Show HN: A tool for AI agents to scrape any website412 points
- Cloudflare's new bot defense is breaking the open web287 points
- We replaced our Selenium farm with CDP patches198 points
No fields yet — click an element on the page.
Why scrapers built for AI agents keep failing
Prompt-and-pray doesn't scale
Black-box AI scrapers look magical until you need to debug. Wrong field? Re-prompt. Schema drifted? Re-prompt. You can't fix what you can't see.
Every API call is stateless
Most scraping APIs are one-shot. No saved recipe. You re-extract from scratch on every URL — paying for the same schema generation again and again.
Cloudflare hates your Playwright
Modern bot walls (Cloudflare, Datadome, Akamai) block most automation. Most APIs use vanilla Playwright. We use nodriver — CDP-patched, undetectable.
What you get that prompt-only scrapers can't ship
Click any field on the page. See the selector. See the value before extraction. Edit live. Save when ready.
Define a schema once. Run it on 1,000 URLs. Share with your team. Fork community templates. Version your selectors like code.
CDP-level Chromium patches via nodriver — passes Cloudflare Turnstile, Datadome, Akamai checks that vanilla Playwright trips on.
REST API, Python + TypeScript SDKs, MCP server for Claude Desktop / Cursor / Cline. One line of code to integrate.
One line to integrate. Same recipe across every client.
Save a recipe once in the visual picker. Run it from Python, TypeScript, a cURL one-liner, or directly through Claude Desktop via MCP.
pip install stealth-scraper
from stealth_scraper import Client
client = Client(api_key="ssk_...")
# Run a saved recipe on a new URL
result = client.run_template(
template_id="tpl_hn_top_stories",
url="https://news.ycombinator.com",
)
print(result.records[:3])
# [
# {"title": "Show HN: ...", "points": 412, "comments": 87},
# {"title": "Cloudflare's ...", "points": 287, "comments": 142},
# {"title": "We replaced ...", "points": 198, "comments": 64},
# ]Describe it. We draft the schema. You open it in the picker to verify.
"Get every product's title, price, rating, and review count."
product_titlepriceratingreview_countOpen the AI draft in the visual picker. Confirm selectors, edit what's off, save the recipe. No more hoping the AI got it right.
The hard part is open source.
The scraping engine — CDP-level Chromium patches, anti-bot stealth, the bits that get you through Cloudflare — is MIT-licensed and on GitHub. Self-host the engine. Use the hosted product for the visual picker, saved recipes, marketplace, and team features.
stealth-browser/ on GitHub- Stealth Chromium runtime (nodriver + CDP patches)
- Snapshot + element collection engine
- Selector resolver (CSS + XPath + transforms)
- Self-host with `pip install` or Docker
- Visual point-and-click picker
- Saved recipes + template marketplace
- Scheduled scrapes, webhooks, API keys
- Team workspaces, billing, support
Pay as you grow. Cancel anytime.
Every scrape is one new data point, not a re-prompt. Save a recipe once, then 10,000 runs = 10,000 new rows — your saved selectors never re-pay for schema generation.
- 50 scrapes/mo
- Soft sites
- 1,000 scrapes/mo
- Hard sites
- 10,000 scrapes/mo
- API + SDKs
- Scheduled runs
- 100,000 scrapes/mo
- Team seats
- Priority
Real answers. Not marketing copy.
Question not answered here? Email rushikesh.koochana@gmail.com — I read every one.