curl --request POST \
--url https://app.surfacd.com/api/v1/teams/{teamUuid}/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"default_country_code": "<string>",
"services": [
"<string>"
],
"primary_brand": {
"name": "<string>",
"domain": "<string>",
"aliases": [
"<string>"
]
},
"prompt_limit": 500
}
'import requests
url = "https://app.surfacd.com/api/v1/teams/{teamUuid}/projects"
payload = {
"name": "<string>",
"default_country_code": "<string>",
"services": ["<string>"],
"primary_brand": {
"name": "<string>",
"domain": "<string>",
"aliases": ["<string>"]
},
"prompt_limit": 500
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
default_country_code: '<string>',
services: ['<string>'],
primary_brand: {name: '<string>', domain: '<string>', aliases: ['<string>']},
prompt_limit: 500
})
};
fetch('https://app.surfacd.com/api/v1/teams/{teamUuid}/projects', 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/teams/{teamUuid}/projects",
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>',
'default_country_code' => '<string>',
'services' => [
'<string>'
],
'primary_brand' => [
'name' => '<string>',
'domain' => '<string>',
'aliases' => [
'<string>'
]
],
'prompt_limit' => 500
]),
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/teams/{teamUuid}/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.surfacd.com/api/v1/teams/{teamUuid}/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.surfacd.com/api/v1/teams/{teamUuid}/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\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>",
"errors": {}
}Create Project (team-scoped)
Team-scoped variant of the projects endpoint; identical contract with the team resolved from the path instead of the token’s default team.
curl --request POST \
--url https://app.surfacd.com/api/v1/teams/{teamUuid}/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"default_country_code": "<string>",
"services": [
"<string>"
],
"primary_brand": {
"name": "<string>",
"domain": "<string>",
"aliases": [
"<string>"
]
},
"prompt_limit": 500
}
'import requests
url = "https://app.surfacd.com/api/v1/teams/{teamUuid}/projects"
payload = {
"name": "<string>",
"default_country_code": "<string>",
"services": ["<string>"],
"primary_brand": {
"name": "<string>",
"domain": "<string>",
"aliases": ["<string>"]
},
"prompt_limit": 500
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
default_country_code: '<string>',
services: ['<string>'],
primary_brand: {name: '<string>', domain: '<string>', aliases: ['<string>']},
prompt_limit: 500
})
};
fetch('https://app.surfacd.com/api/v1/teams/{teamUuid}/projects', 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/teams/{teamUuid}/projects",
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>',
'default_country_code' => '<string>',
'services' => [
'<string>'
],
'primary_brand' => [
'name' => '<string>',
'domain' => '<string>',
'aliases' => [
'<string>'
]
],
'prompt_limit' => 500
]),
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/teams/{teamUuid}/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.surfacd.com/api/v1/teams/{teamUuid}/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.surfacd.com/api/v1/teams/{teamUuid}/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"default_country_code\": \"<string>\",\n \"services\": [\n \"<string>\"\n ],\n \"primary_brand\": {\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"aliases\": [\n \"<string>\"\n ]\n },\n \"prompt_limit\": 500\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>",
"errors": {}
}Authorizations
Team API key created in Team Settings. Use it with URLs for the same team.
Path Parameters
UUID of the team.
Body
255manual, monthly, weekly, daily ISO 3166-1 alpha-2 code of an active country.
Active services (AI platforms) to monitor. Each entry may be either a service UUID or provider slug such as chatgpt or perplexity. Discover both values with GET /api/v1/platforms.
1Show child attributes
Show child attributes
Optional per-project prompt limit. Falls back to the team default when omitted.
1 <= x <= 1000Response
The created 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