curl --request POST \
--url https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_keys": [
"<string>"
],
"no_destination": true,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remove_destination_keys": [
"<string>"
],
"workspace": "<string>"
}
'import requests
url = "https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations"
payload = {
"destination_keys": ["<string>"],
"no_destination": True,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remove_destination_keys": ["<string>"],
"workspace": "<string>"
}
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({
destination_keys: ['<string>'],
no_destination: true,
video_unit_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
remove_destination_keys: ['<string>'],
workspace: '<string>'
})
};
fetch('https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations', 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.goosybear.ai/api/v1/tools/video_unit.set_destinations",
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([
'destination_keys' => [
'<string>'
],
'no_destination' => true,
'video_unit_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'remove_destination_keys' => [
'<string>'
],
'workspace' => '<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.goosybear.ai/api/v1/tools/video_unit.set_destinations"
payload := strings.NewReader("{\n \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\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.goosybear.ai/api/v1/tools/video_unit.set_destinations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations")
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 \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destination_keys": [
"<string>"
],
"no_destination": true,
"workspace": "<string>",
"working_in": {
"label": "<string>",
"note": "<string>",
"workspace": "<string>",
"source": "call-override"
}
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}Call video_unit.set_destinations
Record where a video unit will ship — ‘ship this to YouTube and TikTok’, ‘also put it on Instagram’, ‘take TikTok off this one’, ‘this one isn’t going anywhere’. Name only the destinations the operator asked about: destination_keys adds them, remove_destination_keys takes them off, and every destination already chosen stays; no_destination is the explicit ‘no destination’ finish and clears them all. Do this BEFORE copy.draft, which refuses while no destinations are chosen. The result lists the destinations that were ACCEPTED; if one you asked for is missing, say so rather than claiming it was set. Not for writing the copy for those destinations — that is copy.draft. If they mean the video they are looking at and name no id, CALL IT WITH NO video_unit_id: it resolves the video whose page the question was asked on, and refuses plainly when there is none. Never ask which video, and never say a video is out of reach, before trying that.
Every result names the workspace it ran in. Say which workspace the answer is about. When the account has more than one workspace and none is selected, this tool refuses with workspace_ambiguous and lists the choices — offer them, never pick one.
curl --request POST \
--url https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_keys": [
"<string>"
],
"no_destination": true,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remove_destination_keys": [
"<string>"
],
"workspace": "<string>"
}
'import requests
url = "https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations"
payload = {
"destination_keys": ["<string>"],
"no_destination": True,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remove_destination_keys": ["<string>"],
"workspace": "<string>"
}
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({
destination_keys: ['<string>'],
no_destination: true,
video_unit_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
remove_destination_keys: ['<string>'],
workspace: '<string>'
})
};
fetch('https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations', 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.goosybear.ai/api/v1/tools/video_unit.set_destinations",
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([
'destination_keys' => [
'<string>'
],
'no_destination' => true,
'video_unit_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'remove_destination_keys' => [
'<string>'
],
'workspace' => '<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.goosybear.ai/api/v1/tools/video_unit.set_destinations"
payload := strings.NewReader("{\n \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\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.goosybear.ai/api/v1/tools/video_unit.set_destinations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.goosybear.ai/api/v1/tools/video_unit.set_destinations")
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 \"destination_keys\": [\n \"<string>\"\n ],\n \"no_destination\": true,\n \"video_unit_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"remove_destination_keys\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"video_unit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"destination_keys": [
"<string>"
],
"no_destination": true,
"workspace": "<string>",
"working_in": {
"label": "<string>",
"note": "<string>",
"workspace": "<string>",
"source": "call-override"
}
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}{
"ok": false,
"code": "<string>",
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"retry_after_seconds": 123
},
"retry_after_seconds": 123
}Authorizations
An API key minted at Settings › API & MCP. Send it as Authorization: Bearer <key>. A key carries its holder's own permissions, resolved on every call — revoking a membership closes the key's reach immediately. Keep it in an environment variable (GOOSY_API_KEY), never in a committed file.
Headers
Body
The video unit, as a UUID. Take it from the conversation's context — never invent one. OMIT it when the person is looking at the video and means that one: the tool resolves the unit whose page the question was asked on, and refuses plainly when there is none. Never ask which video before trying that.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$Response
The call was admitted and dispatched. ok says whether the tool succeeded — a refusal the tool itself produced is still a 200, exactly as it is a successful JSON-RPC result over MCP.
- Option 1
- Option 2
The tool ran and answered.