> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meetingkit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 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](/api-reference/settings/object). The key must be an
owner or admin of the owner and of each listed workspace, and their plans must include
notetaker customization.




## OpenAPI

````yaml /openapi.yaml post /brand_kits
openapi: 3.1.0
info:
  title: MeetingKit API
  description: >
    The MeetingKit API lets you build a meetings feature into your product:
    users connect

    a calendar, a notetaker joins their calls, and you get the transcript,
    speakers and

    summary of each meeting.
  version: '2026-10-12'
  contact:
    name: MeetingKit Developer Support
    email: dev@happyscribe.co
servers:
  - url: https://api.meetingkit.com/api/v1
security:
  - apiKeyAuth: []
tags:
  - name: Agent sessions
    description: Exchange the code a user hands their AI agent for API credentials.
  - name: Uploads
    description: Get signed URLs to upload media files directly to MeetingKit storage.
  - name: Transcribe
    description: Create transcription orders from media URLs.
  - name: Subtitle
    description: Create subtitling orders from media URLs.
  - name: Translate
    description: Create translation orders from existing conversations.
  - name: Orders
    description: Retrieve and confirm the orders created by the service endpoints.
  - name: Conversations
    description: List, retrieve, update, and delete conversations.
  - name: Exports
    description: Export conversations to text, subtitle, video-editing, and data formats.
  - name: Bots
    description: Send a notetaker bot to Zoom, Google Meet, or Microsoft Teams calls.
  - name: Glossaries
    description: List glossaries to apply custom terminology to orders.
  - name: Style guides
    description: List style guides to apply formatting preferences to orders.
  - name: Workspaces
    description: List the workspaces the authenticated user belongs to.
  - name: Organization memberships
    description: Manage which users belong to a workspace.
  - name: Members
    description: A partner's end users inside a workspace (MeetingKit).
  - name: Meetings
    description: >-
      Every meeting of a workspace, from calendars and bots, with its results
      (MeetingKit).
  - name: Calendar connections
    description: >-
      Members' Google and Microsoft calendars, connected through a hosted
      consent link and synced by MeetingKit.
  - name: Calendar events
    description: Calendar events a partner pushes from its own calendar sync (MeetingKit).
  - name: Settings
    description: >-
      What gets recorded and how, as values you assign to a workspace, a member,
      a meeting category or one meeting (MeetingKit).
  - name: Settings assignments
    description: Where settings apply (MeetingKit).
  - name: Files
    description: Images uploaded to a workspace, to use in a brand kit (MeetingKit).
  - name: Webhook endpoints
    description: Register the receivers of a workspace's webhooks, and test them.
  - name: Webhook events
    description: >-
      The webhooks sent to a workspace's endpoints, how each delivery went, and
      redelivery.
  - name: People
    description: >-
      Language Services. People found in your transcripts (Memory API, private
      beta).
  - name: Companies
    description: >-
      Language Services. Companies found in your transcripts (Memory API,
      private beta).
paths:
  /brand_kits:
    post:
      tags:
        - Brand kits
      summary: Create a brand kit
      description: >
        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](/api-reference/settings/object). The key must be an

        owner or admin of the owner and of each listed workspace, and their
        plans must include

        notetaker customization.
      operationId: createBrandKit
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrandKitCreate'
      responses:
        '201':
          description: Brand kit created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandKit'
        '400':
          description: >-
            The key belongs to several workspaces and `workspace_id` was not
            sent (`missing`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            The key is not an owner or admin of the owner or of a listed
            workspace (`workspace_update_not_allowed`), or its plan does not
            include notetaker customization (`plan_upgrade_required`). Nothing
            is created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '404':
          description: >-
            The owner or a listed workspace is not one the key belongs to, or a
            `file_` id is not a file the key can read.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '422':
          description: >
            A field failed validation: a `type` outside its list (`inclusion`),
            an email `type` of

            `custom`, which is not available yet (`invalid`), a bad color,
            scale, message or URL, a

            `logo` or `image` tile with no file or a `link` button with no label
            or URL (`missing`,

            `blank`), or a field the kit does not have, such as `bot_name`
            (`unknown_field`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
components:
  schemas:
    BrandKitCreate:
      type: object
      properties:
        metadata:
          $ref: '#/components/schemas/MetadataUpdate'
        workspace_id:
          type: string
          description: >-
            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.
          example: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
        workspace_ids:
          type: array
          maxItems: 500
          items:
            type: string
            description: A `wks_` workspace id. Integer workspace ids are still accepted.
          description: >-
            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.
        bot:
          $ref: '#/components/schemas/BrandKitBotUpdate'
        email:
          $ref: '#/components/schemas/BrandKitEmailUpdate'
      example:
        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
    BrandKit:
      type: object
      required:
        - id
        - object
        - workspace_ids
        - bot
        - email
      properties:
        id:
          type: string
          description: Brand kit ID, beginning with `brk_`.
        object:
          type: string
          description: Always `brand_kit`.
        workspace_id:
          type: string
          nullable: true
          description: >-
            The workspace that owns the kit, a `wks_` id. `null` when the key
            does not belong to it.
        workspace_ids:
          type: array
          items:
            type: string
            description: A `wks_` workspace id. Integer workspace ids are still accepted.
          description: >-
            The workspaces that use this kit, among those the key belongs to.
            Empty for a kit no workspace uses.
        bot:
          $ref: '#/components/schemas/BrandKitBot'
        email:
          $ref: '#/components/schemas/BrandKitEmail'
        preview_url:
          type: string
          format: uri
          description: >-
            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.
        preview_expires_at:
          type: string
          format: date-time
          description: >-
            When `preview_url` stops working, ten minutes after the response, in
            ISO 8601. Read the brand kit again for a fresh link.
        metadata:
          $ref: '#/components/schemas/Metadata'
        created_at:
          description: |
            When the brand kit was created, in ISO 8601.
          type: string
          format: date-time
      example:
        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:
      type: object
      required:
        - errors
      description: >
        Every error the API returns, `401` and `429` included. See
        [Errors](/api-reference/errors).
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
        retry_in_seconds:
          type: integer
          description: >-
            On `429`, how long to wait before retrying. Also sent as
            `Retry-After`.
      example:
        errors:
          - code: invalid
            field: recording.methods.bot.mode
            message: 'must be one of: audio_and_video, audio_only, inherit'
    MetadataUpdate:
      description: >
        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.
      oneOf:
        - type: object
          maxProperties: 50
          propertyNames:
            minLength: 1
            maxLength: 40
            pattern: ^[^\[\]]+$
          additionalProperties:
            type:
              - string
              - number
              - boolean
            maxLength: 500
        - type: string
          enum:
            - ''
      example:
        gurusup_user_id: usr_8812
        old_key: ''
    BrandKitBotUpdate:
      type: object
      description: How the notetaker appears in the call. Send only what changes.
      properties:
        name:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            The notetaker's name in the call. `null` or `""` goes back to the
            name derived from the workspace.
        tile:
          type: object
          description: >
            The picture on the notetaker's video tile. `type` chooses it; the
            object named after a

            type sets that type's options. Options sent for a type that is not
            the chosen one are

            stored, so switching `type` later restores them.
          properties:
            type:
              type: string
              enum:
                - default
                - color
                - logo
                - image
              description: >
                Which tile the notetaker shows. Omit it to keep the current one.


                - `default`: MeetingKit's logo.

                - `color`: a background color with no logo.

                - `logo`: your logo on a background color. Needs a `logo.file`,
                sent now or before.

                - `image`: your own 16:9 picture. Needs an `image.file`, sent
                now or before.
            color:
              type: object
              description: The options of the `color` tile.
              properties:
                background_color:
                  type: string
                  pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
                  description: >-
                    The tile's background, as a HEX color. The `color` and
                    `logo` tiles share it, and the `default` tile sits on it
                    too.
            logo:
              type: object
              description: The options of the `logo` tile.
              properties:
                file:
                  description: >-
                    The `file_` id of the logo, from `POST /files`. Its bytes
                    are copied onto the kit. `null` removes the logo. The `{ id,
                    url }` object a read returns is accepted too and keeps the
                    image it names.
                  oneOf:
                    - type: string
                    - $ref: '#/components/schemas/BrandKitImage'
                    - type: 'null'
                  example: file_01k6d8q4z7m2n5p8r1s3t6v9wx
                background_color:
                  type: string
                  pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
                  description: >-
                    The tile's background, as a HEX color. Must equal
                    `color.background_color` when both are sent.
                scale:
                  type: integer
                  minimum: 10
                  maximum: 100
                  description: How large the logo is on the tile, as a percentage.
            image:
              type: object
              description: The options of the `image` tile.
              properties:
                file:
                  description: >-
                    The `file_` id of a 16:9 picture that fills the tile, from
                    `POST /files`. Its bytes are copied onto the kit. `null`
                    removes it. The `{ id, url }` object a read returns is
                    accepted too and keeps the image it names.
                  oneOf:
                    - type: string
                    - $ref: '#/components/schemas/BrandKitImage'
                    - type: 'null'
                  example: file_01k6d9b2c4e6g8j0m2p4r6t8vx
        chat:
          type: object
          description: What the notetaker posts in the call's chat.
          properties:
            enabled:
              type: boolean
              nullable: true
              description: >-
                Whether the notetaker posts chat messages at all. `null` turns
                them off.
            recording_message:
              type: string
              nullable: true
              maxLength: 300
              description: >-
                Posted when the notetaker joins and starts recording. Supports
                `{{user}}`. `null` or `""` goes back to the standard greeting.
            paused_message:
              type: string
              nullable: true
              maxLength: 300
              description: >-
                Posted while recording is paused. Supports `{{user}}`. `null` or
                `""` goes back to the standard announcement.
    BrandKitEmailUpdate:
      type: object
      description: How the summary email looks. Send only what changes.
      properties:
        type:
          type: string
          enum:
            - default
            - branded
          description: |
            Which summary email is sent. Omit it to keep the current one.

            - `default`: MeetingKit's email.
            - `branded`: your logo, color, website and button.
        branded:
          type: object
          description: >-
            The options of the `branded` email. They are stored whatever `type`
            is.
          properties:
            logo:
              description: >-
                The `file_` id of the logo at the top of the email, from `POST
                /files`. Its bytes are copied onto the kit. `null` goes back to
                the tile's logo. The `{ id, url }` object a read returns is
                accepted too and keeps the image it names. Use a PNG or JPEG;
                most mail clients do not show an SVG.
              oneOf:
                - type: string
                - $ref: '#/components/schemas/BrandKitImage'
                - type: 'null'
              example: file_01k6d8q4z7m2n5p8r1s3t6v9wx
            color:
              type: string
              nullable: true
              pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
              description: The HEX color of the email's header and button.
            website:
              type: string
              nullable: true
              maxLength: 2048
              description: Where the email's "Learn more" link goes.
            description:
              type: string
              nullable: true
              maxLength: 300
              description: The line about your product in the email's footer.
            cta:
              type: object
              description: The button under the meeting's name.
              properties:
                type:
                  type: string
                  enum:
                    - open_meeting
                    - none
                    - link
                  description: >
                    What the button does.


                    - `open_meeting`: opens the meeting in MeetingKit, for
                    recipients who can open it there.

                    - `none`: no button. Use it, or `link`, when your users have
                    no MeetingKit account.

                    - `link`: opens your own URL. Needs a `link.label` and a
                    `link.url`, sent now or before.
                link:
                  type: object
                  description: The options of the `link` button.
                  properties:
                    label:
                      type: string
                      maxLength: 64
                      description: The button's text.
                    url:
                      type: string
                      maxLength: 2048
                      description: >-
                        Where the button goes, an `http` or `https` URL.
                        `{{meeting_id}}` is replaced by the meeting's `mtg_` id.
    BrandKitBot:
      type: object
      description: How the notetaker appears in the call.
      properties:
        name:
          type: string
          maxLength: 64
          description: >-
            The notetaker's name in the call. Defaults to one derived from the
            name of the workspace that owns the kit.
        tile:
          type: object
          description: >-
            The picture on the notetaker's video tile. Only the object named
            after `type` is present; the options of the other types stay stored.
          properties:
            type:
              type: string
              enum:
                - default
                - color
                - logo
                - image
              description: |
                Which tile the notetaker shows.

                - `default`: MeetingKit's logo.
                - `color`: a background color with no logo.
                - `logo`: your logo on a background color.
                - `image`: your own 16:9 picture.
            color:
              type: object
              description: Present when `type` is `color`.
              properties:
                background_color:
                  type: string
                  pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
                  description: >-
                    The tile's background, as a HEX color. The `color` and
                    `logo` tiles share it.
            logo:
              type: object
              description: Present when `type` is `logo`.
              properties:
                file:
                  description: The logo, or `null` when the kit has none.
                  oneOf:
                    - $ref: '#/components/schemas/BrandKitImage'
                    - type: 'null'
                background_color:
                  type: string
                  pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
                  description: >-
                    The tile's background, as a HEX color. The `color` and
                    `logo` tiles share it.
                scale:
                  type: integer
                  minimum: 10
                  maximum: 100
                  description: How large the logo is on the tile, as a percentage.
            image:
              type: object
              description: Present when `type` is `image`.
              properties:
                file:
                  description: >-
                    The 16:9 picture that fills the tile, or `null` when the kit
                    has none.
                  oneOf:
                    - $ref: '#/components/schemas/BrandKitImage'
                    - type: 'null'
        chat:
          type: object
          description: What the notetaker posts in the call's chat.
          properties:
            enabled:
              type: boolean
              description: Whether the notetaker posts chat messages at all.
            recording_message:
              type: string
              maxLength: 300
              description: >-
                Posted when the notetaker joins and starts recording. Supports
                `{{user}}`. Falls back to the standard greeting when not
                customized, so it is never null.
            paused_message:
              type: string
              maxLength: 300
              description: >-
                Posted while recording is paused. Supports `{{user}}`. Falls
                back to the standard announcement when not customized, so it is
                never null.
    BrandKitEmail:
      type: object
      description: >-
        How the summary email looks. Only the object named after `type` is
        present; the branded options stay stored while `type` is `default`.
      properties:
        type:
          type: string
          enum:
            - default
            - branded
          description: >
            Which summary email is sent.


            - `default`: MeetingKit's email.

            - `branded`: your logo, color, website and button, sent as "<bot
            name>" from summaries@meetingkit.com.
        branded:
          type: object
          description: Present when `type` is `branded`.
          properties:
            logo:
              description: >-
                The logo at the top of the email. The tile's logo until the kit
                has an email logo of its own; `null` when it has neither.
              oneOf:
                - $ref: '#/components/schemas/BrandKitImage'
                - type: 'null'
            color:
              type: string
              nullable: true
              pattern: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
              description: The HEX color of the email's header and button.
            website:
              type: string
              nullable: true
              format: uri
              description: Where the email's "Learn more" link goes.
            description:
              type: string
              nullable: true
              maxLength: 300
              description: The line about your product in the email's footer.
            cta:
              type: object
              description: >-
                The button under the meeting's name. Only the object named after
                `type` is present.
              properties:
                type:
                  type: string
                  enum:
                    - open_meeting
                    - none
                    - link
                  description: >
                    What the button does.


                    - `open_meeting`: opens the meeting in MeetingKit, for
                    recipients who can open it there.

                    - `none`: no button.

                    - `link`: opens your own URL.
                link:
                  type: object
                  description: Present when `type` is `link`.
                  properties:
                    label:
                      type: string
                      maxLength: 64
                      description: The button's text.
                    url:
                      type: string
                      maxLength: 2048
                      description: >-
                        Where the button goes, an `http` or `https` URL.
                        `{{meeting_id}}` is replaced by the meeting's `mtg_` id.
    Metadata:
      type: object
      description: >
        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](/meetingkit/setup#a-workspace-per-customer).
      maxProperties: 50
      propertyNames:
        minLength: 1
        maxLength: 40
        pattern: ^[^\[\]]+$
      additionalProperties:
        type: string
        maxLength: 500
      example:
        gurusup_user_id: usr_8812
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: >-
            A stable snake_case word, safe to branch on. See
            [Errors](/api-reference/errors) for the list.
        message:
          type: string
          description: A sentence for humans. It may change; do not parse it.
        field:
          type: string
          description: >-
            The dotted path to the request field at fault, such as
            `recording.methods.bot.mode`. Present only when one field is.
    BrandKitImage:
      type: object
      description: >-
        An image on the kit, copied from the [file](/api-reference/files/object)
        it was set with.
      properties:
        id:
          type: string
          nullable: true
          description: >-
            The `file_` id the image was set with. `null` for an image uploaded
            in the dashboard.
        url:
          type: string
          format: uri
          description: >-
            A signed URL of the kit's copy of the image, valid for one year.
            Every read returns a fresh one.
  responses:
    Unauthorized:
      description: >-
        Your API key is missing (`missing_api_key`) or wrong
        (`invalid_api_key`), or it may not access this resource
        (`unauthorized`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your API key, sent bare. See
        [Authentication](/api-reference/authentication).

````