Extract API
Name the fields you want and get them from any page as JSON.
Tell the Extract API which fields you want, in plain words or as a JSON Schema, and it reads them from any public page. Each value comes back with how sure the extractor is and where on the page it found it.
Call it
curl https://data.upscrape.com/extract \ -H "Authorization: Bearer $UPSCRAPE_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=30" \ -d '{ "url": "https://www.allbirds.com/products/mens-tree-runners", "fields": { "name": "product name", "price": "current price", "rating": "average review rating" }, "ai": "never" }'
import osimport requestsjob = requests.post( "https://data.upscrape.com/extract", headers={"Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Prefer": "wait=30"}, json={ "url": "https://www.allbirds.com/products/mens-tree-runners", "fields": {"name": "product name", "price": "current price", "rating": "average review rating"}, "ai": "never", },).json()print(job["results"][0]["data"]["data"])
const res = await fetch("https://data.upscrape.com/extract", { method: "POST", headers: { Authorization: `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", Prefer: "wait=30", }, body: JSON.stringify({ url: "https://www.allbirds.com/products/mens-tree-runners", fields: { name: "product name", price: "current price", rating: "average review rating" }, ai: "never", }),});const job = await res.json();console.log(job.results[0].data.data);
The fields come back in results[0].data.data. This is from a run on staging on 16 October 2026:
{ "name": "Men's Tree Runners - Black - Everyday Sneakers | Allbirds", "price": "USD 100", "rating": "4.6"}
Say what you want
Use one of three ways:
fields: each field's name and a short description, as above. The quickest start.output_schema: a JSON Schema of the result you want. Use it for types: ask for anumberand you get a number, not "USD 100". Each property'sdescriptiontells the extractor what to look for.mode: a ready-made shape.productreturns a product record;selectorsreads the CSS selectors you give inselectors(add@attrto read an attribute, such asa@href);highlightsreturns the passages that answer yourquestion.
Choose how much AI helps
ai decides what happens when the page doesn't state a field plainly:
ai | What happens |
|---|---|
never | Only what the page states. A field it doesn't hold stays empty and is listed in unresolved_fields. |
auto | The page first; AI fills only the fields left empty. |
always | AI reads every field. |
Every value carries confidence and source in results[0].data.fields, so you can drop answers that aren't sure enough.
Read a list across pages
Set follow_links: true and max_pages (up to 50) to follow the page's own links on the same site and merge the results: lists are joined, and single fields are filled from the first page that has them. Each page visited is part of the one call.
Something missing or unclear? Ask the team that builds the endpoints.