Skip to main content

Extraction API

Your schema in, JSON out, from any URL

No selectors to write and none to break when the site changes: say what each field means, and the page's data comes back in your shape.

By · Last updated: October 2026

TL;DR

POST a URL and a list of fields to /extract and get back an object with exactly those keys, filled from the page: strings, numbers, dates, URLs, emails, nested objects and lists of objects. The page is rendered in a real browser and read whole — text, links, tables and its JSON-LD — and any value it does not give comes back null, never guessed. 24 credits per extraction.

Free plan, no credit card. 1,000 credits a month.

Try it now — no signup

Free · no signup · 2 runs every 10 minutes

…or try one of these

Your result will appear here.

Enter a URL above, or pick one of the example pages.

The request

One POST, one bearer token

POST /extract
curl -X POST https://urlpipe.dev/extract \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/products/trail-runner-3", "sync": true, "fields": [{"name":"name","type":"string"},{"name":"price","type":"number","description":"The current price, without the currency"},{"name":"images","type":"array","items":"url"}]}'
Response
{
  "name": "Trail Runner 3",
  "price": 129.95,
  "images": [
    "https://example.com/img/trail-runner-3-side.jpg",
    "https://example.com/img/trail-runner-3-top.jpg"
  ]
}

Fields

Describe the fields, not the page

Each field has a name (the key it comes back under), a type and, worth writing, a description — what a model reads to decide which value on the page you mean. Say it the way you would to a person: the sale price if there is one, otherwise the regular price. An optional instructions string applies to every field.

TypeComes back as
stringText, as the page writes it
number, integerA number without currency symbols, units or separators
booleantrue or false
date, datetimeISO 8601 — 2026-10-08
urlAn absolute URL; relative links are resolved against the page
emailAn email address
objectA group of values with its own fields
arrayEvery match on the page, in page order — of one type, or of objects with fields

Up to 50 fields in all, nested at most 3 levels deep. A schema that breaks the rules is refused with a message naming the field, before anything is fetched or spent. The /extract reference has every rule.

Arrays of objects

A list of things, each with its attributes

Every job on a careers page
{
  "url": "https://example.com/careers",
  "fields": [
    { "name": "company", "type": "string" },
    { "name": "jobs", "type": "array", "description": "Every open position", "items": {
        "type": "object",
        "fields": [
          { "name": "title", "type": "string" },
          { "name": "location", "type": "string", "description": "City, or Remote" },
          { "name": "posted_on", "type": "date" },
          { "name": "apply_url", "type": "url" }
        ]
    } }
  ]
}

How it works

Null, not a guess

  • The page is rendered in a real browser, so content added by JavaScript is there. A URL that serves a PDF or a text file is read from its text — see documents & files.
  • The whole page is read, not only its article text: its text, links, tables, image alt text and its structured data — JSON-LD, microdata, meta tags — where prices, dates and identifiers often are.
  • A language model with a short reasoning step fills your schema. It is told to leave a value null rather than guess, and its answer is held to your schema: every key there, nothing else, and a value that does not fit its type turned into null.

Use cases

What people build with it

  • Price and plan monitoring. The same fields from competitors' pricing pages every week, with max_age deciding how fresh each run must be.
  • Lead and directory enrichment. Company name, contact email, social profiles and address from each site on a list.
  • Listings into rows. Job boards, event pages, property listings and catalogues as arrays of objects, ready for a database.
  • Documents. An invoice's total, a report's figures or a datasheet's specs from a PDF link, in the same fields you would ask of a page.

Pricing

What it costs

An extraction costs 24 credits, whatever the number of fields. The same URL with the same fields and instructions is answered for free while the stored result is fresher than max_age; change a field, its order or its description and it is a new extraction. A failed request costs nothing. When the standard metadata is all you need — title, image, authors, dates — the metadata API gives it for 1 credit and no model.

Limits

What it does not do

  • One page per request. It does not follow pagination or crawl a site; send each page.
  • No interaction. No clicks, logins or form fills before the page is read.
  • Only what the page says. It does not look values up elsewhere or infer what the page leaves out — those come back null.
  • Public pages only. Private and intranet addresses are refused.

Pricing

What it costs

CallCreditsFree (calls/mo)Starter (calls/mo)Pro (calls/mo)Scale (calls/mo)
/extract24 credits418332,2917,291

Cache hits and failed requests cost nothing. Paid plans are never cut off: past the allowance, extra credits are $1.50 per 1,000 credits. See every plan.

FAQ

Frequently asked questions

No. You describe each field with a name, a type and a description, and the page is read for it. Nothing breaks when the site changes its markup.

Make your first request in five minutes.

Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.