curl --request POST \
--url https://api.adspo.co/v1/boards/{board_id}/creatives \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef"
}
'import requests
url = "https://api.adspo.co/v1/boards/{board_id}/creatives"
payload = { "creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef" }
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({creative_id: 'f930d886d0fb9e86b9dd6c1200dab7ef'})
};
fetch('https://api.adspo.co/v1/boards/{board_id}/creatives', 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/{board_id}/creatives",
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([
'creative_id' => 'f930d886d0fb9e86b9dd6c1200dab7ef'
]),
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/{board_id}/creatives"
payload := strings.NewReader("{\n \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\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/{board_id}/creatives")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.adspo.co/v1/boards/{board_id}/creatives")
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 \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\n}"
response = http.request(request)
puts response.read_body{
"creative_id": "<string>",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"board_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"saved_at": "2023-11-07T05:31:56Z",
"already_saved": true,
"already_on_board": true
}{
"creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef",
"workspace_id": null,
"board_id": "00116792-d6d1-444f-a841-80dd3c105ae7",
"saved_at": "2026-11-02T14:05:11Z",
"already_saved": false,
"already_on_board": false
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Save limit reached: at most 30 saves per minute."
}{
"error": "<string>"
}Add creative to board
Puts a creative on one of your boards, like saving it to a board in the app. If you haven’t saved the creative yet, it’s saved too, into the board’s workspace.
The save is yours: the key’s owner, or through the MCP, the person who connected it.
Adding a creative returns 201 and costs 1 credit. Adding one that’s already on the board changes nothing, returns 200 with already_on_board: true, and is free, as are requests that fail. It counts towards the save limit of 30 a minute per person.
curl --request POST \
--url https://api.adspo.co/v1/boards/{board_id}/creatives \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef"
}
'import requests
url = "https://api.adspo.co/v1/boards/{board_id}/creatives"
payload = { "creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef" }
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({creative_id: 'f930d886d0fb9e86b9dd6c1200dab7ef'})
};
fetch('https://api.adspo.co/v1/boards/{board_id}/creatives', 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/{board_id}/creatives",
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([
'creative_id' => 'f930d886d0fb9e86b9dd6c1200dab7ef'
]),
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/{board_id}/creatives"
payload := strings.NewReader("{\n \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\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/{board_id}/creatives")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.adspo.co/v1/boards/{board_id}/creatives")
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 \"creative_id\": \"f930d886d0fb9e86b9dd6c1200dab7ef\"\n}"
response = http.request(request)
puts response.read_body{
"creative_id": "<string>",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"board_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"saved_at": "2023-11-07T05:31:56Z",
"already_saved": true,
"already_on_board": true
}{
"creative_id": "f930d886d0fb9e86b9dd6c1200dab7ef",
"workspace_id": null,
"board_id": "00116792-d6d1-444f-a841-80dd3c105ae7",
"saved_at": "2026-11-02T14:05:11Z",
"already_saved": false,
"already_on_board": false
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Save limit reached: at most 30 saves per minute."
}{
"error": "<string>"
}Authorizations
Your Adspo API key.
Path Parameters
The board's ID, from Get user boards.
Body
The creative to add.
Response
Already on the board. Nothing changed, and no credit was used.
The workspace it's saved in. null for the default workspace.
The board it was added to. null for a save without a board.
When it was saved. For something already saved, when that was.
Whether it was already saved in that workspace.
Whether it was already on the board. Only present when adding to a board.