curl --request POST \
--url https://api.meetingkit.com/api/v1/brand_kits \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"background_color": "#0B1F3A"
}
}
},
"email": {
"type": "branded",
"branded": {
"logo": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"color": "#0052FF",
"website": "https://acme.com",
"cta": {
"type": "none"
}
}
}
}
'import requests
url = "https://api.meetingkit.com/api/v1/brand_kits"
payload = {
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"background_color": "#0B1F3A"
}
}
},
"email": {
"type": "branded",
"branded": {
"logo": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"color": "#0052FF",
"website": "https://acme.com",
"cta": { "type": "none" }
}
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bot: {
name: 'Acme Assistant',
tile: {
type: 'logo',
logo: {file: 'file_01k6d8q4z7m2n5p8r1s3t6v9wx', background_color: '#0B1F3A'}
}
},
email: {
type: 'branded',
branded: {
logo: 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
color: '#0052FF',
website: 'https://acme.com',
cta: {type: 'none'}
}
}
})
};
fetch('https://api.meetingkit.com/api/v1/brand_kits', 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",
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([
'bot' => [
'name' => 'Acme Assistant',
'tile' => [
'type' => 'logo',
'logo' => [
'file' => 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
'background_color' => '#0B1F3A'
]
]
],
'email' => [
'type' => 'branded',
'branded' => [
'logo' => 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
'color' => '#0052FF',
'website' => 'https://acme.com',
'cta' => [
'type' => 'none'
]
]
]
]),
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"
payload := strings.NewReader("{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\n }\n }\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.meetingkit.com/api/v1/brand_kits")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/brand_kits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\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"
}
]
}{
"errors": [
{
"code": "invalid",
"field": "recording.methods.bot.mode",
"message": "must be one of: audio_and_video, audio_only, inherit"
}
]
}Create a brand kit
Creates a brand kit owned by workspace_id. Every group is optional: a group left out
takes its default (a name derived from the workspace, the default tile, chat on with the
standard messages, the default email).
The kit changes nothing until a workspace uses it: list workspaces in workspace_ids, or
pick the kit later with branding.brand_kit_id in a workspace’s settings. The key must be an
owner or admin of the owner and of each listed workspace, and their plans must include
notetaker customization.
curl --request POST \
--url https://api.meetingkit.com/api/v1/brand_kits \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"background_color": "#0B1F3A"
}
}
},
"email": {
"type": "branded",
"branded": {
"logo": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"color": "#0052FF",
"website": "https://acme.com",
"cta": {
"type": "none"
}
}
}
}
'import requests
url = "https://api.meetingkit.com/api/v1/brand_kits"
payload = {
"bot": {
"name": "Acme Assistant",
"tile": {
"type": "logo",
"logo": {
"file": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"background_color": "#0B1F3A"
}
}
},
"email": {
"type": "branded",
"branded": {
"logo": "file_01k6d8q4z7m2n5p8r1s3t6v9wx",
"color": "#0052FF",
"website": "https://acme.com",
"cta": { "type": "none" }
}
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
bot: {
name: 'Acme Assistant',
tile: {
type: 'logo',
logo: {file: 'file_01k6d8q4z7m2n5p8r1s3t6v9wx', background_color: '#0B1F3A'}
}
},
email: {
type: 'branded',
branded: {
logo: 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
color: '#0052FF',
website: 'https://acme.com',
cta: {type: 'none'}
}
}
})
};
fetch('https://api.meetingkit.com/api/v1/brand_kits', 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",
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([
'bot' => [
'name' => 'Acme Assistant',
'tile' => [
'type' => 'logo',
'logo' => [
'file' => 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
'background_color' => '#0B1F3A'
]
]
],
'email' => [
'type' => 'branded',
'branded' => [
'logo' => 'file_01k6d8q4z7m2n5p8r1s3t6v9wx',
'color' => '#0052FF',
'website' => 'https://acme.com',
'cta' => [
'type' => 'none'
]
]
]
]),
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"
payload := strings.NewReader("{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\n }\n }\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.meetingkit.com/api/v1/brand_kits")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetingkit.com/api/v1/brand_kits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bot\": {\n \"name\": \"Acme Assistant\",\n \"tile\": {\n \"type\": \"logo\",\n \"logo\": {\n \"file\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"background_color\": \"#0B1F3A\"\n }\n }\n },\n \"email\": {\n \"type\": \"branded\",\n \"branded\": {\n \"logo\": \"file_01k6d8q4z7m2n5p8r1s3t6v9wx\",\n \"color\": \"#0052FF\",\n \"website\": \"https://acme.com\",\n \"cta\": {\n \"type\": \"none\"\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"
}
]
}{
"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.
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": ""
}
The workspace that owns the kit. Optional when the key belongs to exactly one workspace, which is then used. A wks_ id; integer workspace ids are still accepted.
"wks_01k6a2r9s8x7c2dvq3m5n6p4ab"
Every workspace that should use this kit from now on. Omit it to create a kit no workspace uses yet, and pick it later with branding.brand_kit_id in a workspace's settings.
500A wks_ workspace id. Integer workspace ids are still accepted.
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
Response
Brand kit created.
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.