curl --request GET \
--url 'https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey='import requests
url = "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=';
const options = {method: 'GET'};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.get("https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=")
.asString();{
"domain": "scrapingcourse.com",
"status": "ready",
"state": "ready",
"roles": [
{
"role": "detail",
"status": "ready"
}
],
"submitted_at": "2026-09-11T14:33:45Z",
"updated_at": "2026-09-11T14:35:03Z"
}{
"code": "AUTH002",
"detail": "Invalid API key.",
"instance": "/v1",
"status": 401,
"title": "Invalid apikey provided (AUTH002)",
"type": "https://docs.zenrows.com/api-error-codes#AUTH002"
}{
"code": "invalid_argument",
"detail": "<string>",
"reason": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}Track a domain's preparation
How far a submission has got. Branch on status (preparing, ready, failed); state is the finer-grained step. Costs no credits. Documented at https://docs.zenrows.com/extract/endpoints.
curl --request GET \
--url 'https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey='import requests
url = "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=';
const options = {method: 'GET'};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.get("https://api.zenrows.com/v1/extract/prepared-domains/{domain}?apikey=")
.asString();{
"domain": "scrapingcourse.com",
"status": "ready",
"state": "ready",
"roles": [
{
"role": "detail",
"status": "ready"
}
],
"submitted_at": "2026-09-11T14:33:45Z",
"updated_at": "2026-09-11T14:35:03Z"
}{
"code": "AUTH002",
"detail": "Invalid API key.",
"instance": "/v1",
"status": 401,
"title": "Invalid apikey provided (AUTH002)",
"type": "https://docs.zenrows.com/api-error-codes#AUTH002"
}{
"code": "invalid_argument",
"detail": "<string>",
"reason": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}Authorizations
Fetch, Extract, Crawl and the account endpoint accept the key as the apikey query parameter. Keys are per account and self-serve: create one in the Zenrows dashboard (app.zenrows.com), or, for an agent with no human present, POST https://app.zenrows.com/api/agent/signup.
Path Parameters
The domain, without scheme.
Response
The domain's most recent submission.
A domain's preparation for Extract.
Whether the domain can be used yet. Branch on this.
preparing, ready, failed The current step. Gains steps over time.
"received"
"discovering"
"preparing"
"verifying"
"ready"
"failed"
Progress per kind of page. Only present for the account that submitted the domain.
Show child attributes
Show child attributes
Present when status is failed.
Show child attributes
Show child attributes
Was this page helpful?