Web Scraping API
markdown, HTML, sitemap, search, full-site crawls
Extract
structured data from any site via JSON schema
Brand Data
logos, colors, fonts, styleguide, description, socials, address
Logo Link
logo CDN
Pull Images
images, logos, and screenshots from any URL
Classification
NAICS, SIC, transaction identification

Data Extraction {API}
Describe the data you want as a JSON Schema. Get typed JSON back from any website, in one API call.
No CSS selectors to maintain, no scraper-plus-LLM pipeline to operate. The API crawls, renders, and extracts against your schema, then tells you exactly which pages it used.
Free tier included. No credit card, no proxy configuration, no prompt engineering.
What is a data extraction API?
A data extraction API turns unstructured websites into structured, typed data through a single HTTP request. You describe the fields you want as a JSON Schema, point the API at a URL, and get back JSON that matches the schema: right names, right types, required fields enforced. The hard parts of reading the web (crawling, JavaScript rendering, bot protection, and the extraction itself) happen on the API side.
The traditional alternatives both age badly. Selector-based scrapers break every time a target site ships a redesign, and the do-it-yourself stack (fetch the page, clean the HTML, prompt an LLM for JSON, validate, retry) turns into a pipeline you operate forever: two vendors, prompt drift, token budgeting, and hand-written crawl logic the moment an answer spans more than one page.
Context.dev's extract endpoint replaces both. One call crawls up to 50 pages of a site, reads them together, and returns data matching your schema plus urls_analyzed, the list of pages used to produce the answer. A factCheck mode restricts output to values actually stated on the pages, so nothing is inferred when correctness matters.
What You Get
A complete extraction pipeline, exposed as one clean API.
Schema in, typed JSON out
Send a JSON Schema describing the data you want. The response matches it: right field names, right types, required fields present. Generate the schema from Zod or Pydantic if you already have one.
Whole-site answers, not one page
One request crawls up to 50 pages of a site to assemble the answer: pricing from one page, founding year from another. The response lists every URL analyzed, so results stay auditable.
No selectors to maintain
Extraction reads rendered pages the way a person does, so a site redesign does not break your integration. There are no XPath or CSS selectors to write, monitor, or patch.
Fact-check mode
Pass factCheck: true and only values actually stated on the crawled pages come back. Fields the site does not answer stay empty instead of being inferred, which matters for compliance and finance workloads.
Rendering and anti-bot included
Every page renders in a stealth headless browser with automatic proxy escalation and bot-challenge handling, on every plan. JavaScript-heavy sites return real content, not empty shells.
One call replaces a pipeline
Fetching, cleaning, crawling, prompting, schema validation, and retries collapse into a single request. No second LLM vendor, no prompt drift, no glue code between a scraper and a model.
How It Works
Four things happen between your request and your data. You only write the first one.
Describe the data
Send a starting URL and a JSON Schema for the shape you want back, with field descriptions to steer the extraction
We crawl and render
The crawler follows relevant links up to your maxPages and maxDepth, rendering each page in a stealth headless browser
AI extracts against your schema
Content from every analyzed page is read together and mapped onto your schema, with optional fact-checking
Typed JSON comes back
response.data matches your schema and urls_analyzed lists every page used, so you can validate and audit the answer
API Response
One POST request returns typed JSON matching your schema, plus the pages used to answer it.
POST /v1/web/extract{
"status": "ok",
"url": "https://stripe.com",
"urls_analyzed": [
"https://stripe.com",
"https://stripe.com/pricing",
"https://stripe.com/about"
],
"data": {
"founded_year": 2010,
"has_free_trial": true
},
"metadata": {
"numUrls": 3,
"maxCrawlDepth": 1,
"numSucceeded": 3,
"numFailed": 0,
"numSkipped": 0,
"numBlocked": 0
}
}Extract structured data in one call
The same call works from JavaScript, Python, Ruby, Go, PHP, or plain curl. SDKs are typed, versioned, and published to npm, PyPI, and friends.
import ContextDev from 'context.dev';
const client = new ContextDev({ apiKey: process.env.CONTEXT_DEV_API_KEY });
const { data } = await client.web.extract({
url: 'https://stripe.com',
schema: {
type: 'object',
properties: {
founded_year: { type: 'number' },
has_free_trial: { type: 'boolean' },
},
required: ['founded_year'],
},
});from context.dev import ContextDev
client = ContextDev(api_key="YOUR_API_KEY")
response = client.web.extract(
url="https://stripe.com",
schema={
"type": "object",
"properties": {
"founded_year": {"type": "number"},
"has_free_trial": {"type": "boolean"},
},
"required": ["founded_year"],
},
)
print(response.data)curl -X POST "https://api.context.dev/v1/web/extract" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://stripe.com",
"schema": {
"type": "object",
"properties": {
"founded_year": { "type": "number" }
},
"required": ["founded_year"]
}
}'What teams extract with it
Lead and account enrichment
Turn a prospect's domain into the fields your CRM actually needs: employee count, pricing model, tech stack, hiring signals. Pair the answer with company profile data (logos, socials, address, industry codes) from the same API key.
Pricing and competitor matrices
Define one schema (plans, prices, limits, trial availability) and run it across every competitor domain. Because the schema stays fixed, results land in your database as comparable rows, not as prose to parse.
Compliance and finance snapshots
Extract structured summaries of privacy policies, terms, or disclosures with factCheck: true, so only statements actually on the page come back. Re-run on a schedule with extraction monitors and diff the results.
Agent tools
Agents work better with typed answers than with raw pages. Expose extract as a tool and the model gets exactly the fields it asked for, with live web context and provenance it can cite.
Catalogs and marketplaces
Ingest supplier or merchant sites into a normalized product or listing shape. For product pages specifically, the dedicated product extraction endpoint returns a pre-built record with price, billing frequency, images, and SKU.
Why not a scraper plus an LLM?
The do-it-yourself version is genuinely tempting: fetch the page, strip the markup, hand the text to a model with a JSON output format, validate the result. For one page on one friendly site, that is an afternoon of work, and it is the default answer most teams (and most coding agents) reach for.
Production is where it inverts. The site that needs JavaScript rendering, the one behind bot protection, the answer spread across a pricing page and an about page, the model that quietly invents a value for a field the site never states: each becomes its own subsystem. You end up operating a scraper, a crawler, and an LLM integration, paying two vendors, and re-validating output shapes on every model upgrade.
The extract endpoint is that entire stack as one request: stealth rendering and proxy escalation from the scraping infrastructure, crawl logic bounded by maxPages and maxDepth, schema enforcement on the way out, factCheck when inference is unacceptable, and urls_analyzed so every answer is auditable. If you are comparing providers, see the Firecrawl comparison for a feature-by-feature breakdown.
Simple, success-based pricing
An extraction costs 10 credits and covers the whole crawl. Failed requests are never billed.
One extract call costs 10 credits on success, whether it analyzed one page or fifty. Sign up with a work email and get 500 free API credits, enough for 50 extractions; free-email signups get 250 credits. Paid plans scale linearly per credit with no annual contract and no surcharges for rendering or stealth. Full details are on the pricing page.
Frequently asked questions
Common questions about the Context.dev data extraction API.
What is a data extraction API?
How do I define what data to extract?
Does it work on JavaScript-heavy or bot-protected sites?
Which languages and SDKs are supported?
Why not build this with a scraper and an LLM?
How is a data extraction API different from a web scraping API?
Can it pull data spread across multiple pages?
How do I stop the model from making things up?
How much does data extraction cost?
How does Context.dev compare to Firecrawl for structured extraction?
What is a data extraction API?
How is a data extraction API different from a web scraping API?
How do I define what data to extract?
Can it pull data spread across multiple pages?
Does it work on JavaScript-heavy or bot-protected sites?
How do I stop the model from making things up?
Which languages and SDKs are supported?
How much does data extraction cost?
Why not build this with a scraper and an LLM?
How does Context.dev compare to Firecrawl for structured extraction?
Ship an agent that actually knows things.
Free tier, 10-minute integration, and the same API powering agents at Mintlify, daily.dev, and Propane. No credit card to start.













