curl --request POST \
--url https://server.promptwatch.com/api/v2/projects/setup \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"website": "<string>",
"countryCode": "<string>",
"languageCode": "<string>",
"monitors": [
{
"prompts": 25,
"name": "<string>",
"models": [
"<string>"
]
}
]
}
'import requests
url = "https://server.promptwatch.com/api/v2/projects/setup"
payload = {
"name": "<string>",
"website": "<string>",
"countryCode": "<string>",
"languageCode": "<string>",
"monitors": [
{
"prompts": 25,
"name": "<string>",
"models": ["<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>',
website: '<string>',
countryCode: '<string>',
languageCode: '<string>',
monitors: [{prompts: 25, name: '<string>', models: ['<string>']}]
})
};
fetch('https://server.promptwatch.com/api/v2/projects/setup', 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/projects/setup",
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>',
'website' => '<string>',
'countryCode' => '<string>',
'languageCode' => '<string>',
'monitors' => [
[
'prompts' => 25,
'name' => '<string>',
'models' => [
'<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/projects/setup"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\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/projects/setup")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/projects/setup")
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 \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b81a-9dad-11d1-80b4-00c04fd430c8",
"name": "Acme",
"slug": "acme",
"website": "https://acme.com",
"createdAt": "2026-09-16T09:12:00.000Z",
"monitors": [
{
"id": "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0",
"name": "Acme Monitor",
"type": null,
"models": [
"gpt-search",
"sonar-pro",
"google-ai-overview"
],
"promptCount": 10
}
]
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Payment Required",
"message": "Cannot create prompt. Your organization has 50 of 50 active prompts. Please upgrade your plan to continue.",
"current": 50,
"limit": 50,
"available": 0
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}Set Up Project
Create a project, enrich it from its website, and create up to 3 monitors with generated prompts (50 total) in one synchronous call. This can take 1-2 minutes. Requires an organization-level API key; X-Project-Id is not required.
curl --request POST \
--url https://server.promptwatch.com/api/v2/projects/setup \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"website": "<string>",
"countryCode": "<string>",
"languageCode": "<string>",
"monitors": [
{
"prompts": 25,
"name": "<string>",
"models": [
"<string>"
]
}
]
}
'import requests
url = "https://server.promptwatch.com/api/v2/projects/setup"
payload = {
"name": "<string>",
"website": "<string>",
"countryCode": "<string>",
"languageCode": "<string>",
"monitors": [
{
"prompts": 25,
"name": "<string>",
"models": ["<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>',
website: '<string>',
countryCode: '<string>',
languageCode: '<string>',
monitors: [{prompts: 25, name: '<string>', models: ['<string>']}]
})
};
fetch('https://server.promptwatch.com/api/v2/projects/setup', 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/projects/setup",
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>',
'website' => '<string>',
'countryCode' => '<string>',
'languageCode' => '<string>',
'monitors' => [
[
'prompts' => 25,
'name' => '<string>',
'models' => [
'<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/projects/setup"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\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/projects/setup")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.promptwatch.com/api/v2/projects/setup")
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 \"website\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"languageCode\": \"<string>\",\n \"monitors\": [\n {\n \"prompts\": 25,\n \"name\": \"<string>\",\n \"models\": [\n \"<string>\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "6ba7b81a-9dad-11d1-80b4-00c04fd430c8",
"name": "Acme",
"slug": "acme",
"website": "https://acme.com",
"createdAt": "2026-09-16T09:12:00.000Z",
"monitors": [
{
"id": "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0",
"name": "Acme Monitor",
"type": null,
"models": [
"gpt-search",
"sonar-pro",
"google-ai-overview"
],
"promptCount": 10
}
]
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}{
"error": "Unauthorized",
"message": "Missing or invalid X-API-Key header."
}{
"error": "Payment Required",
"message": "Cannot create prompt. Your organization has 50 of 50 active prompts. Please upgrade your plan to continue.",
"current": 50,
"limit": 50,
"available": 0
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}{
"code": "PROJECT_NOT_FOUND",
"message": "Project not found"
}Authorizations
API key for authentication. Get yours from the Promptwatch dashboard under Settings > API Keys.
Body
Project name
1Project website URL
Country code (e.g., US)
Language code (e.g., en)
Optional monitors to create (max 3, 50 prompts total). Omit for one monitor with 10 mixed prompts.
1 - 3 elementsShow child attributes
Show child attributes
Response
Default Response
Project unique identifier
Project name
Project URL slug
Creation timestamp
Monitors created during setup
Show child attributes
Show child attributes
Project website URL
Present when the project exists but monitors and prompts were not created