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,
"issueTotals": {
"error": 12,
"warning": 30,
"notice": 4
},
"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
}
},
"issues": [
{
"issue": "status4xx",
"label": "Page returns a 4xx error",
"severity": "error",
"affectedUrls": 12,
"fixedUrls": 4,
"newUrls": 3
}
],
"performance": {
"bytesAvg": 84000,
"downloadAvgMs": 210,
"ttfbAvgMs": 180,
"ttfbP75Ms": 320,
"ttfbP95Ms": 900
},
"recheckPending": 0
}{
"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"
}{
"code": "SITE_AUDIT_RUN_NOT_FOUND",
"message": "Site audit run not found"
}Get a site audit run
One run’s health score, coverage, per-check issue summaries with new/fixed deltas, and response-time averages.
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,
"issueTotals": {
"error": 12,
"warning": 30,
"notice": 4
},
"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
}
},
"issues": [
{
"issue": "status4xx",
"label": "Page returns a 4xx error",
"severity": "error",
"affectedUrls": 12,
"fixedUrls": 4,
"newUrls": 3
}
],
"performance": {
"bytesAvg": 84000,
"downloadAvgMs": 210,
"ttfbAvgMs": 180,
"ttfbP75Ms": 320,
"ttfbP95Ms": 900
},
"recheckPending": 0
}{
"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"
}{
"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
Affected URLs summed per severity. A URL in two checks counts twice.
Show child attributes
Show child attributes
{ "error": 12, "warning": 30, "notice": 4 }
Timestamp (ISO 8601)
Whether page-level results such as failing URLs can still be read; only the latest two finished runs keep them
Failure reason when the run state is FAILED
Affected URL count per check. Checks that never fired are omitted.
Show child attributes
Show child attributes
New/fixed deltas against the previous finished run, keyed by check id
Show child attributes
Show child attributes
Checks that fired, errors first
Show child attributes
Show child attributes
Response-time and size averages over fetched URLs; null when the run checked nothing
Show child attributes
Show child attributes
{
"bytesAvg": 84000,
"downloadAvgMs": 210,
"ttfbAvgMs": 180,
"ttfbP75Ms": 320,
"ttfbP95Ms": 900
}
Pages a re-check is still waiting on
When the first check was dispatched
When the run finalized