curl --request GET \
--url https://server.promptwatch.com/api/v2/site-audit/issues \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/site-audit/issues"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/site-audit/issues', 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/site-audit/issues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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/site-audit/issues"
req, _ := http.NewRequest("GET", 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.get("https://server.promptwatch.com/api/v2/site-audit/issues")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/site-audit/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"counts": {
"status4xx": 2
},
"nextCursor": null,
"rows": [
{
"checkedAt": "2026-08-01T09:12:00.000Z",
"isNew": true,
"issue": "status4xx",
"label": "Page returns a 4xx error",
"severity": "error",
"statusCode": 404,
"ttfbMs": 120,
"url": "https://example.com/gone",
"urlHash": "9f2b1c4d5e6f7a8b"
}
],
"runId": "6ba7b820-9dad-11d1-80b4-00c04fd430c8",
"total": 2
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 92 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}List site audit issues
URLs a run flagged, errors first, then by check within a tier. Filter by check id, severity or a URL substring. Omit runId for the newest finished run. Keyset-paginated: pass the returned nextCursor as cursor.
curl --request GET \
--url https://server.promptwatch.com/api/v2/site-audit/issues \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/site-audit/issues"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://server.promptwatch.com/api/v2/site-audit/issues', 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/site-audit/issues",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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/site-audit/issues"
req, _ := http.NewRequest("GET", 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.get("https://server.promptwatch.com/api/v2/site-audit/issues")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/site-audit/issues")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"counts": {
"status4xx": 2
},
"nextCursor": null,
"rows": [
{
"checkedAt": "2026-08-01T09:12:00.000Z",
"isNew": true,
"issue": "status4xx",
"label": "Page returns a 4xx error",
"severity": "error",
"statusCode": 404,
"ttfbMs": 120,
"url": "https://example.com/gone",
"urlHash": "9f2b1c4d5e6f7a8b"
}
],
"runId": "6ba7b820-9dad-11d1-80b4-00c04fd430c8",
"total": 2
}{
"error": "Bad Request",
"code": "DATE_RANGE_TOO_LARGE",
"message": "Date range cannot exceed 92 days"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Query Parameters
Cursor from the previous response's nextCursor
Checks to include. Repeat for multiple: issues=status4xx&issues=missingTitle. Omit for every check that fired. Ids: status4xx, status5xx, brokenInternalLink, redirectChainTooLong, missingTitle, noH1, certificateInvalid, sitemapUrlRedirects, orphanPage, missingDescription, multipleH1, thinContent, slowTtfb, oversizedHtml, certificateExpiringSoon, linkedNotInSitemap, titleLengthOutOfRange, externalCanonical, duplicateContent, navOnlyPage, contentRequiresJs. Check id (status4xx, status5xx, brokenInternalLink, redirectChainTooLong, missingTitle, noH1, certificateInvalid, sitemapUrlRedirects, orphanPage, missingDescription, multipleH1, thinContent, slowTtfb, oversizedHtml, certificateExpiringSoon, linkedNotInSitemap, titleLengthOutOfRange, externalCanonical, duplicateContent, navOnlyPage, contentRequiresJs)
status4xx, status5xx, brokenInternalLink, redirectChainTooLong, missingTitle, noH1, certificateInvalid, sitemapUrlRedirects, orphanPage, missingDescription, multipleH1, thinContent, slowTtfb, oversizedHtml, certificateExpiringSoon, linkedNotInSitemap, titleLengthOutOfRange, externalCanonical, duplicateContent, navOnlyPage, contentRequiresJs Page size (default 50, max 200)
1 <= x <= 200Defaults to the latest finished run
Case-insensitive URL substring
200Check severity
error, warning, notice Response
Default Response
Affected URLs per check under the URL search alone, so a filter can show what a pick would leave
Show child attributes
Show child attributes
Pass as cursor to fetch the next page; null on the last page
Affected URLs, errors first, then by check within a tier
Show child attributes
Show child attributes
Run the response was read from
Affected URLs matching the filters