Describe the rows you want. Get the rows you want.
A JSON schema in, typed records out. No selectors to write, nothing to rewrite when the page is redesigned, and an explicit null wherever the page has nothing to give you.
schema in · typed rows out
[ 01 / How it works ]
A schema in. Typed rows out.
The schema is the contract. Everything about how the page is built stays on our side of it, which is why a redesign does not become your problem.
Describe
Write the shape you want
A JSON schema, the same one your database already implies. No selectors, no XPath, nothing tied to how this particular page is built.
const schema = {
rank: 'integer',
name: 'string',
};Extract
Point it at the page
One call fetches, cleans and fills the schema. A field the page does not carry comes back null rather than as a plausible guess.
const { data } = await hf.extract({
urls: [url],
schema,
});Load
Write it straight in
The records are already typed to your schema, so the pipeline that consumes them has nothing left to parse or coerce.
await db.companies.insertMany(
data.companies,
);[ 02 / The demo ]
One page, fifty typed records.
A real extraction, shown whole. The schema on the left is the one that was sent, and every row on the right came back from that single call.
Request body
{
"urls": ["en.wikipedia.org/wiki/List_of_largest_companies_by_revenue"],
"schema": {
"companies": [{
}]
}
}
click a field to drop it
- records
- 50
- fields returned
- nulls
- selectors written
- 0
| rankinteger | namestring | industrystring | revenueUsdMillionsinteger | profitUsdBillionsnumber | null | employeesinteger | headquartersstring |
|---|---|---|---|---|---|---|
| 1 | Amazon | Retail, Information technology | 716,000 | 79.9 | 1,576,000 | United States |
| 2 | Walmart | Retail | 713,000 | 21.8 | 2,100,000 | United States |
| 3 | State Grid Corporation of China | Electricity | 545,000 | 9.2 | 1,361,423 | China |
| 4 | Saudi Aramco | Oil and gas | 480,000 | 106 | 73,311 | Saudi Arabia |
| 5 | China National Petroleum Corporation | Oil and gas | 476,000 | 25.2 | 1,026,301 | China |
| 6 | China Petrochemical Corporation | Oil and gas | 429,000 | 9.3 | 513,434 | China |
| 7 | Apple | Information technology | 416,000 | 112 | 166,000 | United States |
| 8 | Alphabet | Information technology | 402,000 | 132 | 190,820 | United States |
| 9 | UnitedHealth Group | Healthcare | 400,000 | 14.4 | 400,000 | United States |
| 10 | Berkshire Hathaway | Financials | 371,000 | 88.9 | 392,400 | United States |
| 11 | CVS Health | Healthcare | 357,000 | 8.3 | 259,500 | United States |
| 12 | Volkswagen Group | Automotive | 348,000 | 17.9 | 684,025 | Germany |
| 13 | ExxonMobil | Oil and gas | 344,000 | 36 | 61,500 | United States |
| 14 | Vitol | Commodities | 331,000 | 13 | 1,560 | Switzerland |
| 15 | Shell | Oil and gas | 323,000 | 19.3 | 103,000 | United Kingdom |
| 16 | China State Construction Engineering | Construction | 320,000 | 4.2 | 382,894 | China |
| 17 | Toyota | Automotive | 312,000 | 34.2 | 380,793 | Japan |
| 18 | McKesson | Healthcare | 308,000 | 3 | 48,000 | United States |
| 19 | Microsoft | Information technology | 281,000 | 101 | 228,000 | United States |
| 20 | Cencora | Healthcare | 262,000 | 1.7 | 44,000 | United States |
| 21 | Trafigura | Commodities | 244,000 | 7.3 | 12,479 | Singapore |
| 22 | Costco | Retail | 242,000 | 6.2 | 316,000 | United States |
| 23 | JPMorgan Chase | Financials | 239,000 | 49.5 | 309,926 | United States |
| 24 | Industrial and Commercial Bank of China | Financials | 222,000 | 51.4 | 419,252 | China |
| 25 | Schwarz Gruppe | Retail | 220,000 | null | 604,000 | Germany |
| 26 | TotalEnergies | Oil and gas | 218,000 | 21.3 | 102,579 | France |
| 27 | Glencore | Commodities | 217,000 | 4.2 | 83,426 | Switzerland |
| 28 | Nvidia | Semiconductors | 215,000 | 120 | 36,000 | United States |
| 29 | BP | Oil and gas | 213,000 | 15.2 | 79,400 | United Kingdom |
| 30 | Cardinal Health | Healthcare | 205,000 | 0.26 | 47,520 | United States |
| 31 | Stellantis | Automotive | 204,000 | 20.1 | 258,275 | Netherlands |
| 32 | Chevron | Oil and gas | 200,000 | 21.3 | 45,600 | United States |
| 33 | China Construction Bank | Financials | 199,000 | 46.9 | 376,871 | China |
| 34 | Samsung Electronics | Electronics | 198,000 | 11 | 267,860 | South Korea |
| 35 | Foxconn | Electronics | 197,000 | 4.5 | 621,393 | Taiwan |
| 36 | Cigna | Healthcare | 195,000 | 5.1 | 71,413 | United States |
| 37 | Agricultural Bank of China | Financials | 192,000 | 38 | 451,003 | China |
| 38 | China Railway Engineering Corporation | Construction | 178,000 | 2.1 | 314,149 | China |
| 39 | Cargill | Conglomerate | 177,000 | 17.6 | 160,000 | United States |
| 40 | Ford Motor Company | Automotive | 176,000 | 4.3 | 177,000 | United States |
| 41 | Bank of China | Financials | 172,000 | 32.7 | 306,931 | China |
| 42 | Bank of America | Financials | 171,000 | 26.5 | 212,985 | United States |
| 43 | General Motors | Automotive | 171,000 | 10.1 | 163,000 | United States |
| 44 | Elevance Health | Healthcare | 171,000 | 5.9 | 104,900 | United States |
| 45 | BMW Group | Automotive | 168,000 | 12.2 | 154,950 | Germany |
| 46 | Mercedes-Benz Group | Automotive | 165,000 | 15.4 | 166,056 | Germany |
| 47 | Meta Platforms | Social media | 164,000 | 62.3 | 78,450 | United States |
| 48 | China Railway Construction Corporation | Construction | 160,000 | 1.7 | 336,433 | China |
| 49 | Baowu | Steel | 157,000 | 2.4 | 258,697 | China |
| 50 | Citigroup | Financials | 156,000 | 9.2 | 237,925 | United States |
Drop a field and the response drops it too. That is the difference between describing what you want and selecting it out of a page: the shape is yours, and nothing about how this page is built reaches your side of the call. Keep profitUsdBillions on and watch row 25. The source table prints n/a for that company's profit, so the value is null. A model asked to fill a schema will happily invent something plausible there, and a plausible wrong value is worse than an empty one, because it survives every validation you have and turns up as a fact months later.
[ 03 / Built for ]
Anyone maintaining a parser they did not want to write.
The work is never the first extraction. It is the sixtieth site, and the rewrite when one of them ships a redesign.
Price monitoring
Every retailer needs its own parser, and each redesign breaks one.
One schema covers all of them, and a new layout changes nothing.
Research and analysis
The dataset you need exists, but only as tables across many pages.
Point the same schema at each page and rows arrive already comparable.
Directory building
Listings carry the same facts in a different shape on every site.
The schema normalises them on the way in, so merging is not a project.
Filings and disclosure
A wrong figure is worse than a missing one when it is on the record.
Absent values come back null, so a gap never masquerades as a number.
Marketplace catalogues
Onboarding a supplier means writing an importer for their site.
Their catalogue maps to your fields on the first call, not the first sprint.
Operations and pipelines
Scrapers fail quietly and the table just stops growing.
A typed response either matches your schema or it fails loudly.
[ 04 / Keep going ]
Same API. Other problems.
Web data for AI
Ground RAG in fresh content
Crawl a site on a schedule and pipe clean Markdown into your embeddings.
ReadWeb data for AI
Give an agent the live web
Search mid-answer and get results already fetched, cleaned and citable.
ReadWeb data for AI
Watch pages for changes
Re-run a set on a schedule and diff what came back.
Read[ Start ]
Clean web data is one call away.
500 free credits, no card required. Failures are never billed.
Success rate
Median scrape
ms