Sync Sitemap Feed
curl --request POST \
--url https://server.promptwatch.com/api/v2/sitemaps/{id}/sync \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/sitemaps/{id}/sync"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/sitemaps/{id}/sync', 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/sitemaps/{id}/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://server.promptwatch.com/api/v2/sitemaps/{id}/sync"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://server.promptwatch.com/api/v2/sitemaps/{id}/sync")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/sitemaps/{id}/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://example.com/sitemap.xml",
"lastSyncedAt": "2026-09-15T08:00:00.000Z",
"urlsDiscovered": 412,
"createdAt": "2026-04-01T08:00:00.000Z",
"updatedAt": "2026-09-15T08:00:00.000Z",
"crawlStats": {
"totalUrls": 500,
"addedUrls": 412,
"filteredUrls": 88
}
}{
"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"
}{
"code": "SITEMAP_DOMAIN_MISMATCH",
"message": "Sitemap URL domain does not match project website domain"
}Sitemap
Sync Sitemap Feed
Re-crawl one sitemap XML feed and ingest new page URLs. Use this after turning allowCrossSubdomainSync on; PATCH /sitemap/settings does not crawl.
POST
/
sitemaps
/
{id}
/
sync
Sync Sitemap Feed
curl --request POST \
--url https://server.promptwatch.com/api/v2/sitemaps/{id}/sync \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/sitemaps/{id}/sync"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/sitemaps/{id}/sync', 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/sitemaps/{id}/sync",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://server.promptwatch.com/api/v2/sitemaps/{id}/sync"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://server.promptwatch.com/api/v2/sitemaps/{id}/sync")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/sitemaps/{id}/sync")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://example.com/sitemap.xml",
"lastSyncedAt": "2026-09-15T08:00:00.000Z",
"urlsDiscovered": 412,
"createdAt": "2026-04-01T08:00:00.000Z",
"updatedAt": "2026-09-15T08:00:00.000Z",
"crawlStats": {
"totalUrls": 500,
"addedUrls": 412,
"filteredUrls": 88
}
}{
"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"
}{
"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.
Path Parameters
Sitemap feed identifier
Response
Default Response
Sitemap feed identifier
Sitemap XML URL
When this feed was last crawled
Page URLs kept after host filtering on the last crawl
Show child attributes
Show child attributes