Ask Site
curl --request POST \
--url https://api.example.com/v1/ask-site \
--header 'Content-Type: application/json' \
--data '
{
"site_id": "<string>",
"question": "<string>",
"max_cost_usd": "<string>"
}
'import requests
url = "https://api.example.com/v1/ask-site"
payload = {
"site_id": "<string>",
"question": "<string>",
"max_cost_usd": "<string>"
}
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({site_id: '<string>', question: '<string>', max_cost_usd: '<string>'})
};
fetch('https://api.example.com/v1/ask-site', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/ask-site",
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([
'site_id' => '<string>',
'question' => '<string>',
'max_cost_usd' => '<string>'
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/ask-site"
payload := strings.NewReader("{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}")
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))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/ask-site")
.header("Content-Type", "application/json")
.body("{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/ask-site")
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 = "{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Sites
POST /v1/ask-site
Ask a cited question about your prepared site for $0.10 per completed answer.
POST
/
v1
/
ask-site
Ask Site
curl --request POST \
--url https://api.example.com/v1/ask-site \
--header 'Content-Type: application/json' \
--data '
{
"site_id": "<string>",
"question": "<string>",
"max_cost_usd": "<string>"
}
'import requests
url = "https://api.example.com/v1/ask-site"
payload = {
"site_id": "<string>",
"question": "<string>",
"max_cost_usd": "<string>"
}
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({site_id: '<string>', question: '<string>', max_cost_usd: '<string>'})
};
fetch('https://api.example.com/v1/ask-site', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/ask-site",
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([
'site_id' => '<string>',
'question' => '<string>',
'max_cost_usd' => '<string>'
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/ask-site"
payload := strings.NewReader("{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}")
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))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/ask-site")
.header("Content-Type", "application/json")
.body("{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/ask-site")
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 = "{\n \"site_id\": \"<string>\",\n \"question\": \"<string>\",\n \"max_cost_usd\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Prepare the polygon through Sites, then submit your
account-owned
The price is $0.10 per completed answer on every plan. Send a stable
site_id and question. A ready dossier supports a cited answer
without repeating the complete preparation. The evidence is a snapshot from
built_at, not a live re-screen.
{"site_id":"site_example","question":"How much area is affected by flood constraints?","max_cost_usd":"0.10"}
Idempotency-Key to retry the same operation safely. Responses include the dollar
billing receipt. An incomplete or failed answer costs zero; a still-building
site returns 202 without charging. Unknown, expired or another account’s site
cannot be read. Accept current terms and keep the required source permissions.
An error with operation_status: "failed" and retryable: false confirms a
terminal operation. That key cannot restart work. To try again, explicitly submit
a new request with a new idempotency key; a successful new request is billed at
the normal price. For interrupted delivery or an unknown outcome, keep the
original key and recover that operation before considering a replacement.
The answer includes citations and source evidence; inspect uncertainty and data
gaps before applying a site-wide conclusion. Free site preparation and status
reads do not return the premium dossier. See Pricing for balances,
reservation, result recovery and retention.
A completed answer is recoverable for 30 days after that answer completes, even
if its prepared dossier expires or is rebuilding. Retry the same request and
idempotency key to collect the saved answer without another charge. Current
account ownership, terms and licensed-data permissions still apply; source
withdrawal can block delivery. A new question or new key requires a ready dossier.