curl --request POST \
--url https://app.zenrows.com/api/agent/signup \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://app.zenrows.com/api/agent/signup"
payload = {}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://app.zenrows.com/api/agent/signup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.zenrows.com/api/agent/signup';
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.zenrows.com/api/agent/signup"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
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://app.zenrows.com/api/agent/signup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://app.zenrows.com/api/agent/signup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://app.zenrows.com/api/agent/signup")
.header("Content-Type", "application/json")
.body("{}")
.asString();{
"apiKey": "8d1c2e9f0a7b4c3d5e6f7a8b9c0d1e2f3a4b5c6d",
"accountId": "3f2b8c1e-5a4d-4e7f-9b6a-1c2d3e4f5a6b",
"claimUrl": "https://app.zenrows.com/claim/q7Rk2LmX9pTz?utm_source=agent",
"trialEndsAt": "2026-11-15T10:00:00+00:00"
}{
"error": "rate_limited",
"message": "<string>"
}{
"error": "rate_limited",
"message": "<string>"
}{
"error": "rate_limited",
"message": "<string>"
}Get an API key for your agent, no signup required
Start using Zenrows from your agent without signing up. This call returns a working API key straight away: no account setup, no login, no payment details. The key works right away on the free plan. The account is on the Free plan from signup: 5,000 credits per month, renewed monthly. A person who wants to own it opens claimUrl and claims it; the same key keeps working.
Contract published at https://app.zenrows.com/agent-onboarding/auth.md, and advertised as agent_auth.signup_endpoint in https://app.zenrows.com/.well-known/oauth-protected-resource.
curl --request POST \
--url https://app.zenrows.com/api/agent/signup \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://app.zenrows.com/api/agent/signup"
payload = {}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://app.zenrows.com/api/agent/signup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.zenrows.com/api/agent/signup';
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.zenrows.com/api/agent/signup"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
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://app.zenrows.com/api/agent/signup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://app.zenrows.com/api/agent/signup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://app.zenrows.com/api/agent/signup")
.header("Content-Type", "application/json")
.body("{}")
.asString();{
"apiKey": "8d1c2e9f0a7b4c3d5e6f7a8b9c0d1e2f3a4b5c6d",
"accountId": "3f2b8c1e-5a4d-4e7f-9b6a-1c2d3e4f5a6b",
"claimUrl": "https://app.zenrows.com/claim/q7Rk2LmX9pTz?utm_source=agent",
"trialEndsAt": "2026-11-15T10:00:00+00:00"
}{
"error": "rate_limited",
"message": "<string>"
}{
"error": "rate_limited",
"message": "<string>"
}{
"error": "rate_limited",
"message": "<string>"
}Headers
Optional provenance, anonymous and free of personal data.
Optional name of the calling client.
Optional origin of the signup.
Body
No fields are required. An empty body is the normal call.
Response
The account exists and the key works immediately.
Pass it as the apikey query parameter to Fetch, or as X-API-Key to Batch.
Where a person claims the account to own it. Show this link to a human; do not sit on it.
End of the first monthly period (signup + 1 month). The Free plan renews monthly; this value is not refreshed.
Was this page helpful?