curl --request POST \
--url https://api.adspo.co/v1/boards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "UGC hooks"
}
'import requests
url = "https://api.adspo.co/v1/boards"
payload = { "name": "UGC hooks" }
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: 'UGC hooks'})
};
fetch('https://api.adspo.co/v1/boards', 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://api.adspo.co/v1/boards",
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' => 'UGC hooks'
]),
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://api.adspo.co/v1/boards"
payload := strings.NewReader("{\n \"name\": \"UGC hooks\"\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://api.adspo.co/v1/boards")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"UGC hooks\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.adspo.co/v1/boards")
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\": \"UGC hooks\"\n}"
response = http.request(request)
puts response.read_body{
"board_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"is_public": true,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"already_existed": true
}{
"board_id": "00116792-d6d1-444f-a841-80dd3c105ae7",
"name": "UGC hooks",
"is_public": false,
"workspace_id": null,
"created_at": "2026-11-02T14:05:11Z",
"updated_at": "2026-11-02T14:05:11Z",
"already_existed": false
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Board limit reached: at most 10 new boards per minute."
}{
"error": "<string>"
}Create board
Creates a board in workspace_id, or your default workspace if that’s left out, like creating one in the app. Add creatives to it with Add creative to board.
The board is yours: the key’s owner, or through the MCP, the person who connected it.
If you already have a board with that name in that workspace (ignoring case), that board is returned with already_existed: true instead of making a second one. A new board returns 201 and costs 1 credit; an existing one returns 200 and is free, as are requests that fail. You can create up to 10 boards a minute.
curl --request POST \
--url https://api.adspo.co/v1/boards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "UGC hooks"
}
'import requests
url = "https://api.adspo.co/v1/boards"
payload = { "name": "UGC hooks" }
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: 'UGC hooks'})
};
fetch('https://api.adspo.co/v1/boards', 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://api.adspo.co/v1/boards",
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' => 'UGC hooks'
]),
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://api.adspo.co/v1/boards"
payload := strings.NewReader("{\n \"name\": \"UGC hooks\"\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://api.adspo.co/v1/boards")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"UGC hooks\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.adspo.co/v1/boards")
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\": \"UGC hooks\"\n}"
response = http.request(request)
puts response.read_body{
"board_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"is_public": true,
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"already_existed": true
}{
"board_id": "00116792-d6d1-444f-a841-80dd3c105ae7",
"name": "UGC hooks",
"is_public": false,
"workspace_id": null,
"created_at": "2026-11-02T14:05:11Z",
"updated_at": "2026-11-02T14:05:11Z",
"already_existed": false
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Board limit reached: at most 10 new boards per minute."
}{
"error": "<string>"
}Authorizations
Your Adspo API key.
Body
The board's name. Surrounding spaces are trimmed, and it's cut to 100 characters.
The workspace to create it in (from Get workspaces), or default. Defaults to the default workspace.
Response
You already had a board with that name in that workspace. Nothing changed, and no credit was used.
The workspace the board is in. null for the default workspace.
Whether you already had a board with that name in that workspace, which is returned instead of making a new one.