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.

Get API key
one page in200
records50
fields each7
credits5
selectors written0
nulls1, where the page is empty
guessesnone

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.

en.wikipedia.org/wiki/List_of_largest_companies_by_revenuePOST /v1/web/extract5 credits

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
rankintegernamestringindustrystringrevenueUsdMillionsintegerprofitUsdBillionsnumber | nullemployeesintegerheadquartersstring
1AmazonRetail, Information technology716,00079.91,576,000United States
2WalmartRetail713,00021.82,100,000United States
3State Grid Corporation of ChinaElectricity545,0009.21,361,423China
4Saudi AramcoOil and gas480,00010673,311Saudi Arabia
5China National Petroleum CorporationOil and gas476,00025.21,026,301China
6China Petrochemical CorporationOil and gas429,0009.3513,434China
7AppleInformation technology416,000112166,000United States
8AlphabetInformation technology402,000132190,820United States
9UnitedHealth GroupHealthcare400,00014.4400,000United States
10Berkshire HathawayFinancials371,00088.9392,400United States
11CVS HealthHealthcare357,0008.3259,500United States
12Volkswagen GroupAutomotive348,00017.9684,025Germany
13ExxonMobilOil and gas344,0003661,500United States
14VitolCommodities331,000131,560Switzerland
15ShellOil and gas323,00019.3103,000United Kingdom
16China State Construction EngineeringConstruction320,0004.2382,894China
17ToyotaAutomotive312,00034.2380,793Japan
18McKessonHealthcare308,000348,000United States
19MicrosoftInformation technology281,000101228,000United States
20CencoraHealthcare262,0001.744,000United States
21TrafiguraCommodities244,0007.312,479Singapore
22CostcoRetail242,0006.2316,000United States
23JPMorgan ChaseFinancials239,00049.5309,926United States
24Industrial and Commercial Bank of ChinaFinancials222,00051.4419,252China
25Schwarz GruppeRetail220,000null604,000Germany
26TotalEnergiesOil and gas218,00021.3102,579France
27GlencoreCommodities217,0004.283,426Switzerland
28NvidiaSemiconductors215,00012036,000United States
29BPOil and gas213,00015.279,400United Kingdom
30Cardinal HealthHealthcare205,0000.2647,520United States
31StellantisAutomotive204,00020.1258,275Netherlands
32ChevronOil and gas200,00021.345,600United States
33China Construction BankFinancials199,00046.9376,871China
34Samsung ElectronicsElectronics198,00011267,860South Korea
35FoxconnElectronics197,0004.5621,393Taiwan
36CignaHealthcare195,0005.171,413United States
37Agricultural Bank of ChinaFinancials192,00038451,003China
38China Railway Engineering CorporationConstruction178,0002.1314,149China
39CargillConglomerate177,00017.6160,000United States
40Ford Motor CompanyAutomotive176,0004.3177,000United States
41Bank of ChinaFinancials172,00032.7306,931China
42Bank of AmericaFinancials171,00026.5212,985United States
43General MotorsAutomotive171,00010.1163,000United States
44Elevance HealthHealthcare171,0005.9104,900United States
45BMW GroupAutomotive168,00012.2154,950Germany
46Mercedes-Benz GroupAutomotive165,00015.4166,056Germany
47Meta PlatformsSocial media164,00062.378,450United States
48China Railway Construction CorporationConstruction160,0001.7336,433China
49BaowuSteel157,0002.4258,697China
50CitigroupFinancials156,0009.2237,925United 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.

[ Start ]

Clean web data is one call away.

500 free credits, no card required. Failures are never billed.

Success rate

 

Median scrape

 ms