↑ ↓ to move ↵ to open

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"  }'

The fields come back in results[0].data.data. This is from a run on staging on 16 October 2026:

results[0].data.data
{  "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 a number and you get a number, not "USD 100". Each property's description tells the extractor what to look for.

  • mode: a ready-made shape. product returns a product record; selectors reads the CSS selectors you give in selectors (add @attr to read an attribute, such as a@href); highlights returns the passages that answer your question.

Choose how much AI helps

ai decides what happens when the page doesn't state a field plainly:

aiWhat happens
neverOnly what the page states. A field it doesn't hold stays empty and is listed in unresolved_fields.
autoThe page first; AI fills only the fields left empty.
alwaysAI 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.