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>",
"isPitchProject": true,
"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>",
"isPitchProject": True,
"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>',
isPitchProject: true,
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>',
'isPitchProject' => true,
'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 \"isPitchProject\": true,\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 \"isPitchProject\": true,\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 \"isPitchProject\": true,\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",
"isPitchProject": false,
"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. Set isPitchProject to create a pitch project against maxPitchProjects instead of maxProjects.
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>",
"isPitchProject": true,
"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>",
"isPitchProject": True,
"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>',
isPitchProject: true,
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>',
'isPitchProject' => true,
'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 \"isPitchProject\": true,\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 \"isPitchProject\": true,\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 \"isPitchProject\": true,\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",
"isPitchProject": false,
"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)
Set true to create a pitch project, which counts against maxPitchProjects instead of maxProjects. Omit or false for a normal project. Organization API keys are gated by pitch quota.
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
Whether this is a pitch project. Pitch projects count against maxPitchProjects instead of maxProjects.
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