curl --request PATCH \
--url https://server.promptwatch.com/api/v2/sitemap/settings \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"allowCrossSubdomainSync": true,
"slowCrawlEnabled": true,
"verifiedBotMode": true
}
'import requests
url = "https://server.promptwatch.com/api/v2/sitemap/settings"
payload = {
"allowCrossSubdomainSync": True,
"slowCrawlEnabled": True,
"verifiedBotMode": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({allowCrossSubdomainSync: true, slowCrawlEnabled: true, verifiedBotMode: true})
};
fetch('https://server.promptwatch.com/api/v2/sitemap/settings', 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://server.promptwatch.com/api/v2/sitemap/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'allowCrossSubdomainSync' => true,
'slowCrawlEnabled' => true,
'verifiedBotMode' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://server.promptwatch.com/api/v2/sitemap/settings"
payload := strings.NewReader("{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://server.promptwatch.com/api/v2/sitemap/settings")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/sitemap/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}"
response = http.request(request)
puts response.read_body{
"allowCrossSubdomainSync": false,
"slowCrawlEnabled": false,
"verifiedBotMode": false,
"userAgent": "promptwatch-bot/1.0 (+https://promptwatch.com/bot)"
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 90 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "SITEMAP_DOMAIN_MISMATCH",
"message": "Sitemap URL domain does not match project website domain"
}Update Sitemap Settings
Update one or more crawler flags. PATCH only writes the flags; it does not crawl. After turning allowCrossSubdomainSync on, POST /sitemaps/:id/sync to ingest subdomain URLs that were previously filtered. Slow crawl and verified bot apply on the next crawl with no extra sync.
curl --request PATCH \
--url https://server.promptwatch.com/api/v2/sitemap/settings \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"allowCrossSubdomainSync": true,
"slowCrawlEnabled": true,
"verifiedBotMode": true
}
'import requests
url = "https://server.promptwatch.com/api/v2/sitemap/settings"
payload = {
"allowCrossSubdomainSync": True,
"slowCrawlEnabled": True,
"verifiedBotMode": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({allowCrossSubdomainSync: true, slowCrawlEnabled: true, verifiedBotMode: true})
};
fetch('https://server.promptwatch.com/api/v2/sitemap/settings', 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://server.promptwatch.com/api/v2/sitemap/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'allowCrossSubdomainSync' => true,
'slowCrawlEnabled' => true,
'verifiedBotMode' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://server.promptwatch.com/api/v2/sitemap/settings"
payload := strings.NewReader("{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.patch("https://server.promptwatch.com/api/v2/sitemap/settings")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/sitemap/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowCrossSubdomainSync\": true,\n \"slowCrawlEnabled\": true,\n \"verifiedBotMode\": true\n}"
response = http.request(request)
puts response.read_body{
"allowCrossSubdomainSync": false,
"slowCrawlEnabled": false,
"verifiedBotMode": false,
"userAgent": "promptwatch-bot/1.0 (+https://promptwatch.com/bot)"
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 90 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "SITEMAP_DOMAIN_MISMATCH",
"message": "Sitemap URL domain does not match project website domain"
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Response
Default Response
When true, sitemap crawls keep URLs under the project's root domain (blog.example.com, shop.example.com). When false, only the project host and www are kept. PATCH only flips the flag; it does not crawl. To ingest previously filtered subdomain URLs, POST /sitemaps/:id/sync after turning this on.
Pace page crawls at about 15 pages/min. Use for Shopify and other hosts that rate-limit crawlers.
Identify sitemap and page crawls with the branded userAgent so you can whitelist it in a WAF. Most sites do not need this.
User-Agent sent when verifiedBotMode is on. Read-only; whitelist this in Cloudflare/WAF.