curl --request PATCH \
--url https://app.surfacd.com/api/v1/projects/{project} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"default_country_code": "<string>",
"prompt_limit": 500,
"services": [
"<string>"
]
}
'import requests
url = "https://app.surfacd.com/api/v1/projects/{project}"
payload = {
"name": "<string>",
"default_country_code": "<string>",
"prompt_limit": 500,
"services": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
default_country_code: '<string>',
prompt_limit: 500,
services: ['<string>']
})
};
fetch('https://app.surfacd.com/api/v1/projects/{project}', 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://app.surfacd.com/api/v1/projects/{project}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'default_country_code' => '<string>',
'prompt_limit' => 500,
'services' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.surfacd.com/api/v1/projects/{project}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://app.surfacd.com/api/v1/projects/{project}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.surfacd.com/api/v1/projects/{project}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"check_frequency": "manual",
"project_type": "standard",
"pitch_ends_at": "2023-11-07T05:31:56Z",
"prompt_limit": 123,
"archived_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"default_country": {
"code": "<string>",
"name": "<string>"
},
"primary_brand": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"domain": "<string>",
"type": 0,
"brand_aliases": [
"<string>"
]
},
"services": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"display_name": "<string>",
"provider": "<string>"
}
],
"share": {
"enabled": true,
"share_url": "<string>",
"password_protected": true
}
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}Update Project
Partially updates a project. Only the fields present in the request body are changed. Services are matched by UUID or provider slug; supplying services replaces the monitored set. Changing the monitored services on a scheduled project triggers a new data collection run (which consumes credits). To update the primary brand, include primary_brand.name.
curl --request PATCH \
--url https://app.surfacd.com/api/v1/projects/{project} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"default_country_code": "<string>",
"prompt_limit": 500,
"services": [
"<string>"
]
}
'import requests
url = "https://app.surfacd.com/api/v1/projects/{project}"
payload = {
"name": "<string>",
"default_country_code": "<string>",
"prompt_limit": 500,
"services": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
default_country_code: '<string>',
prompt_limit: 500,
services: ['<string>']
})
};
fetch('https://app.surfacd.com/api/v1/projects/{project}', 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://app.surfacd.com/api/v1/projects/{project}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'default_country_code' => '<string>',
'prompt_limit' => 500,
'services' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.surfacd.com/api/v1/projects/{project}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://app.surfacd.com/api/v1/projects/{project}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.surfacd.com/api/v1/projects/{project}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"prompt_limit\": 500,\n \"services\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"check_frequency": "manual",
"project_type": "standard",
"pitch_ends_at": "2023-11-07T05:31:56Z",
"prompt_limit": 123,
"archived_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"default_country": {
"code": "<string>",
"name": "<string>"
},
"primary_brand": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"domain": "<string>",
"type": 0,
"brand_aliases": [
"<string>"
]
},
"services": [
{
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"display_name": "<string>",
"provider": "<string>"
}
],
"share": {
"enabled": true,
"share_url": "<string>",
"password_protected": true
}
}{
"message": "<string>"
}{
"message": "<string>",
"errors": {}
}Authorizations
Team API key created in Team Settings. Use it with URLs for the same team.
Path Parameters
Project UUID.
Body
Partial update. Only the fields present are applied.
255manual, monthly, weekly, daily ISO 3166-1 alpha-2 code of an active country.
1 <= x <= 1000Replaces the monitored services. Each entry may be either a service UUID or provider slug such as chatgpt or perplexity.
1Primary brand changes. name is required whenever primary_brand is supplied; domain and aliases are optional.
Show child attributes
Show child attributes
Response
The updated project.
manual, monthly, weekly, daily Project type. pitch projects run a fixed 7-day collection window and do not consume credits.
standard, pitch End of the 7-day pitch collection window. Only set for pitch projects once their first collection run starts; always null for standard projects. Read-only.
Resolved prompt limit. Falls back to the team default when not explicitly set on the project.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Active services (AI platforms) enabled for this project.
Show child attributes
Show child attributes
Show child attributes
Show child attributes