> ## 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.

# Update a bot

> Moves a bot created through the API when its meeting moves, or replaces its
participants or metadata. Send only the fields you are changing. A field sent
with the value the bot already has is ignored, so a retried request is safe.

- `join_at` and `meeting_url` can change while the bot is `queued`. The bot
  keeps its ID.
- `participants` can change until the call ends. They are used to name
  speakers when the recording is processed. A new address also gets access
  to the recording; removing an address from the list does not take access away.
- `metadata` can change until the bot is `completed`, `failed`, or `cancelled`.

Updating a bot sends no webhook.




## OpenAPI

````yaml /openapi.yaml patch /bots/{id}
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:
  /bots/{id}:
    patch:
      tags:
        - Bots
      summary: Update a bot
      description: >
        Moves a bot created through the API when its meeting moves, or replaces
        its

        participants or metadata. Send only the fields you are changing. A field
        sent

        with the value the bot already has is ignored, so a retried request is
        safe.


        - `join_at` and `meeting_url` can change while the bot is `queued`. The
        bot
          keeps its ID.
        - `participants` can change until the call ends. They are used to name
          speakers when the recording is processed. A new address also gets access
          to the recording; removing an address from the list does not take access away.
        - `metadata` can change until the bot is `completed`, `failed`, or
        `cancelled`.


        Updating a bot sends no webhook.
      operationId: updateBot
      parameters:
        - $ref: '#/components/parameters/HappyscribeVersion'
        - $ref: '#/components/parameters/BotId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BotUpdateRequest'
      responses:
        '200':
          description: The updated bot.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Bot'
        '400':
          description: >-
            The body is empty, names a field that cannot be changed, or a value
            is malformed (`join_at` in the past, invalid `meeting_url`,
            `participants` over its limit, or `metadata` over its limits before
            2026-10-12; from 2026-10-12 invalid `metadata` is a 422).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: >-
            The bot can no longer take this change (for example `join_at` once
            it is joining), or it was not created through the API. The error's
            `code` is `bot_not_editable`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '422':
          description: >-
            The meeting provider refused to move the bot (`provider_rejected`).
            The bot is unchanged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '502':
          description: The meeting provider did not answer. The bot is unchanged; retry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
components:
  parameters:
    HappyscribeVersion:
      name: Happyscribe-Version
      in: header
      required: false
      description: >
        Serve this request as the API was on this date. Any ISO date works — it
        resolves to

        the newest version on or before it — and it never changes your key's
        pin. See

        [Versioning](/api-reference/changelog#versioning).
      schema:
        type: string
        format: date
        example: '2026-09-01'
    BotId:
      name: id
      in: path
      required: true
      description: Bot ID, beginning with `bot_`. Treat it as an opaque string.
      schema:
        type: string
        example: bot_01k0h4r9s8x7c2dvq3m5n6p4ab
  schemas:
    BotUpdateRequest:
      type: object
      minProperties: 1
      additionalProperties: false
      properties:
        join_at:
          type: string
          format: date-time
          description: >-
            New future ISO 8601 timestamp with a UTC offset. Only while the bot
            is `queued`.
        meeting_url:
          type: string
          description: >-
            New Zoom, Google Meet, or Microsoft Teams join URL. Only while the
            bot is `queued`.
        participants:
          type: array
          maxItems: 100
          items:
            $ref: '#/components/schemas/MeetingParticipant'
          description: >-
            Replaces the participant list used to name speakers. Until the call
            ends. New addresses get access to the recording; removed ones keep
            it.
        metadata:
          $ref: '#/components/schemas/MetadataUpdate'
          description: >-
            Merged into the bot's metadata until the bot is `completed`,
            `failed`, or `cancelled`. Before 2026-10-12, any JSON object (up to
            16 KB, five levels deep) that replaces it.
      example:
        join_at: '2026-10-01T11:00:00Z'
    Bot:
      type: object
      description: >
        A bot is one way of recording a meeting. It carries its identity in the
        call and the

        meeting's recording choices; what the meeting produced (transcript,
        speakers, summary,

        media) is read from [`GET
        /meetings/{id}/results`](/api-reference/meetings/results).
      properties:
        id:
          type: string
          description: >-
            Stable typed bot ID beginning with `bot_`. Treat it as an opaque
            string.
        object:
          type: string
          description: Always `bot`.
        meeting_id:
          type: string
          description: >-
            The meeting this bot records, beginning with `mtg_`. It exists from
            the moment the bot is queued; read its results with `GET
            /meetings/{meeting_id}/results`.
        meeting_url:
          type: string
          description: >-
            Normalized URL supplied at creation. Treat as sensitive — it may
            contain credentials.
        join_at:
          type: string
          format: date-time
          nullable: true
          description: Requested ISO 8601 join time, or `null` for an immediate dispatch.
        status:
          type: string
          enum:
            - queued
            - joining
            - in_call
            - processing
            - completed
            - failed
            - cancelled
          description: >
            Current lifecycle state:

            - `queued`: the provider accepted the bot and the notetaker is
            pending

            - `joining`: the notetaker is joining the call

            - `in_call`: the notetaker is in the call and recording

            - `processing`: the recording is being transcribed or summarized

            - `completed`: the transcript and summary are ready on the meeting

            - `failed`: the bot ended without a usable result

            - `cancelled`: the bot was cancelled
        bot_name:
          type: string
          description: Display name of the notetaker in the call.
        welcome_message:
          type: string
          nullable: true
          description: >-
            Chat message the notetaker posts when it joins, or `null` when it
            posts none.
        language:
          type: string
          description: >-
            Transcription language as a BCP-47 code, `auto` or `multi`. The
            meeting's `settings.transcription.language`.
        recording_start:
          type: string
          enum:
            - on_join
            - on_command
          description: >
            When the notetaker starts recording. The meeting's
            `settings.recording.methods.bot.start`.

            - `on_join`: as soon as it joins the call

            - `on_command`: when someone in the call asks it to
        recording_mode:
          type: string
          enum:
            - audio_and_video
            - audio_only
          description: >
            What the notetaker records. The meeting's
            `settings.recording.methods.bot.mode`.

            - `audio_and_video`: audio and video

            - `audio_only`: audio only
        silence_alert:
          type: boolean
          description: >-
            Whether the notetaker posts an audible and chat alert after a long
            silence, in case it is recording nothing. The meeting's
            `settings.recording.methods.bot.silence_detection.alert`.
        summary_language:
          type: string
          nullable: true
          description: >-
            Language of the summary as a BCP-47 code, or `null` to follow the
            transcription. The meeting's `settings.summary.language`.
        summary_template:
          type: string
          nullable: true
          description: >-
            The summary template that runs, a built-in slug or a custom
            template's `tpl_` id. The meeting's `settings.summary.template`.
        participants:
          type: array
          items:
            $ref: '#/components/schemas/MeetingParticipant'
          description: >-
            Everyone invited to the meeting. Meeting rooms and the notetaker
            itself are excluded.
        metadata:
          $ref: '#/components/schemas/Metadata'
          description: >-
            A flat map of strings from 2026-10-12. Before it, the object stored
            at creation, returned as stored; a value stored as a nested object
            reads as its JSON text from 2026-10-12.
        created_at:
          type: string
          format: date-time
          description: When the bot was created.
        ended_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the recording first became available. `null` until then, and
            for a bot that never recorded. Reprocessing does not change it.
        reason:
          type: string
          enum:
            - no_recording
            - invalid_meeting_url
            - bot_error
            - transcription_failed
          description: |
            Machine-readable failure reason. Present only for failed bots.
            - `no_recording`: the call ended without anything recorded
            - `invalid_meeting_url`: the meeting URL could not be joined
            - `bot_error`: the notetaker failed in the call
            - `transcription_failed`: the recording could not be transcribed
        failure_message:
          type: string
          nullable: true
          description: >-
            Human-readable failure detail for debugging. Present only for failed
            bots. Do not match on its text; use `reason`.
      example:
        id: bot_01k0h4r9s8x7c2dvq3m5n6p4ab
        object: bot
        meeting_id: mtg_01k0h4r9s8x7c2dvq3m5n6p4ab
        meeting_url: https://zoom.us/j/123456789
        join_at: '2026-07-20T14:00:00Z'
        status: queued
        bot_name: Acme Notetaker
        welcome_message: Recording this meeting for Acme
        language: en
        recording_start: on_join
        recording_mode: audio_only
        silence_alert: true
        summary_language: en
        summary_template: discovery_call
        participants:
          - email: carmen@example.com
            name: Carmen
        metadata:
          partner_meeting_id: meeting-123
        created_at: '2026-07-20T13:58:12Z'
        ended_at: null
    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'
    MeetingParticipant:
      type: object
      properties:
        email:
          description: |
            The participant's email. Used to name speakers.
          type: string
        name:
          type: string
          nullable: true
          description: >-
            Resolved from the calendar invite, anything supplied at creation,
            the names people displayed in the call, and the people the workspace
            already knows, keeping the fullest. Null when no source knew one.
      example:
        email: carmen@example.com
        name: Carmen
    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: ''
    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.
  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'
    NotFound:
      description: >-
        The specified resource could not be found, or this key cannot see it
        (`not_found`).
      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).

````