Skip to main content
A brand kit is how the notetaker presents itself in your customer’s calls and in the summary email. You build one in five steps:
  1. Upload your images with POST /files.
  2. Create the kit with POST /brand_kits. It answers a preview_url.
  3. Show preview_url to a human.
  4. Change the kit with PATCH /brand_kits/{id} until they approve it. Nothing is live yet.
  5. Apply it: set branding.brand_kit_id in a workspace’s settings.
Every field is on the brand kit object.

1. Upload your images

Upload each image once, as multipart/form-data with purpose=brand_kit: a logo, and a 16:9 picture if you want your own video tile.
A file is a PNG, JPEG, GIF, WebP or SVG of at most 10 MB. Use a PNG for the logo the email shows: most mail clients don’t render SVG, and an SVG’s url downloads instead of displaying. A workspace takes 60 uploads a minute; past that, 429 rate_limited.

2. Create the kit

Send what you know; every group is optional and takes its default when left out.
The kit changes nothing yet: workspace_ids is empty until a workspace applies it in step 5. workspace_ids is read-only; settings decide which workspaces use a kit.

Which workspace owns it

A key that belongs to one workspace needs nothing more: that workspace owns the files and the kit. A key that belongs to several must send workspace_id on POST /files (as a form field) and on POST /brand_kits; without it, both answer 400 missing on workspace_id. workspace_id reads null when the key does not belong to the workspace that owns the kit.

3. Show the preview

Give preview_url to a human: it shows the notetaker’s tile in a call, its chat messages and the summary email, exactly as the kit is saved. It needs no sign-in and lasts 10 minutes (preview_expires_at). Every GET or PATCH of the kit answers a fresh one:
An expired link shows that it expired; get a new one rather than retrying it.

4. Iterate

Send only what changes. Here the human wants their own picture on the tile:
The name, the chat and the email stay as they were, and the logo tile’s options stay stored: { "bot": { "tile": { "type": "logo" } } } switches back to it. Show the new preview_url. While no workspace uses the kit, nothing a customer sees changes. Once one does, every PATCH reaches its next calls and emails straight away.

5. Apply it

A workspace uses a kit through its settings, set on the workspace alone (["workspaces:wks_…"]). A new workspace has none of its own: it inherits your account’s. Give it settings that apply the kit:
If the workspace has its own settings already, that answers 409 scope_taken naming the assignment: PATCH its settings with the same branding instead. A kit is set on a workspace alone; on an account, a member or a meeting category it answers 422 not_supported. The kit’s read-only workspace_ids now lists the workspace. One kit can brand many workspaces: apply it to each. "brand_kit_id": "none" goes back to the default look. See Settings. A single bot can still override the name, avatar and greeting when you send it.

What a kit holds

Each choice is a type plus an object named after it. A read returns only the chosen type’s object; the options of the others stay stored.

The bot

bot.tile.color.background_color and bot.tile.logo.background_color are one value: sending both with different colors is 422 invalid. Write both chat messages in the brand’s voice, and keep {{user}}: it becomes the name of the person the notetaker records for. A message you don’t write reads as the standard one.

The email

email.branded.logo is the tile’s logo until you set one of its own. email.branded.cta is the button under the meeting’s name: If your users have no MeetingKit account, set cta to none or to a link. In link.url, {{meeting_id}} is replaced by the meeting’s mtg_ id; write it exactly so, with no spaces. An email with no meeting to name shows the “Open meeting” button instead of a link whose url names {{meeting_id}}.

Writing rules

  • Partial at every depth. On POST and PATCH, a group, an object or a field you leave out keeps its value. type can be left out: the current one stays.
  • null resets a text (bot.name, the chat messages, color, website, description) to its default.
  • A read’s bot and email can be sent back unchanged. Send those groups only, not the whole object: id, object, preview_url and the other read-only fields are 422 unknown_field. A name or message equal to the default the read showed stays unset, so it keeps following the default.
  • Files (bot.tile.logo.file, bot.tile.image.file, email.branded.logo) take a file_ id, null, or the { id, url } a read returned. From that object only id counts: the same id keeps the image, another id copies that file. The kit keeps its own copy, so it doesn’t depend on the file afterwards.
  • A file reads as { id, url }. url is the kit’s copy, signed for a year and fresh on every read. id is null for an image uploaded in the dashboard.
  • null removes an image. email.branded.logo: null goes back to the tile’s logo. A logo or image tile can’t lose its file: choose another tile first.

Errors

Every error is { "errors": [{ "code", "field", "message" }] }. See Errors. field is the dotted path into your request, such as bot.tile.logo.background_color.