Skip to main content
Extract learns each website’s page shapes once, then returns clean JSON for every page of that kind. To add a new site, prepare it yourself: send one example URL per kind of page, poll the status for a few moments, and start extracting. Every Zenrows account can use the domain once it’s ready. Uses: the Extract endpoints (GET /v1/extract/domains, POST /v1/extract/prepared-domains, GET /v1/extract/prepared-domains/{domain}) and Extract (extract=auto)

Ask your AI agent

With the Zenrows MCP server connected to Claude, Cursor or any MCP client, paste this prompt. Your agent picks the right Zenrows tools and settings on its own.
When a site is new to Extract, the agent still returns JSON. To prepare the domain itself, run the steps below once; the prompt then gets site-tailored fields on every page of that kind, for one product or thousands.

How it works

  1. Check coverage. GET /v1/extract/domains lists every domain Extract serves now. It’s free.
  2. Ask for the domain. POST /v1/extract/prepared-domains with the domain and example_urls, one URL per kind of page you want (a product page, a search page).
  3. Poll the status. GET /v1/extract/prepared-domains/{domain} moves through received, preparing and verifying to ready. Preparation usually takes seconds to minutes.
  4. Extract. Send extract=auto to any page of the kinds you prepared.
The three Extract endpoints are free: none of them fetches a page.

Check whether a domain is covered

Output (before preparing)
Sending extract=auto to a new domain returns 403 with REQS007, free of charge, and the message points to the next step:

Prepare the domain and wait until it’s ready

Send the domain without a scheme, and one example URL per kind of page. Then poll every 30 seconds and branch on status: preparing, ready or failed.
The statuses from the test run, which went from submission to ready in under a minute:
Output
The final status record, with roles showing each page kind you sent:
The detail sentence names any field that comes back empty on this site, so you know which fields to read before you build on them. Submitting a domain that’s already ready returns 202 with this same record, so a retry is always safe.

Extract pages from the new domain

Once the status reads ready, extract=auto works on every page of the prepared kind, not just the example URL. This request reads a different product than the one used for preparation:

Example output

The parsed field for the Women’s Tree Runner page, trimmed:
Fields are tailored to the site: here materials, technical_specs and per-size variants with SKUs. The domain also appears in GET /v1/extract/domains now (424 domains; True).

Customize it

Troubleshooting

  • failed with unpreparable and a role detail of “the target could not be fetched”: that example URL returned no usable page. Resubmit with a different URL of the same kind, or with the URLs that worked.
  • A role reads “this page was prepared, but the domain was not finalized”: another URL in the same submission failed. Resubmit without that URL.
  • failed with discovery_failed: resubmit with example_urls, so Zenrows prepares the exact page kinds you point at.
  • 409 with in_progress: a preparation for that domain is already running. Poll its status instead of resubmitting.
  • REQS007 on a page of a ready domain: that page kind needs preparing too. Contact support with the URL to add it.
  • A field is always empty: check the detail sentence on the role. It names the fields that site’s pages leave empty.
See When a preparation fails for every failure code and the next step for each.

Get structured JSON from any page

How extract=auto works, with extract_fields and the SDKs.

Turn search and listing pages into JSON

Collect every item across search and category pages.

Validate extracted data with a schema

Type and check every row before you store it.

Scrape a list of URLs

Run Extract on thousands of pages as one Batch job.