Skip to main content
Extract’s own endpoints live under https://api.zenrows.com/v1/extract/. They answer two questions that extract=auto cannot: which domains work today, and how to get one that doesn’t yet. None of them fetches a page, so none of them costs credits. Authenticate the same way as any Zenrows request, with either the apikey query parameter or the X-API-Key header. Both work on every endpoint below; the examples alternate to show each.

Which domains Extract serves

GET /v1/extract/domains

Every domain Extract can handle right now. This is the list behind Domain coverage, read live instead of from a page, so an integration can check coverage before sending a request rather than handling an error after one.
Response
A domain in this list is a domain you can send extract=auto to. A domain missing from it returns REQS007, naming the domain and pointing at the endpoint below.

Getting a domain prepared

Extract works on a domain once Zenrows has prepared it: learned its page shapes and verified that extraction actually returns the right data. You can ask for a domain to be prepared yourself, within a monthly allowance.
Preparing a domain is not instant. A submission is accepted immediately and then works through discovery, preparation and verification, typically minutes rather than seconds. Poll the status endpoint rather than blocking on the submit call.

POST /v1/extract/prepared-domains

Ask for a domain to be prepared. The body takes the domain and, optionally, example URLs. Send example URLs when you can. They are authoritative: Zenrows prepares exactly the page kinds you point at, and skips the discovery step that guesses them. One URL per page kind you care about is enough: a product page, a search results page. Send an Idempotency-Key header to make a retry safe: the same key returns the original submission instead of spending a second allowance slot.
A submission returns 202 Accepted and its starting state, in the same shape the status endpoint returns:
Response
Submitting a domain that is already prepared returns 202 with its current record rather than starting again, so a retry is never wasted.

GET /v1/extract/prepared-domains/{domain}

How far a submission has got.
A domain that was never submitted returns 404:
Response

Reading the response

Two fields describe progress, at two levels of detail. Branch on status; show state if you are drawing a progress bar. status is the answer to “can I use this domain yet”: state is the current step, and will gain steps over time: roles breaks the same progress down per page kind, each with its own status, the url it is working from, and a detail sentence if it stopped. It is only present for the account that submitted the domain, because example URLs disclose what you scrape and are not shown to other accounts polling it.

When a preparation fails

A failed submission carries a failure block with a code, a detail sentence, and slot_consumed:
Response
slot_consumed tells you whether the attempt cost you a slot, but it does not tell you what to do next on its own. Two failures hand the slot back and still need different responses: one is ours to fix and a plain retry works, the other will fail again with the same URLs. Read the code, and use slot_consumed for the billing half of the sentence:

GET /v1/extract/prepared-domains

Every domain your account has submitted, with your allowance alongside it.
Response
This lists what you submitted, which is a different question from which domains Extract serves. That one lists every prepared domain, however it got there.

GET /v1/extract/prepared-domains/allowance

How many domains you can still ask for this month, on its own.
Response
month is the UTC calendar month the count applies to; the allowance resets when it rolls over. A failure that returns your slot (slot_consumed: false) is not counted in used.

Errors

Alongside the standard Zenrows error codes, these endpoints return: An invalid submission is rejected before it costs anything:
Response