Distill, the structured data extraction API
Send URLs and a schema, get JSON back in that shape.
Distill runs on paid plans, from $29 a month.
POST /v2/distillcurl -X POST https://api.enconvert.com/v2/distill \
-H "X-API-Key: sk_your_private_key" \
-H "Content-Type: application/json" \
-d '{
"urls": ["https://www.enconvert.com/pricing"],
"schema": { "type": "object", "properties": { "plans": {
"type": "array", "items": { "type": "object", "properties": {
"name": { "type": "string" },
"price_usd": { "type": "number" },
"ops_per_month": { "type": "integer" } } } } } }
}'{
"status": "completed",
"extraction_tier": "llm",
"data": { "plans": [
{ "name": "Founding", "price_usd": 0, "ops_per_month": 500 },
{ "name": "Indie", "price_usd": 29, "ops_per_month": 3000 },
{ "name": "Studio", "price_usd": 99, "ops_per_month": 15000 },
{ "name": "Production", "price_usd": 299, "ops_per_month": 50000 }
] }
}The schema you send, filled
The data matches the shape you asked for, key for key.
{
"type": "object",
"properties": {
"plans": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"price_usd": { "type": "number" },
"ops_per_month": { "type": "integer" }
}
}
}
}
}{
"url": "https://www.enconvert.com/pricing",
"status": "completed",
"data": { "plans": [ […] ] },
"extraction_tier": "llm",
"fields_from_css": 0,
"fields_from_llm": 1,
"render_quality": 1.0,
"tokens": { "input": 4317, "output": 175 },
"cost_cents": 0.5192,
"warnings": []
}Real output, captured 2026-11-11. […] marks a cut.
What you send and get
| Field | What it does |
|---|---|
urls | Up to 50 URLs a request, or discover_from a seed URL to find up to 50 pages first. |
schema | A JSON Schema object, or a flat map of field names to descriptions. |
css_schema | Optional selectors. The fields they fill are free, and only the empty ones go to the LLM pass. |
data | Normalized to exactly your schema’s keys. A missing value is null and a missing list is empty. |
cost_cents | The LLM pass spends AI credits, capped at $0.05 a call and $0.50 a request. |
What one call replaces
A scraper for every site
You describe the fields, and selectors are optional.
A prompt chain
The LLM pass runs only for fields the free CSS pass left empty.
A shape check
The data comes back in your schema’s exact keys.

Your first extraction
Pick a paid plan
Indie, Studio or ProductionSend URLs and a schema
POST /v2/distillRead the data, key for key
results[0].data
More of the same API
- URL to Markdown APIAny URL as clean Markdown, with a score.
Perceive POST /v2/perceive - Web Scraping APIOne render, every output, each read scored.
Perceive POST /v2/perceive - RAG Ingestion APIA site or a set of files in, one chunked JSONL out.
Ingest POST /v2/ingest - Web Search APIA query in, ranked results and their pages out.
Lookup POST /v2/lookup - Website Change Monitoring APIWatch a URL and get a webhook when it changes.
Watch POST /v2/watch
Questions about structured extraction
How do I extract structured data from a website with an API?
Send POST /v2/distill with urls (up to 50 a request) and a schema, either a JSON Schema object or a flat map of field names to descriptions. The response data comes back normalized to exactly your schema’s top-level keys.
Do I have to write CSS selectors?
No. css_schema is optional, and without it every field goes to the LLM pass. Supplying one fills the selector-addressable fields for free and escalates only the fields it left empty.
How is the LLM cost capped?
The caps are layered: $0.05 per LLM call, $0.50 per request, at most 50 escalations a request, and your monthly AI-credit balance. LLM extraction spends credits, not ops. Hitting a cap never fails the request: the affected fields come back null with a warning.
Why are some fields null in the response?
Missing values are normalized to null, and missing lists to empty, to keep the shape guarantee. The LLM pass is skipped, with a warning, when the page was flagged as blocked or a budget cap was reached.
Can I extract the same schema from a whole site?
Yes. Send discover_from with a seed url, a mode (sitemap, crawl or hybrid) and max_pages from 1 to 50 instead of urls.
Which plans include it?
Distill requires a paid plan, and on the free plan the request is rejected with a 402. Each completed URL is one op, and the LLM pass spends monthly AI credits: $5, $15 or $40 on Indie, Studio and Production.