curl --request PUT \
--url https://server.promptwatch.com/api/v2/monitors/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>",
"models": [
"<string>"
],
"active": true,
"languageCode": "<string>",
"countryCode": "<string>",
"stateCode": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0,
"locationName": "<string>",
"personaId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaStackingEnabled": true
}
'import requests
url = "https://server.promptwatch.com/api/v2/monitors/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"models": ["<string>"],
"active": True,
"languageCode": "<string>",
"countryCode": "<string>",
"stateCode": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0,
"locationName": "<string>",
"personaId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaStackingEnabled": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
models: ['<string>'],
active: true,
languageCode: '<string>',
countryCode: '<string>',
stateCode: '<string>',
cityCode: '<string>',
latitude: 0,
longitude: 0,
locationName: '<string>',
personaId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
personaStackingEnabled: true
})
};
fetch('https://server.promptwatch.com/api/v2/monitors/{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/monitors/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'models' => [
'<string>'
],
'active' => true,
'languageCode' => '<string>',
'countryCode' => '<string>',
'stateCode' => '<string>',
'cityCode' => '<string>',
'latitude' => 0,
'longitude' => 0,
'locationName' => '<string>',
'personaId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'personaStackingEnabled' => 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/monitors/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}")
req, _ := http.NewRequest("PUT", 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.put("https://server.promptwatch.com/api/v2/monitors/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/monitors/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b818-9dad-11d1-80b4-00c04fd430c8",
"name": "North America — core keywords",
"description": "Illustrative monitor for API docs only.",
"active": true,
"models": [
"openai/gpt-4.1",
"anthropic/claude-sonnet-4-20250514"
],
"languageCode": "en-US",
"countryCode": "US",
"latitude": null,
"longitude": null,
"locationAccuracy": null,
"locationName": null,
"promptFrequency": null,
"promptCount": 48,
"responseCount": 620,
"responseCountInRange": 92,
"averageVisibility": 54.25,
"personaName": "Marketing manager",
"personaDescription": null,
"personaAgeRange": null,
"personaEducationLevel": null,
"createdAt": "2026-01-12T10:00:00.000Z",
"updatedAt": "2026-03-30T09:30:00.000Z"
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}Update Monitor
Update an existing monitor. Language and location are fixed after creation. Repeating the stored value is accepted; a different value is rejected.
curl --request PUT \
--url https://server.promptwatch.com/api/v2/monitors/{id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>",
"models": [
"<string>"
],
"active": true,
"languageCode": "<string>",
"countryCode": "<string>",
"stateCode": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0,
"locationName": "<string>",
"personaId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaStackingEnabled": true
}
'import requests
url = "https://server.promptwatch.com/api/v2/monitors/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"models": ["<string>"],
"active": True,
"languageCode": "<string>",
"countryCode": "<string>",
"stateCode": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0,
"locationName": "<string>",
"personaId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaStackingEnabled": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
models: ['<string>'],
active: true,
languageCode: '<string>',
countryCode: '<string>',
stateCode: '<string>',
cityCode: '<string>',
latitude: 0,
longitude: 0,
locationName: '<string>',
personaId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
personaStackingEnabled: true
})
};
fetch('https://server.promptwatch.com/api/v2/monitors/{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/monitors/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'models' => [
'<string>'
],
'active' => true,
'languageCode' => '<string>',
'countryCode' => '<string>',
'stateCode' => '<string>',
'cityCode' => '<string>',
'latitude' => 0,
'longitude' => 0,
'locationName' => '<string>',
'personaId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'personaStackingEnabled' => 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/monitors/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}")
req, _ := http.NewRequest("PUT", 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.put("https://server.promptwatch.com/api/v2/monitors/{id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/monitors/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"models\": [\n \"<string>\"\n ],\n \"active\": true,\n \"languageCode\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"stateCode\": \"<string>\",\n \"cityCode\": \"<string>\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"locationName\": \"<string>\",\n \"personaId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaStackingEnabled\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b818-9dad-11d1-80b4-00c04fd430c8",
"name": "North America — core keywords",
"description": "Illustrative monitor for API docs only.",
"active": true,
"models": [
"openai/gpt-4.1",
"anthropic/claude-sonnet-4-20250514"
],
"languageCode": "en-US",
"countryCode": "US",
"latitude": null,
"longitude": null,
"locationAccuracy": null,
"locationName": null,
"promptFrequency": null,
"promptCount": 48,
"responseCount": 620,
"responseCountInRange": 92,
"averageVisibility": 54.25,
"personaName": "Marketing manager",
"personaDescription": null,
"personaAgeRange": null,
"personaEducationLevel": null,
"createdAt": "2026-01-12T10:00:00.000Z",
"updatedAt": "2026-03-30T09:30:00.000Z"
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}{
"code": "MONITOR_NOT_FOUND",
"message": "Monitor not found"
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Path Parameters
Monitor ID
Body
Monitor name
1Monitor description
List of LLM models to monitor
1Whether the monitor is active
Language code. Fixed after creation. A different value is rejected.
Country code. Fixed after creation. A different value is rejected.
State code. Fixed after creation. A different value is rejected.
City code. Fixed after creation. A different value is rejected.
Latitude of the pinned point. Fixed after creation. A different value is rejected.
-90 <= x <= 90Longitude of the pinned point. Fixed after creation. A different value is rejected.
-180 <= x <= 180Accuracy radius of the pinned point in meters. Fixed after creation. A different value is rejected.
20, 50, 100, 500, 1000, 5000, null Name of the pinned point. Fixed after creation. A different value is rejected.
120Persona ID
Inject the persona's stackable prompt around each tracked prompt at run time
Monitor-level tracking frequency. EVERY_12_HOURS, EVERY_6_HOURS and HOURLY require the Hourly Tracking feature (Business and Agency Scale, or enabled per organization); DAILY requires either Hourly Tracking or Custom Prompt Frequency; EVERY_OTHER_DAY, WEEKLY and MONTHLY require the Custom Prompt Frequency feature. Null clears it so the monitor inherits the organization's default frequency.
DAILY, EVERY_OTHER_DAY, WEEKLY, MONTHLY, EVERY_12_HOURS, EVERY_6_HOURS, HOURLY, null Response
Default Response
Monitor unique identifier
Monitor name
Whether the monitor is active
List of LLM models being monitored
Language code for the monitor
Country code for the monitor
Latitude of the monitor's pinned point. Null when no point is pinned.
Longitude of the monitor's pinned point. Null when no point is pinned.
Accuracy radius of the pinned point in meters. Null when no point is pinned.
Name of the pinned point. Null when none was given.
Number of prompts in this monitor
Total number of responses across all prompts
Average visibility score for the monitor within the selected date range
Monitor creation timestamp
Monitor last update timestamp
Monitor description
Monitor-level tracking frequency. EVERY_12_HOURS, EVERY_6_HOURS and HOURLY run several times a day on fixed UTC hours. Null inherits the organization's default frequency.
DAILY, EVERY_OTHER_DAY, WEEKLY, MONTHLY, EVERY_12_HOURS, EVERY_6_HOURS, HOURLY Number of responses created within the selected date range
Persona name used for the monitor
Persona description
Persona age range
Persona education level