curl --request PATCH \
--url https://api.meetingkit.com/api/v1/brand_kits/{id} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bot": {
"tile": {
"type": "color",
"color": {
"background_color": "#101828"
}
}
},
"email": {
"branded": {
"cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
}
}
}
}
'import requests
url = "https://api.meetingkit.com/api/v1/brand_kits/{id}"
payload = {
"bot": { "tile": {
"type": "color",
"color": { "background_color": "#101828" }
} },
"email": { "branded": { "cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
} } }
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bot: {tile: {type: 'color', color: {background_color: '#101828'}}},
email: {
branded: {
cta: {
type: 'link',
link: {label: 'Open in Acme', url: 'https://acme.com/m/{{meeting_id}}'}
}
}
}
})
};
fetch('https://api.meetingkit.com/api/v1/brand_kits/{id}', 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.meetingkit.com/api/v1/brand_kits/{id}",
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([
'bot' => [
'tile' => [
'type' => 'color',
'color' => [
'background_color' => '#101828'
]
]
],
'email' => [
'branded' => [
'cta' => [
'type' => 'link',
'link' => [
'label' => 'Open in Acme',
'url' => 'https://acme.com/m/{{meeting_id}}'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.meetingkit.com/api/v1/brand_kits/{id}"
payload := strings.NewReader("{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<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.patch("https://api.meetingkit.com/api/v1/brand_kits/{id}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/brand_kits/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "brk_01k6c3v7w2q9d8m4n5p6r7s8tx",
"object": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"workspace_ids": [
"wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"wks_01k6a3t4v5w6x7y8z9a0b1c2de"
],
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": {
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"url": "https://assets.meetingkit.com/logos/acme.png?Expires=1822298280&Signature=…"
},
"background_color": "#0B1F3A",
"scale": 70
}
},
"chat": {
"enabled": true,
"recording_message": "Hi, I'm Acme Assistant, taking notes for {{user}}.",
"paused_message": "Recording is paused."
}
},
"email": {
"type": "branded",
"branded": {
"logo": {
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"url": "https://assets.meetingkit.com/logos/acme.png?Expires=1822298280&Signature=…"
},
"color": "#0052FF",
"website": "https://acme.com",
"description": "Acme AI Meeting Companion",
"cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
}
}
},
"preview_url": "https://api.meetingkit.com/app/shared/brand-kits/brk_01k6c3v7w2q9d8m4n5p6r7s8tx/preview?token=WyJicmtfMDFrNmMzdjd3MnE5ZDhtNG41cDZyN3M4dHgiLDE3OTA0MTM4MDBd--50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c",
"preview_expires_at": "2026-09-26T09:10:00Z",
"metadata": {},
"created_at": "2026-09-30T10:00:00Z"
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Update a brand kit
Changes apply to every workspace that uses the kit, and their scheduled bots pick them
up. Only what you send changes: a group, an object or a field left out keeps its value,
and null resets a text to its default. Choosing another type keeps the options of the
one it replaces, so switching back restores them. The bot and email of a read can be
sent back as they are.
workspace_ids replaces the whole set of workspaces the key belongs to that use the
kit: added workspaces switch to it, removed ones go back to MeetingKit’s default
branding, and workspaces the key does not belong to are left alone. Adding a workspace
needs the same rights as creating a kit; removing one needs an owner or admin. A kit no
workspace uses any more stays until it is deleted.
curl --request PATCH \
--url https://api.meetingkit.com/api/v1/brand_kits/{id} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bot": {
"tile": {
"type": "color",
"color": {
"background_color": "#101828"
}
}
},
"email": {
"branded": {
"cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
}
}
}
}
'import requests
url = "https://api.meetingkit.com/api/v1/brand_kits/{id}"
payload = {
"bot": { "tile": {
"type": "color",
"color": { "background_color": "#101828" }
} },
"email": { "branded": { "cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
} } }
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bot: {tile: {type: 'color', color: {background_color: '#101828'}}},
email: {
branded: {
cta: {
type: 'link',
link: {label: 'Open in Acme', url: 'https://acme.com/m/{{meeting_id}}'}
}
}
}
})
};
fetch('https://api.meetingkit.com/api/v1/brand_kits/{id}', 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.meetingkit.com/api/v1/brand_kits/{id}",
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([
'bot' => [
'tile' => [
'type' => 'color',
'color' => [
'background_color' => '#101828'
]
]
],
'email' => [
'branded' => [
'cta' => [
'type' => 'link',
'link' => [
'label' => 'Open in Acme',
'url' => 'https://acme.com/m/{{meeting_id}}'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.meetingkit.com/api/v1/brand_kits/{id}"
payload := strings.NewReader("{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<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.patch("https://api.meetingkit.com/api/v1/brand_kits/{id}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/brand_kits/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bot\": {\n \"tile\": {\n \"type\": \"color\",\n \"color\": {\n \"background_color\": \"#101828\"\n }\n }\n },\n \"email\": {\n \"branded\": {\n \"cta\": {\n \"type\": \"link\",\n \"link\": {\n \"label\": \"Open in Acme\",\n \"url\": \"https://acme.com/m/{{meeting_id}}\"\n }\n }\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "brk_01k6c3v7w2q9d8m4n5p6r7s8tx",
"object": "brand_kit",
"workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"workspace_ids": [
"wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
"wks_01k6a3t4v5w6x7y8z9a0b1c2de"
],
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": {
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"url": "https://assets.meetingkit.com/logos/acme.png?Expires=1822298280&Signature=…"
},
"background_color": "#0B1F3A",
"scale": 70
}
},
"chat": {
"enabled": true,
"recording_message": "Hi, I'm Acme Assistant, taking notes for {{user}}.",
"paused_message": "Recording is paused."
}
},
"email": {
"type": "branded",
"branded": {
"logo": {
"id": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"url": "https://assets.meetingkit.com/logos/acme.png?Expires=1822298280&Signature=…"
},
"color": "#0052FF",
"website": "https://acme.com",
"description": "Acme AI Meeting Companion",
"cta": {
"type": "link",
"link": {
"label": "Open in Acme",
"url": "https://acme.com/m/{{meeting_id}}"
}
}
}
},
"preview_url": "https://api.meetingkit.com/app/shared/brand-kits/brk_01k6c3v7w2q9d8m4n5p6r7s8tx/preview?token=WyJicmtfMDFrNmMzdjd3MnE5ZDhtNG41cDZyN3M4dHgiLDE3OTA0MTM4MDBd--50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c",
"preview_expires_at": "2026-09-26T09:10:00Z",
"metadata": {},
"created_at": "2026-09-30T10:00:00Z"
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Authorizations
Your API key, sent bare. See Authentication.
Path Parameters
Brand kit ID, beginning with brk_. Treat it as an opaque string.
"brk_01k6c3v7w2q9d8m4n5p6r7s8tx"
Body
Merged into the object's metadata: the keys you send are added or overwritten and the
others kept. "" as a value removes that key; metadata: "" removes every key. Numbers and
booleans are stored as their text; objects, arrays and null are refused.
Show child attributes
Show child attributes
{
"gurusup_user_id": "usr_8812",
"old_key": ""
}
How the notetaker appears in the call. Send only what changes.
Show child attributes
Show child attributes
How the summary email looks. Send only what changes.
Show child attributes
Show child attributes
Every workspace the key belongs to that should use this kit. An empty list detaches all of them; the kit stays until it is deleted.
500A wks_ workspace id. Integer workspace ids are still accepted.
Response
The updated brand kit.
Brand kit ID, beginning with brk_.
Always brand_kit.
The workspaces that use this kit, among those the key belongs to. Empty for a kit no workspace uses.
A wks_ workspace id. Integer workspace ids are still accepted.
How the notetaker appears in the call.
Show child attributes
Show child attributes
How the summary email looks. Only the object named after type is present; the branded options stay stored while type is default.
Show child attributes
Show child attributes
The workspace that owns the kit, a wks_ id. null when the key does not belong to it.
A page that shows this kit as saved, the notetaker's tile in the call, its chat messages and the summary email. Anyone with the link can open it, without signing in, until preview_expires_at. Every response carries a fresh link.
When preview_url stops working, ten minutes after the response, in ISO 8601. Read the brand kit again for a fresh link.
Your own key-value pairs, for your ids and context. MeetingKit stores them, returns them on the object and in every webhook that carries it, and never acts on them. Up to 50 keys of up to 40 characters (no square brackets), values up to 500 characters. See metadata.
Show child attributes
Show child attributes
{ "gurusup_user_id": "usr_8812" }
When the brand kit was created, in ISO 8601.