Create Persona
curl --request POST \
--url https://server.promptwatch.com/api/v2/personas \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>",
"ageRange": "<string>",
"educationLevel": "<string>",
"stackablePrompt": "<string>"
}
'import requests
url = "https://server.promptwatch.com/api/v2/personas"
payload = {
"name": "<string>",
"description": "<string>",
"ageRange": "<string>",
"educationLevel": "<string>",
"stackablePrompt": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
ageRange: '<string>',
educationLevel: '<string>',
stackablePrompt: '<string>'
})
};
fetch('https://server.promptwatch.com/api/v2/personas', 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/personas",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'ageRange' => '<string>',
'educationLevel' => '<string>',
'stackablePrompt' => '<string>'
]),
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/personas"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://server.promptwatch.com/api/v2/personas")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/personas")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b822-9dad-11d1-80b4-00c04fd430c8",
"name": "Alex — procurement lead",
"description": "Evaluates vendors for mid-market SaaS; cares about ROI and implementation time.",
"ageRange": "35-44",
"educationLevel": "College degree",
"stackablePrompt": "Mid-market procurement lead who compares vendors on implementation time, total cost, and whether the team can run it without a dedicated admin.",
"createdAt": "2026-02-10T12:00:00.000Z",
"updatedAt": "2026-03-20T08:30:00.000Z"
}{
"code": "PERSONA_NOT_FOUND",
"message": "Persona not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "PERSONA_NOT_FOUND",
"message": "Persona not found"
}Personas
Create Persona
Create a new persona for the project
POST
/
personas
Create Persona
curl --request POST \
--url https://server.promptwatch.com/api/v2/personas \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>",
"ageRange": "<string>",
"educationLevel": "<string>",
"stackablePrompt": "<string>"
}
'import requests
url = "https://server.promptwatch.com/api/v2/personas"
payload = {
"name": "<string>",
"description": "<string>",
"ageRange": "<string>",
"educationLevel": "<string>",
"stackablePrompt": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
ageRange: '<string>',
educationLevel: '<string>',
stackablePrompt: '<string>'
})
};
fetch('https://server.promptwatch.com/api/v2/personas', 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/personas",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'ageRange' => '<string>',
'educationLevel' => '<string>',
'stackablePrompt' => '<string>'
]),
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/personas"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://server.promptwatch.com/api/v2/personas")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/personas")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"ageRange\": \"<string>\",\n \"educationLevel\": \"<string>\",\n \"stackablePrompt\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b822-9dad-11d1-80b4-00c04fd430c8",
"name": "Alex — procurement lead",
"description": "Evaluates vendors for mid-market SaaS; cares about ROI and implementation time.",
"ageRange": "35-44",
"educationLevel": "College degree",
"stackablePrompt": "Mid-market procurement lead who compares vendors on implementation time, total cost, and whether the team can run it without a dedicated admin.",
"createdAt": "2026-02-10T12:00:00.000Z",
"updatedAt": "2026-03-20T08:30:00.000Z"
}{
"code": "PERSONA_NOT_FOUND",
"message": "Persona not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"code": "PERSONA_NOT_FOUND",
"message": "Persona not found"
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Body
application/json
Persona name
Minimum string length:
1Persona description
Minimum string length:
1Target age range
Education level
Persona prompt used for tracked prompts when persona stacking is enabled. Minimum 30 characters.
Minimum string length:
30Response
Default Response
Persona unique identifier
Persona name
Persona description
Persona prompt used for tracked prompts when persona stacking is enabled.
Creation timestamp
Last update timestamp
Target age range
Education level