curl --request GET \
--url https://server.promptwatch.com/api/v2/site-audit/runs/{id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/site-audit/runs/{id}"
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/runs/{id}', 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/runs/{id}",
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/runs/{id}"
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/runs/{id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/site-audit/runs/{id}")
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{
"id": "6ba7b820-9dad-11d1-80b4-00c04fd430c8",
"state": "COMPLETED",
"trigger": "SCHEDULED",
"healthScore": 82,
"urlsTotal": 1200,
"urlsChecked": 1180,
"urlsSkipped": 20,
"urlsUnchecked": 0,
"createdAt": "2026-08-01T09:00:00.000Z",
"startedAt": "2026-08-01T09:00:04.000Z",
"finishedAt": "2026-08-01T09:42:00.000Z",
"error": null,
"issueCounts": {
"status4xx": 12,
"missingDescription": 30
},
"issueDiffs": {
"status4xx": {
"affectedUrls": 12,
"fixedUrls": 4,
"newUrls": 3
}
}
}{
"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."
}{
"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"
}Get a site audit run
One run’s health score, coverage counts, per-check affected URL counts and new/fixed deltas against the previous run.
curl --request GET \
--url https://server.promptwatch.com/api/v2/site-audit/runs/{id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://server.promptwatch.com/api/v2/site-audit/runs/{id}"
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/runs/{id}', 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/runs/{id}",
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/runs/{id}"
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/runs/{id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/site-audit/runs/{id}")
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{
"id": "6ba7b820-9dad-11d1-80b4-00c04fd430c8",
"state": "COMPLETED",
"trigger": "SCHEDULED",
"healthScore": 82,
"urlsTotal": 1200,
"urlsChecked": 1180,
"urlsSkipped": 20,
"urlsUnchecked": 0,
"createdAt": "2026-08-01T09:00:00.000Z",
"startedAt": "2026-08-01T09:00:04.000Z",
"finishedAt": "2026-08-01T09:42:00.000Z",
"error": null,
"issueCounts": {
"status4xx": 12,
"missingDescription": 30
},
"issueDiffs": {
"status4xx": {
"affectedUrls": 12,
"fixedUrls": 4,
"newUrls": 3
}
}
}{
"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."
}{
"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.
Path Parameters
Audit run ID
Response
Default Response
Audit run identifier
Run state; PARTIAL means the plan's URL ceiling capped coverage
PENDING, RUNNING, FINALIZING, COMPLETED, FAILED, PARTIAL What opened the run
SCHEDULED, MANUAL Health score 0-100; null until the run finalizes
URLs selected for the run
URLs the sweep returned a result for
URLs left out of the run by the plan ceiling
URLs selected but never answered before the run closed
Timestamp (ISO 8601)
Failure reason when the run state is FAILED
Affected URL count per check, keyed by check id (status4xx, status5xx, brokenInternalLink, redirectChainTooLong, missingTitle, noH1, certificateInvalid, sitemapUrlRedirects, orphanPage, missingDescription, multipleH1, thinContent, slowTtfb, oversizedHtml, certificateExpiringSoon, linkedNotInSitemap, titleLengthOutOfRange, externalCanonical, duplicateContent, navOnlyPage, contentRequiresJs). Checks that never fired are omitted.
Show child attributes
Show child attributes
New/fixed deltas against the previous completed run, keyed by check id
Show child attributes
Show child attributes
When the first check was dispatched
When the run finalized