The natural-language web extraction API

Say it. Scrape it.

Describe the data you want. Get production-ready JSON back — one API call.

500 free pages · No credit card · No credit multipliers

shopzone.example
<div class="grid__x9"><span data-t="pr"><!--sku9912--></span><h4 cls="ttl">Aurora Desk Lamp</h4><i>ad_slot_22</i><b p="$">$49.00</b><u r>★ 4.8</u><script>trk(9,2)</script><h4 cls="ttl">Birch Bookend Set</h4><div nav>home/shop/all</div><b p="$">$24.50</b><u r>★ 4.6</u><footer>©</footer><h4 cls="ttl">Cedar Wall Shelf</h4><b p="$">$89.00</b><u r>★ 4.9</u><span>cookie_notice</span>...
namepriceratingin_stock
Aurora Desk Lamp49.004.8true
Birch Bookend Set24.504.6true
Dune Ceramic Vase32.004.7true
Fern Print Cushion21.004.9true
Grove Candle Trio18.504.6false
{
  "pages_used": 50,
  "cost_usd": 0.079,
  "data": [
    { "name": "Aurora Desk Lamp",
      "price": 49.00, "rating": 4.8,
      "in_stock": true },
    ...1,846 more rows
  ]
}
1,847 rows · 50 pages · 34s · $0.079

Stop writing extraction code. Stop maintaining selectors.

Built for the AI stack

Claude CodeCursorWindsurfOpenAI AgentsLangGraphCrewAILlamaIndex
Used by AI startups Researchers Growth teams Indie developers Autonomous agents
Why this exists

Every company has written the same scraper thousands of times.

CSS selectors break. XPath breaks. HTML changes on a Tuesday.

LLMs understand pages. So we built the scraper that speaks English.

Read the full engineering rationale →

The API

Copy. Paste. Data.

# pip install plainscrape
from plainscrape import scrape

data = scrape(
    url="shopzone.example",
    instruction="""
      every product under $50
      with rating above 4.5
    """,
    max_pages=50,
)
{
  "rows": 1847,
  "pages_used": 50,
  "cost_usd": 0.079,
  "result_id": "res_8xk2m",
  "data": [
    { "name": "Aurora Desk Lamp",
      "price": 49.0,
      "rating": 4.8,
      "in_stock": true },
    ...
  ],
  "skipped": []
}

The literal response. Typed rows, cost included, failures listed — nothing to guess.

Refine your dataset

Fix the dataset by talking to it.

Plainscrape remembers what you've already extracted — so follow-up instructions don't require crawling the web again.

Extract plans
“Also include free trial”
Done.
0 pages crawled
you » every plan with name and monthly price
← 12 rows · 3 pages · $0.005
you » also note which plans have a free trial
← 12 rows · + free_trial · 0 pages re-crawled · $0.001
you » split price into amount and currency
← 12 rows · + amount + currency · 0 pages re-crawled · $0.001

Nobody gets an extraction perfect on the first request — not humans, not agents. Everywhere else, that means re-crawling the whole site and paying for it twice.

With Plainscrape, a follow-up instruction is an API call, not a re-crawl. The dataset updates in place, and the pages you already paid for stay paid for.

Try refine in the playground →

The difference

Most scraping APIs give you homework. We give you data.

The usual pipeline

API returns raw markdown / HTML
↓ then you…
parse it
clean it
validate it
deduplicate it
fix it when the site changes
5 steps still on your plate · + credit multipliers up to 9×

Plainscrape

One instruction
Finished JSON
0 steps on your plate · 1 page = 1 page · cost in every response
Infrastructure for AI agents · MCP

Your agent speaks English. So does your scraper.

Add Plainscrape as an MCP server and your agent can point at any site, describe what it needs, and get typed JSON back — no HTML in the context window, no token waste.

# one command to web-enable your AI
$ claude mcp add plainscrape -- npx -y plainscrape-mcp

# tools your agent gets
plainscrape_extract    # request → clean JSON
plainscrape_refine     # follow-up → updated dataset, 0 re-crawl
plainscrape_crawl      # scoped: stops when the answer is complete
plainscrape_markdown   # fit-markdown for RAG
plainscrape_monitor    # standing instructions + webhooks
plainscrape_status     # pages_used + cost_usd in every result

Agents that budget themselves

Every response carries cost_usd, so an autonomous agent can reason about spend: “stop if this job exceeds $0.50.”

Transparent pricing isn't a tagline. It's an API field.

MCP setup guide →

What that means for you

Built for the messy, real web.

Self-healing

Wake up Monday. Your scraper still works.

The site redesigned overnight? Your extraction adapts to meaning, not markup. No 3 a.m. selector patching, ever.

Any site

Even the websites that hate scrapers.

JavaScript apps, infinite scroll, logins, PDFs, HTML from 2004. If a browser can see it, you can extract it.

Clean output

Data you don't have to apologize for.

Deduplicated, type-cast, validated against your request. Missing values say NOT_FOUND — never a confident guess.

Scoped

Answer a 5-page question with 5 pages.

“First 50 pages.” “Only /products/.” Scoped crawling stops when the answer is complete — you pay for pages that matter.

Conversational

Refine without re-crawling.

“Actually, skip out-of-stock items.” A follow-up prompt updates the result in place — the pages you paid for stay paid for.

Any language

Instructions in your language.

English, Hindi, Spanish, Japanese — describe the data the way you actually think about it.

Why not just use…

Less setup than a scraper. Less babysitting than a script.

DIY scriptSelector toolsMost scraping APIsPlainscrape
Setup timeDaysHoursMinutesOne instruction
Refine without re-crawling✓ conversational
Survives redesignsPartly✓ self-healing
Non-dev friendlyPartly✓ plain English
Price of a JS pageYour time1–25 creditsUp to 9× base1 page = 1 page
Cost visibilityMonthly surpriseCredit math$ in every response

Same tasks, measured openly → see the benchmarks

Use cases

If you can say it, you can scrape it.

Price monitoring

Every competitor's pricing page, weekly. Flag changes.

plan: Pro · price_monthly: 49 · changed: true
Lead lists

All Series A+ fintech companies from these 3 directories.

name: Finlytic · round: Series B · investors: 4
AI training data

Product specs and reviews for our RAG knowledge base.

docs: 2,314 · format: fit-markdown · tokens saved: 61%
Real estate

New listings under $2,000/mo, 2BR+, posted today.

address: 14 Oak Ln · beds: 2 · rent: 1850
Research ops

Every grant deadline on these 40 university pages.

grant: NSF-2611 · deadline: 2026-09-14 · amount: $50k
Job boards

All open remote AI roles with salary shown, apply links.

title: Sr. AI Engineer · remote: true · salary: $160k+
The numbers

Open where it matters.

1 page = 1 page

No multipliers for JavaScript, stealth, or “premium” sites. The price you compute is the price you pay.

$0.00158/page

On Growth. Credit-based AI scrapers charge up to $0.0075–$0.05 per comparable page.

cost in every response

pages_used and cost_usd ride along with your data. Budget caps per API key.

data you own

Export to JSON, CSV, or markdown anytime. We never resell your data and never train on it.

Respects robots.txt Rate-limit friendly GDPR-aware crawling No training on your data NOT_FOUND > hallucination
FAQ

Fair questions.

Most scraping APIs return markdown or HTML you still have to parse, clean, validate, and deduplicate. Plainscrape returns the finished dataset — and one page always costs one page, instead of up to 9 credits.

One page fetched = one page counted. No hidden multipliers for JavaScript rendering, proxies, or AI extraction. Failed pages don't count at all.

No. The dashboard takes a URL and a request in plain language. Developers get the same power via API, SDKs, and the MCP server.

Rotating proxies, real-browser rendering, and polite pacing are built in. We respect robots.txt and rate limits by default, and we're upfront about which site classes we support.

Yes — session support, infinite scroll, and “next page” logic are automatic. You can also describe actions in English: “click Load more until there's nothing left.”

Your extractions are yours. We don't resell data and we don't train models on your results. Enterprise options include VPC and self-hosting.

The web has data. Just ask for it.

Try it without signup

500 free pages · No credit card