{
  "openapi": "3.1.1",
  "info": {
    "title": "Attendee API",
    "version": "1.0.0",
    "description": "Meetings bots made easy"
  },
  "paths": {
    "/api/v1/bots": {
      "get": {
        "operationId": "List Bots",
        "description": "Returns a list of bots for the authenticated project. Results are paginated using cursor pagination.",
        "summary": "List bots in a project",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "query",
            "name": "deduplication_key",
            "schema": {
              "type": "string"
            },
            "description": "Filter bots by deduplication key",
            "examples": {
              "DeduplicationKeyExample": {
                "value": "my-unique-bot-key",
                "summary": "Deduplication Key Example"
              }
            }
          },
          {
            "in": "query",
            "name": "join_at_after",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return bots with join_at after this time.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T12:34:56Z",
                "summary": "DateTime Example"
              }
            }
          },
          {
            "in": "query",
            "name": "join_at_before",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return bots with join_at before this time.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T13:34:56Z",
                "summary": "DateTime Example"
              }
            }
          },
          {
            "in": "query",
            "name": "meeting_url",
            "schema": {
              "type": "string"
            },
            "description": "Filter bots by meeting URL",
            "examples": {
              "MeetingURLExample": {
                "value": "https://zoom.us/j/123456789",
                "summary": "Meeting URL Example"
              }
            }
          },
          {
            "in": "query",
            "name": "states",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ready",
                  "joining",
                  "joined_not_recording",
                  "joined_recording",
                  "leaving",
                  "post_processing",
                  "fatal_error",
                  "waiting_room",
                  "ended",
                  "data_deleted",
                  "scheduled",
                  "staged",
                  "joined_recording_paused",
                  "joining_breakout_room",
                  "leaving_breakout_room",
                  "joined_recording_permission_denied"
                ]
              }
            },
            "description": "Filter bots by state. Can specify multiple states."
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedBotList"
                }
              }
            },
            "description": "List of bots"
          }
        }
      },
      "post": {
        "operationId": "Create Bot",
        "description": "After being created, the bot will attempt to join the specified meeting.",
        "summary": "Create a new bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBotRequest"
              },
              "examples": {
                "ValidMeetingURL": {
                  "value": {
                    "meeting_url": "https://zoom.us/j/123?pwd=456",
                    "bot_name": "My Bot"
                  },
                  "summary": "Valid meeting URL",
                  "description": "Example of a valid Zoom meeting URL"
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                },
                "examples": {
                  "NewBot": {
                    "value": {
                      "id": "bot_weIAju4OXNZkDTpZ",
                      "meeting_url": "https://zoom.us/j/123?pwd=456",
                      "state": "joining",
                      "events": [
                        {
                          "type": "join_requested",
                          "created_at": "2024-01-18T12:34:56Z"
                        }
                      ],
                      "transcription_state": "not_started",
                      "recording_state": "not_started"
                    },
                    "summary": "New bot",
                    "description": "Example response when creating a new bot"
                  }
                }
              }
            },
            "description": "Bot created successfully"
          },
          "400": {
            "description": "Invalid input"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}": {
      "get": {
        "operationId": "Get Bot",
        "summary": "Get the details for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                },
                "examples": {
                  "NewBot": {
                    "value": {
                      "id": "bot_weIAju4OXNZkDTpZ",
                      "meeting_url": "https://zoom.us/j/123?pwd=456",
                      "state": "joining",
                      "events": [
                        {
                          "type": "join_requested",
                          "created_at": "2024-01-18T12:34:56Z"
                        }
                      ],
                      "transcription_state": "not_started",
                      "recording_state": "not_started"
                    },
                    "summary": "New bot",
                    "description": "Example response when creating a new bot"
                  }
                }
              }
            },
            "description": "Bot details"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      },
      "patch": {
        "operationId": "Patch Bot",
        "description": "Updates a bot. The join_at, meeting_url, bot_name, bot_image and recording_settings fields can only be updated when the bot is in the scheduled state. The metadata field can be updated at any time.",
        "summary": "Update a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPatchBotRequest"
              },
              "examples": {
                "UpdateJoinAt": {
                  "value": {
                    "join_at": "2025-06-13T12:00:00Z"
                  },
                  "summary": "Update join_at",
                  "description": "Example of updating the join_at time for a scheduled bot"
                },
                "UpdateNameAndImage": {
                  "value": {
                    "bot_name": "My Updated Bot",
                    "bot_image": {
                      "type": "image/png",
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                    }
                  },
                  "summary": "Update name and image",
                  "description": "Example of updating the bot name and/or image (supports PNG and JPEG)"
                }
              }
            }
          }
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                }
              }
            },
            "description": "Bot updated successfully"
          },
          "400": {
            "description": "Invalid input or bot cannot be updated"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      },
      "delete": {
        "operationId": "Delete scheduled Bot",
        "description": "Deletes a scheduled bot.",
        "summary": "Delete a scheduled bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Scheduled bot deleted successfully"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/chat_messages": {
      "get": {
        "operationId": "Get Chat Messages",
        "description": "If the meeting is still in progress, this returns the chat messages sent so far. Results are paginated using cursor pagination.",
        "summary": "Get chat messages sent in the meeting",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          },
          {
            "in": "query",
            "name": "updated_after",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return chat messages created after this time. Useful when polling for updates.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T12:34:56Z",
                "summary": "DateTime Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedChatMessageList"
                }
              }
            },
            "description": "List of chat messages"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/delete_data": {
      "post": {
        "operationId": "Delete Bot Data",
        "description": "Permanently deletes all data associated with this bot, including recordings, transcripts, and participant information. Metadata is not deleted. This cannot be undone.",
        "summary": "Delete bot data",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                }
              }
            },
            "description": "Data successfully deleted"
          },
          "400": {
            "description": "Bot is not in a valid state for data deletion"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/leave": {
      "post": {
        "operationId": "Leave Meeting",
        "description": "Causes the bot to leave the meeting.",
        "summary": "Leave a meeting",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                },
                "examples": {
                  "LeavingBot": {
                    "value": {
                      "id": "bot_weIAju4OXNZkDTpZ",
                      "meeting_url": "https://zoom.us/j/123?pwd=456",
                      "state": "leaving",
                      "events": [
                        {
                          "type": "join_requested",
                          "created_at": "2024-01-18T12:34:56Z"
                        },
                        {
                          "type": "joined_meeting",
                          "created_at": "2024-01-18T12:35:00Z"
                        },
                        {
                          "type": "leave_requested",
                          "created_at": "2024-01-18T13:34:56Z"
                        }
                      ],
                      "transcription_state": "in_progress",
                      "recording_state": "in_progress"
                    },
                    "summary": "Leaving Bot",
                    "description": "Example response when requesting a bot to leave"
                  }
                }
              }
            },
            "description": "Successfully requested to leave meeting"
          },
          "400": {
            "description": "Bot is not in a valid state to leave the meeting"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/output_audio": {
      "post": {
        "operationId": "Output Audio",
        "description": "Causes the bot to output audio in the meeting.",
        "summary": "Output audio",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "audio/mp3"
                    ]
                  },
                  "data": {
                    "type": "string",
                    "description": "Base64 encoded audio data"
                  }
                },
                "required": [
                  "type",
                  "data"
                ]
              }
            }
          }
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Audio request created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/output_image": {
      "post": {
        "operationId": "Output Image",
        "description": "Causes the bot to output an image in the meeting.",
        "summary": "Output image",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BotImageRequest"
              },
              "examples": {
                "ValidImage": {
                  "value": {
                    "type": "image/png",
                    "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                  },
                  "summary": "Valid PNG image",
                  "description": "An image of a red pixel encoded in base64 in PNG format"
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Image request created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/output_video": {
      "post": {
        "operationId": "Output video",
        "description": "Causes the bot to output a video in the meeting.",
        "summary": "Output video",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OutputVideoRequestRequest"
              },
              "examples": {
                "VideoOutputRequest": {
                  "value": {
                    "url": "https://example.com/video.mp4",
                    "loop": true
                  },
                  "summary": "Video output request",
                  "description": "Example of a looping mp4 video output request. Set loop to false or omit for a non-looping request."
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Video request created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/participant_events": {
      "get": {
        "operationId": "Get Participant Events",
        "description": "Returns the participant events (join/leave) for a bot. Results are paginated using cursor pagination.",
        "summary": "Get participant events for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "after",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return participant events created after this time. Useful when polling for updates.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T12:34:56Z",
                "summary": "DateTime Example"
              }
            }
          },
          {
            "in": "query",
            "name": "before",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return participant events created before this time.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T13:34:56Z",
                "summary": "DateTime Example"
              }
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedParticipantEventList"
                }
              }
            },
            "description": "List of participant events"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/participants": {
      "get": {
        "operationId": "Get Participants",
        "description": "Returns the participants for a bot. Results are paginated using cursor pagination.",
        "summary": "Get participants for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "query",
            "name": "id",
            "schema": {
              "type": "string"
            },
            "description": "Filter participants by participant ID",
            "examples": {
              "ParticipantIDExample": {
                "value": "par_xxxxxxxxxxx",
                "summary": "Participant ID Example"
              }
            }
          },
          {
            "in": "query",
            "name": "is_host",
            "schema": {
              "type": "boolean"
            },
            "description": "Filter participants by whether they are the meeting host"
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedParticipantList"
                }
              }
            },
            "description": "List of participants"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/pause_recording": {
      "post": {
        "operationId": "Pause Recording",
        "description": "Pauses the recording for the specified bot.",
        "summary": "Pause the bot's recording",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                }
              }
            },
            "description": "Recording paused successfully"
          },
          "400": {
            "description": "Bot is not in a valid state to pause recording"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/recording": {
      "get": {
        "operationId": "Get Bot Recording",
        "description": "Returns a short-lived S3 URL for the recording of the bot.",
        "summary": "Get the recording for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Recording"
                },
                "examples": {
                  "RecordingUpload": {
                    "value": {
                      "url": "https://attendee-short-term-storage-production.s3.amazonaws.com/e4da3b7fbbce2345d7772b0674a318d5.mp4?...",
                      "start_timestamp_ms": 1733114771000
                    },
                    "summary": "Recording Upload"
                  }
                }
              }
            },
            "description": "Short-lived S3 URL for the recording"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/resume_recording": {
      "post": {
        "operationId": "Resume Recording",
        "description": "Resumes the recording for the specified bot.",
        "summary": "Resume the bot's recording",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bot"
                }
              }
            },
            "description": "Recording resumed successfully"
          },
          "400": {
            "description": "Bot is not in a valid state to resume recording"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/send_chat_message": {
      "post": {
        "operationId": "Send Chat Message",
        "description": "Causes the bot to send a chat message in the meeting.",
        "summary": "Send a chat message",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BotChatMessageRequestRequest"
              },
              "examples": {
                "ChatMessage": {
                  "value": {
                    "to": "everyone",
                    "message": "Hello everyone, I'm here to record and summarize this meeting."
                  },
                  "summary": "Chat message",
                  "description": "An example of a chat message to send to everyone in the meeting"
                },
                "ChatMessageToSpecificUser": {
                  "value": {
                    "to": "specific_user",
                    "to_user_uuid": "123e4567-e89b-12d3-a456-426614174000",
                    "message": "Hello Bob, I'm here to record and summarize this meeting."
                  },
                  "summary": "Chat message to specific user",
                  "description": "An example of a chat message to send to a specific user in the meeting"
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Chat message request created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/speech": {
      "post": {
        "operationId": "Output speech",
        "description": "Causes the bot to speak a message in the meeting.",
        "summary": "Output speech",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeechRequest"
              },
              "examples": {
                "ValidSpeechRequest": {
                  "value": {
                    "text": "Hello, this is a bot speaking text.",
                    "text_to_speech_settings": {
                      "google": {
                        "voice_language_code": "en-US",
                        "voice_name": "en-US-Casual-K"
                      }
                    }
                  },
                  "summary": "Valid speech request",
                  "description": "Example of a valid speech request"
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Speech request created successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/transcript": {
      "get": {
        "operationId": "Get Bot Transcript",
        "description": "If the meeting is still in progress, this returns the transcript so far.",
        "summary": "Get the transcript for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          },
          {
            "in": "query",
            "name": "updated_after",
            "schema": {
              "type": "string",
              "format": "ISO 8601 datetime"
            },
            "description": "Only return transcript entries updated or created after this time. Useful when polling for updates to the transcript.",
            "examples": {
              "DateTimeExample": {
                "value": "2024-01-18T12:34:56Z",
                "summary": "DateTime Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TranscriptUtterance"
                  }
                }
              }
            },
            "description": "List of transcribed utterances"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/bots/{object_id}/voice_agent_settings": {
      "patch": {
        "operationId": "Update Voice Agent Settings",
        "description": "Updates the voice agent settings for a bot.",
        "summary": "Update the voice agent settings for a bot",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Bot ID",
            "required": true,
            "examples": {
              "BotIDExample": {
                "value": "bot_xxxxxxxxxxx",
                "summary": "Bot ID Example"
              }
            }
          }
        ],
        "tags": [
          "Bots"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPatchBotVoiceAgentSettingsRequest"
              }
            }
          }
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Voice agent settings updated successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Bot not found"
          }
        }
      }
    },
    "/api/v1/calendar_events": {
      "get": {
        "operationId": "List Calendar Events",
        "description": "Returns a list of calendar events for the authenticated project. Results are paginated using cursor pagination.",
        "summary": "List calendar events",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "calendar_deduplication_key",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by calendar deduplication key",
            "examples": {
              "DeduplicationKeyExample": {
                "value": "user-abcd",
                "summary": "Deduplication Key Example"
              }
            }
          },
          {
            "in": "query",
            "name": "calendar_id",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by calendar ID",
            "examples": {
              "CalendarIDExample": {
                "value": "cal_abcdef1234567890",
                "summary": "Calendar ID Example"
              }
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "query",
            "name": "end_time_lte",
            "schema": {
              "type": "string"
            },
            "description": "Filter events with end_time at or before this timestamp (ISO 8601 format)",
            "examples": {
              "EndTimeLTEExample": {
                "value": "2025-01-13T18:00:00Z",
                "summary": "End Time LTE Example"
              }
            }
          },
          {
            "in": "query",
            "name": "event_id",
            "schema": {
              "type": "string"
            },
            "description": "Filter events by event ID",
            "examples": {
              "EventIDExample": {
                "value": "evt_abcdef1234567890",
                "summary": "Event ID Example"
              }
            }
          },
          {
            "in": "query",
            "name": "ordering",
            "schema": {
              "type": "string",
              "enum": [
                "-created_at",
                "-end_time",
                "-start_time",
                "-updated_at",
                "created_at",
                "end_time",
                "start_time",
                "updated_at"
              ]
            },
            "description": "Order results by field. Use '-' prefix for descending order. Default: -updated_at.",
            "examples": {
              "OrderingExample": {
                "value": "start_time",
                "summary": "Ordering Example"
              }
            }
          },
          {
            "in": "query",
            "name": "start_time_gte",
            "schema": {
              "type": "string"
            },
            "description": "Filter events with start_time at or after this timestamp (ISO 8601 format)",
            "examples": {
              "StartTimeGTEExample": {
                "value": "2025-01-13T10:30:00Z",
                "summary": "Start Time GTE Example"
              }
            }
          },
          {
            "in": "query",
            "name": "updated_after",
            "schema": {
              "type": "string"
            },
            "description": "Deprecated: Use updated_at_gte instead. Alias for updated_at_gte, kept for backwards compatibility.",
            "deprecated": true
          },
          {
            "in": "query",
            "name": "updated_at_gte",
            "schema": {
              "type": "string"
            },
            "description": "Filter events updated at or after this timestamp (ISO 8601 format)",
            "examples": {
              "UpdatedAtGTEExample": {
                "value": "2025-01-13T10:30:00Z",
                "summary": "Updated At GTE Example"
              }
            }
          }
        ],
        "tags": [
          "Calendars"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCalendarEventList"
                },
                "examples": {
                  "CalendarEvent": {
                    "value": {
                      "next": "http://api.example.org/accounts/?cursor=cD00ODY%3D\"",
                      "previous": "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3",
                      "results": [
                        {
                          "id": "evt_abcdef1234567890",
                          "calendar_id": "cal_abcdef1234567890",
                          "platform_uuid": "google_event_123456789",
                          "meeting_url": "https://meet.google.com/abc-defg-hij",
                          "name": "Event Name",
                          "start_time": "2025-01-15T14:00:00Z",
                          "end_time": "2025-01-15T15:00:00Z",
                          "is_deleted": false,
                          "attendees": [
                            {
                              "email": "user1@example.com",
                              "name": "John Doe"
                            },
                            {
                              "email": "user2@example.com",
                              "name": "Jane Smith"
                            }
                          ],
                          "raw": {
                            "google_event_data": "..."
                          },
                          "bots": [
                            {
                              "id": "bot_abcdef1234567890",
                              "metadata": {
                                "customer_id": "abc123"
                              },
                              "meeting_url": "https://meet.google.com/abc-defg-hij",
                              "state": "joined_recording",
                              "events": [],
                              "transcription_state": "complete",
                              "recording_state": "complete",
                              "join_at": "2025-01-15T14:00:00Z"
                            }
                          ],
                          "created_at": "2025-01-13T10:30:00.123456Z",
                          "updated_at": "2025-01-13T10:30:00.123456Z"
                        }
                      ]
                    },
                    "summary": "Calendar Event",
                    "description": "Example of a calendar event with associated bots"
                  }
                }
              }
            },
            "description": "List of calendar events"
          }
        }
      }
    },
    "/api/v1/calendars": {
      "get": {
        "operationId": "List Calendars",
        "description": "Returns a list of calendars for the authenticated project. Results are paginated using cursor pagination.",
        "summary": "List calendars",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          },
          {
            "in": "query",
            "name": "deduplication_key",
            "schema": {
              "type": "string"
            },
            "description": "Filter calendars by deduplication key",
            "examples": {
              "DeduplicationKeyExample": {
                "value": "user-abcd",
                "summary": "Deduplication Key Example"
              }
            }
          }
        ],
        "tags": [
          "Calendars"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCalendarList"
                }
              }
            },
            "description": "List of calendars"
          }
        }
      },
      "post": {
        "operationId": "Create Calendar",
        "description": "After being created, the calendar will be connected to the specified calendar platform.",
        "summary": "Create a new calendar",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          }
        ],
        "tags": [
          "Calendars"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCalendarRequest"
              },
              "examples": {
                "CreateGoogleCalendar": {
                  "value": {
                    "client_id": "123456789-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com",
                    "client_secret": "GOCSPX-abcdefghijklmnopqrstuvwxyz",
                    "refresh_token": "1//04abcdefghijklmnopqrstuvwxyz",
                    "platform": "google",
                    "metadata": {
                      "tenant_id": "1234567890"
                    },
                    "deduplication_key": "user-abcd"
                  },
                  "summary": "Create Google Calendar",
                  "description": "Example of creating a Google calendar connection"
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Calendar"
                },
                "examples": {
                  "NewlyCreatedCalendar": {
                    "value": {
                      "id": "cal_abcdef1234567890",
                      "platform": "google",
                      "state": "connected",
                      "metadata": {
                        "tenant_id": "1234567890"
                      },
                      "deduplication_key": "user-abcd",
                      "connection_failure_data": null,
                      "created_at": "2025-01-13T10:30:00.123456Z",
                      "updated_at": "2025-01-13T10:30:00.123456Z"
                    },
                    "summary": "Newly Created Calendar",
                    "description": "Example response when a calendar is successfully created"
                  }
                }
              }
            },
            "description": "Calendar created successfully"
          },
          "400": {
            "description": "Invalid input"
          }
        }
      }
    },
    "/api/v1/calendars/{object_id}": {
      "get": {
        "operationId": "Get Calendar",
        "description": "Returns the details of a specific calendar.",
        "summary": "Get calendar details",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Calendar ID",
            "required": true,
            "examples": {
              "CalendarIDExample": {
                "value": "cal_abcdef1234567890",
                "summary": "Calendar ID Example"
              }
            }
          }
        ],
        "tags": [
          "Calendars"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Calendar"
                },
                "examples": {
                  "NewlyCreatedCalendar": {
                    "value": {
                      "id": "cal_abcdef1234567890",
                      "platform": "google",
                      "state": "connected",
                      "metadata": {
                        "tenant_id": "1234567890"
                      },
                      "deduplication_key": "user-abcd",
                      "connection_failure_data": null,
                      "created_at": "2025-01-13T10:30:00.123456Z",
                      "updated_at": "2025-01-13T10:30:00.123456Z"
                    },
                    "summary": "Newly Created Calendar",
                    "description": "Example response when a calendar is successfully created"
                  }
                }
              }
            },
            "description": "Calendar details"
          },
          "404": {
            "description": "Calendar not found"
          }
        }
      },
      "patch": {
        "operationId": "Update Calendar",
        "description": "Updates calendar credentials (client_secret, refresh_token) or metadata.",
        "summary": "Update calendar",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Calendar ID",
            "required": true,
            "examples": {
              "CalendarIDExample": {
                "value": "cal_abcdef1234567890",
                "summary": "Calendar ID Example"
              }
            }
          }
        ],
        "tags": [
          "Calendars"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedPatchCalendarRequest"
              },
              "examples": {
                "UpdateCredentials": {
                  "value": {
                    "client_secret": "GOCSPX-NewClientSecret123",
                    "refresh_token": "1//05o3zfluegTFVCgYICGHGAUSNgF-L9Ir23dcclPCJW7KmzPhsQaNFcAzNwQkV6uM1gIGID8nBelYDPtbIr123"
                  },
                  "summary": "Update credentials",
                  "description": "Example of updating calendar credentials"
                },
                "UpdateMetadataOnly": {
                  "value": {
                    "metadata": {
                      "department": "sales",
                      "team": "frontend",
                      "updated": "true"
                    }
                  },
                  "summary": "Update metadata only",
                  "description": "Example of updating only the calendar metadata"
                },
                "UpdateRefreshTokenOnly": {
                  "value": {
                    "refresh_token": "1//05NewRefreshTokenHere"
                  },
                  "summary": "Update refresh token only",
                  "description": "Example of updating only the refresh token"
                }
              }
            }
          }
        },
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Calendar"
                },
                "examples": {
                  "NewlyCreatedCalendar": {
                    "value": {
                      "id": "cal_abcdef1234567890",
                      "platform": "google",
                      "state": "connected",
                      "metadata": {
                        "tenant_id": "1234567890"
                      },
                      "deduplication_key": "user-abcd",
                      "connection_failure_data": null,
                      "created_at": "2025-01-13T10:30:00.123456Z",
                      "updated_at": "2025-01-13T10:30:00.123456Z"
                    },
                    "summary": "Newly Created Calendar",
                    "description": "Example response when a calendar is successfully created"
                  }
                }
              }
            },
            "description": "Calendar updated successfully"
          },
          "400": {
            "description": "Invalid input"
          },
          "404": {
            "description": "Calendar not found"
          }
        }
      },
      "delete": {
        "operationId": "Delete Calendar",
        "description": "Permanently deletes a calendar and all associated data.",
        "summary": "Delete calendar",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Calendar ID",
            "required": true,
            "examples": {
              "CalendarIDExample": {
                "value": "cal_abcdef1234567890",
                "summary": "Calendar ID Example"
              }
            }
          }
        ],
        "tags": [
          "Calendars"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Calendar deleted successfully"
          },
          "404": {
            "description": "Calendar not found"
          }
        }
      }
    },
    "/api/v1/zoom_oauth_connections": {
      "get": {
        "operationId": "List Zoom OAuth Connections",
        "description": "Returns a list of zoom oauth connections for the authenticated project. Results are paginated using cursor pagination.",
        "summary": "List zoom oauth connections",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "query",
            "name": "cursor",
            "schema": {
              "type": "string"
            },
            "description": "Cursor for pagination"
          }
        ],
        "tags": [
          "Zoom OAuth Connections"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedZoomOAuthConnectionList"
                }
              }
            },
            "description": "List of zoom oauth connections"
          }
        }
      },
      "post": {
        "operationId": "Create Zoom OAuth Connection",
        "description": "After being created, the zoom oauth connection will be used to generate tokens for the user.",
        "summary": "Create a new zoom oauth connection",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          }
        ],
        "tags": [
          "Zoom OAuth Connections"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateZoomOAuthConnectionRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {}
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZoomOAuthConnection"
                },
                "examples": {
                  "NewlyCreatedZoomOAuthConnection": {
                    "value": {
                      "id": "zoc_abcdef1234567890",
                      "zoom_oauth_app": "zoa_abcdef1234567890",
                      "state": "connected",
                      "metadata": {
                        "tenant_id": "1234567890"
                      },
                      "user_id": "user_abcdef1234567890",
                      "account_id": "account_abcdef1234567890",
                      "connection_failure_data": null,
                      "created_at": "2025-01-13T10:30:00.123456Z",
                      "updated_at": "2025-01-13T10:30:00.123456Z"
                    },
                    "summary": "Newly Created Zoom OAuth Connection",
                    "description": "Example response when a zoom oauth connection is successfully created"
                  }
                }
              }
            },
            "description": "Zoom OAuth Connection created successfully"
          },
          "400": {
            "description": "Invalid input"
          }
        }
      }
    },
    "/api/v1/zoom_oauth_connections/{object_id}": {
      "get": {
        "operationId": "Get Zoom OAuth Connection",
        "description": "Gets a zoom oauth connection.",
        "summary": "Get a zoom oauth connection",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Zoom OAuth Connection ID",
            "required": true,
            "examples": {
              "ZoomOAuthConnectionIDExample": {
                "value": "zoc_abcdef1234567890",
                "summary": "Zoom OAuth Connection ID Example"
              }
            }
          }
        ],
        "tags": [
          "Zoom OAuth Connections"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZoomOAuthConnection"
                }
              }
            },
            "description": "Zoom OAuth Connection retrieved successfully"
          },
          "404": {
            "description": "Zoom OAuth Connection not found"
          }
        }
      },
      "delete": {
        "operationId": "Delete Zoom OAuth Connection",
        "description": "Deletes a zoom oauth connection.",
        "summary": "Delete a zoom oauth connection",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "schema": {
              "type": "string",
              "default": "Token YOUR_API_KEY_HERE"
            },
            "description": "API key for authentication",
            "required": true
          },
          {
            "in": "header",
            "name": "Content-Type",
            "schema": {
              "type": "string",
              "default": "application/json"
            },
            "description": "Should always be application/json",
            "required": true
          },
          {
            "in": "path",
            "name": "object_id",
            "schema": {
              "type": "string"
            },
            "description": "Zoom OAuth Connection ID",
            "required": true,
            "examples": {
              "ZoomOAuthConnectionIDExample": {
                "value": "zoc_abcdef1234567890",
                "summary": "Zoom OAuth Connection ID Example"
              }
            }
          }
        ],
        "tags": [
          "Zoom OAuth Connections"
        ],
        "security": [
          {}
        ],
        "responses": {
          "200": {
            "description": "Zoom OAuth Connection deleted successfully"
          },
          "404": {
            "description": "Zoom OAuth Connection not found"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Bot": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "metadata": {
            "type": "object",
            "description": "Metadata associated with the bot",
            "readOnly": true
          },
          "meeting_url": {
            "type": "string",
            "readOnly": true
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BotStateEnum"
              }
            ],
            "readOnly": true
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "sub_type": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "readOnly": true
          },
          "transcription_state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TranscriptionStateEnum"
              }
            ],
            "readOnly": true
          },
          "recording_state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RecordingStateEnum"
              }
            ],
            "readOnly": true
          },
          "join_at": {
            "type": "string",
            "format": "date-time"
          },
          "deduplication_key": {
            "type": "string"
          }
        },
        "required": [
          "deduplication_key",
          "events",
          "id",
          "join_at",
          "meeting_url",
          "metadata",
          "recording_state",
          "state",
          "transcription_state"
        ]
      },
      "BotChatMessageRequestRequest": {
        "type": "object",
        "properties": {
          "to_user_uuid": {
            "type": [
              "string",
              "null"
            ],
            "description": "The UUID of the user to send the message to. Required if 'to' is 'specific_user'.",
            "maxLength": 255
          },
          "to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ToEnum"
              }
            ],
            "default": "everyone",
            "description": "Who to send the message to.\n\n* `everyone` - everyone\n* `specific_user` - specific_user\n* `everyone_but_host` - everyone_but_host"
          },
          "message": {
            "type": "string",
            "minLength": 1,
            "description": "The message text to send. Does not support emojis currently. For Microsoft Teams, you can use basic HTML tags to format the message including <p>, <br>, <b>, <i>, and <a>."
          }
        },
        "required": [
          "message"
        ]
      },
      "BotImageRequest": {
        "type": "object",
        "properties": {
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TypeEnum"
              }
            ],
            "description": "Image content type. Supported formats: PNG and JPEG.\n\n* `image/png` - PNG Image\n* `image/jpeg` - JPEG Image"
          },
          "data": {
            "type": "string",
            "minLength": 1,
            "description": "Base64 encoded image data."
          }
        },
        "required": [
          "data",
          "type"
        ]
      },
      "BotStateEnum": {
        "type": "string",
        "enum": [
          "ready",
          "joining",
          "joined_not_recording",
          "joined_recording",
          "leaving",
          "post_processing",
          "fatal_error",
          "waiting_room",
          "ended",
          "data_deleted",
          "scheduled",
          "staged",
          "joined_recording_paused",
          "joining_breakout_room",
          "leaving_breakout_room",
          "joined_recording_permission_denied"
        ]
      },
      "Calendar": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "platform": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PlatformEnum"
              }
            ],
            "readOnly": true
          },
          "client_id": {
            "type": "string",
            "readOnly": true
          },
          "platform_uuid": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CalendarStateEnum"
              }
            ],
            "readOnly": true
          },
          "metadata": {
            "type": "object",
            "description": "Metadata associated with the calendar",
            "readOnly": true
          },
          "deduplication_key": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true,
            "description": "Optional key for deduplicating calendars"
          },
          "connection_failure_data": {
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "last_successful_sync_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "last_attempted_sync_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "client_id",
          "connection_failure_data",
          "created_at",
          "deduplication_key",
          "id",
          "last_attempted_sync_at",
          "last_successful_sync_at",
          "metadata",
          "platform",
          "platform_uuid",
          "state",
          "updated_at"
        ]
      },
      "CalendarEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "calendar_id": {
            "type": "string"
          },
          "platform_uuid": {
            "type": "string",
            "readOnly": true
          },
          "meeting_url": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "start_time": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "end_time": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "is_deleted": {
            "type": "boolean",
            "readOnly": true
          },
          "attendees": {
            "readOnly": true,
            "nullable": true
          },
          "ical_uid": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "raw": {
            "readOnly": true
          },
          "bots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bot"
            },
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "attendees",
          "bots",
          "calendar_id",
          "created_at",
          "end_time",
          "ical_uid",
          "id",
          "is_deleted",
          "meeting_url",
          "name",
          "platform_uuid",
          "raw",
          "start_time",
          "updated_at"
        ]
      },
      "CalendarStateEnum": {
        "type": "string",
        "enum": [
          "connected",
          "disconnected"
        ]
      },
      "ChatMessage": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "timestamp_ms": {
            "type": "string",
            "readOnly": true
          },
          "timestamp": {
            "type": "integer"
          },
          "to": {
            "type": "string",
            "readOnly": true
          },
          "sender_name": {
            "type": "string"
          },
          "sender_uuid": {
            "type": "string"
          },
          "sender_user_uuid": {
            "type": [
              "string",
              "null"
            ]
          },
          "additional_data": {}
        },
        "required": [
          "additional_data",
          "id",
          "sender_name",
          "sender_user_uuid",
          "sender_uuid",
          "text",
          "timestamp",
          "timestamp_ms",
          "to"
        ]
      },
      "CreateBotRequest": {
        "type": "object",
        "description": "Mixin class providing meeting URL validation for serializers.",
        "properties": {
          "meeting_url": {
            "type": "string",
            "minLength": 1,
            "description": "The URL of the meeting to join, e.g. https://zoom.us/j/123?pwd=456"
          },
          "bot_name": {
            "type": "string",
            "minLength": 1,
            "description": "The name of the bot to create, e.g. 'My Bot'"
          },
          "bot_image": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BotImageRequest"
              }
            ],
            "description": "The image for the bot"
          },
          "metadata": {
            "type": "object",
            "description": "JSON object containing metadata to associate with the bot",
            "examples": [
              {
                "client_id": "abc123",
                "user": "john_doe",
                "purpose": "Weekly team meeting"
              }
            ]
          },
          "bot_chat_message": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BotChatMessageRequestRequest"
              }
            ],
            "description": "The chat message the bot sends after it joins the meeting"
          },
          "join_at": {
            "type": "string",
            "format": "date-time",
            "description": "The time the bot should join the meeting. ISO 8601 format, e.g. 2025-06-13T12:00:00Z"
          },
          "calendar_event_id": {
            "type": "string",
            "minLength": 1,
            "description": "The ID of the calendar event the bot should join."
          },
          "deduplication_key": {
            "type": "string",
            "minLength": 1,
            "description": "Optional key for deduplicating bots. If a bot with this key already exists in a non-terminal state, the new bot will not be created and an error will be returned."
          },
          "webhooks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "description": "The webhook URL (must be HTTPS)"
                },
                "triggers": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "bot.state_change",
                      "transcript.update",
                      "chat_messages.update",
                      "participant_events.join_leave",
                      "calendar.events_update",
                      "calendar.state_change"
                    ]
                  },
                  "description": "List of webhook trigger types",
                  "uniqueItems": true
                }
              },
              "required": [
                "url",
                "triggers"
              ],
              "additionalProperties": false
            },
            "description": "List of webhook subscriptions to create for this bot. Each item should have 'url' and 'triggers' fields."
          },
          "callback_settings": {
            "type": "object",
            "properties": {
              "zoom_tokens_url": {
                "type": "string",
                "description": "URL of an endpoint on your server that returns Zoom authentication tokens the bot will use when it joins the meeting. Our server will make a POST request to this URL with information about the bot and expects a JSON response with the format: {\"zak_token\": \"<zak_token>\", \"join_token\": \"<join_token>\", \"app_privilege_token\": \"<app_privilege_token>\", \"onbehalf_token\": \"<onbehalf_token>\"}. Not every token needs to be provided, i.e. you can reply with {\"zak_token\": \"<zak_token>\"}. For the onbehalf_token attribute, you can send a comma separated list of tokens which will be tried one by one, if the previous one failed."
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Callback urls for the bot to call when it needs to fetch certain data."
          },
          "external_media_storage_settings": {
            "type": "object",
            "properties": {
              "bucket_name": {
                "type": "string",
                "description": "The name of the external storage bucket to use for media files."
              },
              "recording_file_name": {
                "type": "string",
                "description": "Optional custom name for the recording file"
              }
            },
            "required": [
              "bucket_name"
            ],
            "additionalProperties": false,
            "description": "Settings that allow Attendee to upload the recording to an external storage bucket controlled by you. This relieves you from needing to download the recording from Attendee and then upload it to your own storage. To use this feature you must add credentials to your project that provide access to the external storage."
          },
          "voice_agent_settings": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string",
                "description": "URL of a website containing a voice agent that gets the user's responses from the microphone. The bot will load this website and stream its video and audio to the meeting. The audio from the meeting will be sent to website via the microphone. See https://docs.attendee.dev/guides/voiceagents for further details. The video will be displayed through the bot's webcam. To display the video through screenshare, use the screenshare_url parameter instead."
              },
              "screenshare_url": {
                "type": "string",
                "description": "Behaves the same as url, but the video will be displayed through screenshare instead of the bot's webcam. Currently, you cannot provide both url and screenshare_url."
              },
              "reserve_resources": {
                "type": "boolean",
                "description": "If you want to start a voice agent or stream a webpage mid-meeting, but not at the start of the meeting, set this to true. This will reserve resources for the voice agent. You cannot start a voice agent mid-meeting if this is not set to true.",
                "default": false
              }
            },
            "additionalProperties": false,
            "description": "Settings for the voice agent that the bot should load."
          },
          "transcription_settings": {
            "type": "object",
            "properties": {
              "deepgram": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string",
                    "description": "The language code for transcription. Defaults to 'multi' if not specified, which selects the language automatically and can change the detected language in the middle of the audio. See here for available languages: https://developers.deepgram.com/docs/models-languages-overview."
                  },
                  "detect_language": {
                    "type": "boolean",
                    "description": "Whether to automatically detect the spoken language. Can only detect a single language for the entire audio. This is only supported for an older model and is not recommended. Please use language='multi' instead."
                  },
                  "callback": {
                    "type": "string",
                    "description": "The URL to send the transcriptions to. If used, the transcriptions will be sent directly from Deepgram to your server so you will not be able to access them via the Attendee API. See here for details: https://developers.deepgram.com/docs/callback"
                  },
                  "keyterms": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Improve recall of key terms or phrases in the transcript. This feature is only available for the nova-3 model in english, so you must set the language to 'en'. See here for details: https://developers.deepgram.com/docs/keyterm"
                  },
                  "keywords": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Improve recall of key terms or phrases in the transcript. This feature is only available for the nova-2 model. See here for details: https://developers.deepgram.com/docs/keywords"
                  },
                  "model": {
                    "type": "string",
                    "description": "The model to use for transcription. Defaults to 'nova-3' if not specified, which is the recommended model for most use cases. See here for details: https://developers.deepgram.com/docs/models-languages-overview"
                  },
                  "redact": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "pci",
                        "pii",
                        "numbers"
                      ]
                    },
                    "uniqueItems": true,
                    "description": "Array of redaction types to apply to transcription. Automatically removes or masks sensitive information like PII, PCI data, and numbers from transcripts. See here for details: https://developers.deepgram.com/docs/redaction"
                  },
                  "replace": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Array of terms to find and replace in the transcript. Each string should be in the format 'term_to_find:replacement_term' (e.g., 'kpis:Key Performance Indicators'). See here for details: https://developers.deepgram.com/docs/find-and-replace"
                  },
                  "use_eu_server": {
                    "type": "boolean",
                    "description": "Whether to use the EU server for transcription. Defaults to false."
                  }
                },
                "additionalProperties": false
              },
              "gladia": {
                "type": "object",
                "properties": {
                  "code_switching_languages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The languages to transcribe the meeting in when using code switching. See here for available languages: https://docs.gladia.io/chapters/limits-and-specifications/languages"
                  },
                  "enable_code_switching": {
                    "type": "boolean",
                    "description": "Whether to use code switching to transcribe the meeting in multiple languages."
                  }
                },
                "additionalProperties": false
              },
              "meeting_closed_captions": {
                "type": "object",
                "properties": {
                  "google_meet_language": {
                    "type": "string",
                    "description": "The language code for Google Meet closed captions (e.g. 'en-US'). See here for available languages and codes: https://docs.google.com/spreadsheets/d/1MN44lRrEBaosmVI9rtTzKMii86zGgDwEwg4LSj-SjiE"
                  },
                  "teams_language": {
                    "type": "string",
                    "description": "The language code for Teams closed captions (e.g. 'en-us'). This will change the closed captions language for everyone in the meeting, not just the bot. See here for available languages and codes: https://docs.google.com/spreadsheets/d/1F-1iLJ_4btUZJkZcD2m5sF3loqGbB0vTzgOubwQTb5o/edit?usp=sharing"
                  },
                  "teams_language_enforcement_duration_seconds": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Number of seconds after the bot sets the Teams closed captions language during which it will change the language back if another participant changes it. This is needed because in Teams the closed captions language is a single setting shared by everyone in the meeting rather than set per participant, so any participant can change the language the bot is transcribing in. Only relevant if teams_language is set. Defaults to 0, meaning the language is never changed back."
                  },
                  "zoom_language": {
                    "type": "string",
                    "enum": [
                      "Arabic",
                      "Cantonese",
                      "Chinese (Simplified)",
                      "Czech",
                      "Danish",
                      "Dutch",
                      "English",
                      "Estonian",
                      "Finnish",
                      "French",
                      "French (Canada)",
                      "German",
                      "Hebrew",
                      "Hindi",
                      "Hungarian",
                      "Indonesian",
                      "Italian",
                      "Japanese",
                      "Korean",
                      "Malay",
                      "Persian",
                      "Polish",
                      "Portuguese",
                      "Romanian",
                      "Russian",
                      "Spanish",
                      "Swedish",
                      "Tagalog",
                      "Tamil",
                      "Telugu",
                      "Thai",
                      "Turkish",
                      "Ukrainian",
                      "Vietnamese"
                    ],
                    "description": "The language to use for Zoom closed captions. (e.g. 'Spanish'). This will change the closed captions language for everyone in the meeting, not just the bot."
                  },
                  "merge_consecutive_captions": {
                    "type": "boolean",
                    "description": "The captions from Google Meet can end in the middle of a sentence, which is not ideal. This setting deals with that by merging consecutive captions for a given speaker that occur close together in time. Turned off by default."
                  }
                },
                "additionalProperties": false
              },
              "openai": {
                "type": "object",
                "properties": {
                  "model": {
                    "type": "string",
                    "enum": [
                      "gpt-4o-transcribe",
                      "gpt-4o-mini-transcribe",
                      "gpt-4o-transcribe-diarize",
                      "gpt-transcribe"
                    ],
                    "description": "The OpenAI model to use for transcription"
                  },
                  "prompt": {
                    "type": "string",
                    "description": "Optional prompt to use for the OpenAI transcription"
                  },
                  "language": {
                    "type": "string",
                    "description": "The language to use for transcription. See here in the 'Set 1' column for available language codes: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes. This parameter is optional but if you know the language in advance, setting it will improve accuracy."
                  },
                  "response_format": {
                    "type": "string",
                    "enum": [
                      "json",
                      "diarized_json"
                    ],
                    "description": "The format of the transcription response. Only applicable for gpt-4o-transcribe-diarize model. Defaults to diarized_json when using gpt-4o-transcribe-diarize."
                  },
                  "chunking_strategy": {
                    "oneOf": [
                      {
                        "type": "string",
                        "enum": [
                          "auto"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "server_vad"
                            ],
                            "description": "Must be set to server_vad to enable manual chunking using server side VAD."
                          },
                          "prefix_padding_ms": {
                            "type": "integer",
                            "description": "Amount of audio to include before the VAD detected speech (in milliseconds). Defaults to 300."
                          },
                          "silence_duration_ms": {
                            "type": "integer",
                            "description": "Duration of silence to detect speech stop (in milliseconds). With shorter values the model will respond more quickly, but may jump in on short pauses from the user. Defaults to 200."
                          },
                          "threshold": {
                            "type": "number",
                            "description": "Sensitivity threshold (0.0 to 1.0) for voice activity detection. A higher threshold will require louder audio to activate the model, and thus might perform better in noisy environments. Defaults to 0.5."
                          }
                        },
                        "required": [
                          "type"
                        ],
                        "additionalProperties": false
                      }
                    ],
                    "description": "The chunking strategy for transcription. Only applicable for gpt-4o-transcribe-diarize model. Defaults to auto when using gpt-4o-transcribe-diarize. Can be 'auto' or a server_vad object with optional prefix_padding_ms, silence_duration_ms, and threshold parameters."
                  }
                },
                "required": [
                  "model"
                ],
                "additionalProperties": false
              },
              "assembly_ai": {
                "type": "object",
                "properties": {
                  "language_code": {
                    "type": "string",
                    "description": "The language code to use for transcription. See here for available languages: https://www.assemblyai.com/docs/speech-to-text/pre-recorded-audio/supported-languages"
                  },
                  "language_detection": {
                    "type": "boolean",
                    "description": "Whether to automatically detect the spoken language."
                  },
                  "keyterms_prompt": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "List of words or phrases to boost in the transcript. Only supported for when using the 'slam-1' speech model. See AssemblyAI docs for details."
                  },
                  "custom_spelling": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "from": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "to": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "from",
                        "to"
                      ],
                      "additionalProperties": false
                    },
                    "description": "List of {from: [...], to: ...} entries that deterministically replace known misspellings with the correct spelling at the engine level, preserving word-level timestamps. See AssemblyAI docs for details."
                  },
                  "speech_model": {
                    "type": "string",
                    "description": "The speech model to use for transcription. See AssemblyAI docs for details. This parameter is deprecated, use the speech_models param instead."
                  },
                  "speech_models": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "uniqueItems": true,
                    "description": "The speech models to use for transcription in order of preference. Defaults to ['universal-3-5-pro', 'universal-2']. See AssemblyAI docs for details."
                  },
                  "speaker_labels": {
                    "type": "boolean",
                    "description": "Whether to enable AssemblyAI's ML-based diarization. Only needed if multiple people are speaking into a single microphone. Defaults to false."
                  },
                  "use_eu_server": {
                    "type": "boolean",
                    "description": "Whether to use the EU server for transcription. Defaults to false."
                  },
                  "language_detection_options": {
                    "type": "object",
                    "properties": {
                      "expected_languages": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "fallback_language": {
                        "type": "string"
                      }
                    },
                    "description": "Options for controlling the automatic language detection. See AssemblyAI docs for details.",
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              },
              "sarvam": {
                "type": "object",
                "properties": {
                  "model": {
                    "type": "string",
                    "enum": [
                      "saarika:v2",
                      "saarika:v2.5"
                    ],
                    "description": "The Sarvam model to use for transcription"
                  },
                  "language_code": {
                    "type": "string",
                    "enum": [
                      "unknown",
                      "hi-IN",
                      "bn-IN",
                      "kn-IN",
                      "ml-IN",
                      "mr-IN",
                      "od-IN",
                      "pa-IN",
                      "ta-IN",
                      "te-IN",
                      "en-IN",
                      "gu-IN"
                    ],
                    "description": "The language code to use for transcription"
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "elevenlabs": {
                "type": "object",
                "properties": {
                  "model_id": {
                    "type": "string",
                    "description": "The ElevenLabs model to use for transcription",
                    "enum": [
                      "scribe_v1",
                      "scribe_v1_experimental"
                    ]
                  },
                  "language_code": {
                    "type": "string",
                    "description": "An ISO-639-1 or ISO-639-3 language_code corresponding to the language of the audio file."
                  },
                  "tag_audio_events": {
                    "type": "boolean",
                    "description": "Whether to tag audio events like 'laughter' in the transcription."
                  }
                },
                "required": [
                  "model_id"
                ],
                "additionalProperties": false
              },
              "kyutai": {
                "type": "object",
                "properties": {
                  "server_url": {
                    "type": "string",
                    "description": "The WebSocket URL of the Kyutai STT server (e.g., 'wss://your-domain.com/api/asr-streaming'). Must start with ws:// or wss://. If not provided, will use the server_url from project credentials."
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "custom_async": {
                "type": "object",
                "description": "Custom self-hosted transcription service with async processing. Additional properties will be sent as form data in the request. Only supported if self-hosting Attendee.",
                "required": [],
                "additionalProperties": true
              },
              "custom_async_v2": {
                "type": "object",
                "properties": {
                  "headers": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Optional headers to include in the request to the custom transcription service."
                  },
                  "form_data": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Optional form data to include in the request to the custom transcription service."
                  }
                },
                "description": "Custom self-hosted transcription service with async processing. Use `headers` for HTTP request headers (e.g. auth tokens) and `form_data` for multipart form fields sent alongside the audio file. Only supported if self-hosting Attendee.",
                "required": [],
                "additionalProperties": true
              }
            },
            "required": [],
            "description": "The transcription settings for the bot, e.g. {'deepgram': {'language': 'en'}}"
          },
          "websocket_settings": {
            "type": "object",
            "properties": {
              "audio": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL of the websocket to use for receiving meeting audio in real time and having the bot output audio in real time. It must start with wss://. See https://docs.attendee.dev/guides/realtimeaudio for details on how to receive and send audio through the websocket connection."
                  },
                  "sample_rate": {
                    "type": "integer",
                    "enum": [
                      8000,
                      16000,
                      24000
                    ],
                    "default": 16000,
                    "description": "The sample rate of the audio to send. Can be 8000, 16000, or 24000. Defaults to 16000."
                  }
                },
                "required": [
                  "url"
                ],
                "additionalProperties": false
              },
              "per_participant_audio": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL of the websocket to use for receiving per participant meeting audio in real time. It must start with wss://. See https://docs.attendee.dev/guides/realtimeaudio#per-participant-audio-streaming for details on how to receive per participant audio through the websocket connection."
                  },
                  "sample_rate": {
                    "type": "integer",
                    "enum": [
                      8000,
                      16000
                    ],
                    "default": 16000,
                    "description": "The sample rate of the per participant audio to send. Can be 8000, 16000. Defaults to 16000."
                  }
                },
                "required": [
                  "url"
                ],
                "additionalProperties": false
              },
              "per_participant_video": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL of the websocket to use for receiving per-participant video and screenshare in real time. It must start with wss://. See https://docs.attendee.dev/guides/realtimevideo for details on how to receive video through the websocket connection."
                  },
                  "webcam_resolution": {
                    "type": "string",
                    "enum": [
                      "none",
                      "360p",
                      "720p",
                      "1080p"
                    ],
                    "default": "360p",
                    "description": "Resolution for per-participant webcam video. 'none' disables webcam streaming. Framerate and JPEG quality are determined by resolution: 360p (2fps, quality 70), 720p (1fps, quality 60), 1080p (1fps, quality 50). Defaults to '360p'."
                  },
                  "screenshare_resolution": {
                    "type": "string",
                    "enum": [
                      "none",
                      "360p",
                      "720p",
                      "1080p"
                    ],
                    "default": "360p",
                    "description": "Resolution for per-participant screenshare video. 'none' disables screenshare streaming. Framerate and JPEG quality are determined by resolution: 360p (2fps, quality 70), 720p (1fps, quality 60), 1080p (1fps, quality 50). Defaults to '360p'."
                  }
                }
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "The websocket settings for the bot, e.g. {'audio': {'url': 'wss://example.com/audio', 'sample_rate': 16000}}"
          },
          "rtmp_settings": {
            "type": "object",
            "properties": {
              "destination_url": {
                "type": "string",
                "description": "The URL of the RTMP server to send the stream to"
              },
              "stream_key": {
                "type": "string",
                "description": "The stream key to use for the RTMP server"
              }
            },
            "required": [
              "destination_url",
              "stream_key"
            ],
            "description": "RTMP server to stream to, e.g. {'destination_url': 'rtmp://global-live.mux.com:5222/app', 'stream_key': 'xxxx'}."
          },
          "recording_settings": {
            "type": "object",
            "properties": {
              "format": {
                "type": "string",
                "description": "The format of the recording to save. The supported formats are 'mp4', 'mp3' and 'none'. Defaults to 'mp4'."
              },
              "view": {
                "type": "string",
                "description": "The view to use for the recording. The supported views are 'speaker_view', 'gallery_view' and 'speaker_view_no_sidebar'."
              },
              "resolution": {
                "type": "string",
                "description": "The resolution to use for the recording. The supported resolutions are '1080p' and '720p'. Defaults to '1080p'.",
                "enum": [
                  "1080p",
                  "720p"
                ]
              },
              "record_chat_messages_when_paused": {
                "type": "boolean",
                "description": "Whether to record chat messages even when the recording is paused. Defaults to false.",
                "default": false
              },
              "reserve_additional_storage": {
                "type": "boolean",
                "description": "Whether to reserve extra space to store the recording. Only needed when the bot will record video for longer than 6 hours. Defaults to false.",
                "default": false
              }
            },
            "additionalProperties": false,
            "required": [],
            "default": {
              "format": "mp4",
              "view": "speaker_view",
              "resolution": "1080p",
              "record_chat_messages_when_paused": false,
              "reserve_additional_storage": false
            },
            "description": "The settings for the bot's recording."
          },
          "google_meet_settings": {
            "type": "object",
            "properties": {
              "use_login": {
                "type": "boolean",
                "description": "Whether to use Google Meet bot login credentials to sign in before joining the meeting. Requires Google Meet bot login credentials to be set for the project.",
                "default": false
              },
              "login_mode": {
                "type": "string",
                "enum": [
                  "always",
                  "only_if_required"
                ],
                "description": "The mode to use for the Google Meet bot login. 'always' means the bot will always login, 'only_if_required' means the bot will only login if the meeting requires authentication.",
                "default": "always"
              },
              "ui_interaction_mode": {
                "type": "string",
                "enum": [
                  "robotic",
                  "humanized"
                ],
                "description": "The UI interaction mode for the Google Meet bot. 'humanized' performs more human-like interactions to evade bot detection, but the bot will take about 10 seconds longer to join the meeting.",
                "default": "humanized"
              },
              "login_group_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Optional bot login group name to use for Google Meet signed-in bot selection. If no group is specified, the oldest Google Meet group will be selected.",
                "default": null
              }
            },
            "required": [],
            "additionalProperties": false,
            "default": {
              "use_login": false,
              "login_mode": "always",
              "login_group_name": null
            },
            "description": "The Google Meet-specific settings for the bot."
          },
          "teams_settings": {
            "type": "object",
            "properties": {
              "use_login": {
                "type": "boolean",
                "description": "Whether to use Teams bot login credentials to sign in before joining the meeting. Requires Teams bot login credentials to be set for the project.",
                "default": false
              },
              "login_mode": {
                "type": "string",
                "enum": [
                  "always",
                  "only_if_required"
                ],
                "description": "The mode to use for the Teams bot login. 'always' means the bot will always login, 'only_if_required' means the bot will only login if the meeting requires authentication.",
                "default": "always"
              },
              "login_group_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Optional bot login group name to use for Teams signed-in bot selection. If no group is specified, the oldest Teams group will be selected.",
                "default": null
              }
            },
            "required": [],
            "additionalProperties": false,
            "default": {
              "use_login": false,
              "login_mode": "always",
              "login_group_name": null
            },
            "description": "The Microsoft Teams-specific settings for the bot."
          },
          "zoom_settings": {
            "type": "object",
            "properties": {
              "sdk": {
                "type": "string",
                "enum": [
                  "web",
                  "native"
                ],
                "description": "The Zoom SDK to use for the bot. Use 'web' when you need closed caption based transcription.",
                "default": "native"
              },
              "meeting_settings": {
                "type": "object",
                "properties": {
                  "allow_participants_to_unmute_self": {
                    "type": "boolean"
                  },
                  "allow_participants_to_share_whiteboard": {
                    "type": "boolean"
                  },
                  "allow_participants_to_request_cloud_recording": {
                    "type": "boolean"
                  },
                  "allow_participants_to_request_local_recording": {
                    "type": "boolean"
                  },
                  "allow_participants_to_share_screen": {
                    "type": "boolean"
                  },
                  "allow_participants_to_chat": {
                    "type": "boolean"
                  },
                  "enable_focus_mode": {
                    "type": "boolean"
                  }
                },
                "required": [],
                "additionalProperties": false,
                "description": "Settings for various aspects of the Zoom Meeting. To use these settings, the bot must have host privileges."
              }
            },
            "required": [],
            "additionalProperties": false,
            "default": {
              "sdk": "native"
            },
            "description": "The Zoom-specific settings for the bot."
          },
          "debug_settings": {
            "type": "object",
            "properties": {
              "create_debug_recording": {
                "type": "boolean",
                "description": "Whether to generate a recording of the attempt to join the meeting. Used for debugging."
              }
            },
            "required": [],
            "default": {
              "create_debug_recording": false
            },
            "description": "The debug settings for the bot, e.g. {'create_debug_recording': True}."
          },
          "automatic_leave_settings": {
            "type": "object",
            "properties": {
              "silence_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds of continuous silence after which the bot should leave",
                "default": 600
              },
              "silence_activate_after_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait before activating the silence timeout",
                "default": 1200
              },
              "only_participant_in_meeting_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait before leaving if bot becomes the only participant in the meeting because everyone else left.",
                "default": 60
              },
              "wait_for_host_to_start_meeting_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait for the host to start the meeting",
                "default": 600
              },
              "waiting_room_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait before leaving if the bot is in the waiting room",
                "default": 900
              },
              "max_uptime_seconds": {
                "type": "integer",
                "description": "Maximum number of seconds that the bot should be running before automatically leaving (infinity)",
                "default": null
              },
              "enable_closed_captions_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait before leaving if bot could not enable closed captions (infinity by default). Only relevant if the bot is transcribing via closed captions. Currently only supports leaving immediately.",
                "default": null
              },
              "authorized_user_not_in_meeting_timeout_seconds": {
                "type": "integer",
                "description": "Number of seconds to wait before leaving if the authorized user is not in the meeting. Only relevant if this is a Zoom bot using the on behalf of token.",
                "default": 600
              },
              "bot_keywords": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "List of keywords to identify bot participants. A participant is considered a bot if any word in their name matches a keyword. Words are found by splitting on spaces, hyphens, and underscores, and the comparison is case-insensitive. Bot participants are excluded when determining if the bot is the only participant in the meeting.",
                "default": null
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "bot_name",
          "meeting_url"
        ]
      },
      "CreateCalendarRequest": {
        "type": "object",
        "properties": {
          "platform_uuid": {
            "type": "string",
            "minLength": 1,
            "description": "The UUID of the calendar on the calendar platform. Specify only for non-primary calendars."
          },
          "client_id": {
            "type": "string",
            "minLength": 1,
            "description": "The client ID for the calendar platform authentication"
          },
          "client_secret": {
            "type": "string",
            "minLength": 1,
            "description": "The client secret for the calendar platform authentication"
          },
          "refresh_token": {
            "type": "string",
            "minLength": 1,
            "description": "The refresh token for accessing the calendar platform"
          },
          "platform": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PlatformEnum"
              }
            ],
            "description": "The calendar platform (google or microsoft)\n\n* `google` - Google\n* `microsoft` - Microsoft"
          },
          "metadata": {
            "description": "JSON object containing metadata to associate with the calendar"
          },
          "deduplication_key": {
            "type": "string",
            "minLength": 1,
            "description": "Optional key for deduplicating calendars. If a calendar with this key already exists in the project, the new calendar will not be created and an error will be returned."
          }
        },
        "required": [
          "client_id",
          "client_secret",
          "platform",
          "refresh_token"
        ]
      },
      "OutputVideoRequestRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "URL of the video to output. Must be a valid URL to an mp4 file and start with https://."
          },
          "loop": {
            "type": "boolean",
            "default": false,
            "description": "Whether to loop the video. Defaults to false."
          },
          "mute_video": {
            "type": "boolean",
            "default": false,
            "description": "Whether to mute the video's audio track. Main purpose is to play a video as the bot's webcam while keeping the bot's microphone muted. Defaults to false."
          }
        },
        "required": [
          "url"
        ]
      },
      "PaginatedBotList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bot"
            }
          }
        }
      },
      "CreateZoomOAuthConnectionRequest": {
        "type": "object",
        "properties": {
          "zoom_oauth_app_id": {
            "type": "string",
            "minLength": 1,
            "description": "The Zoom Oauth App the connection is for"
          },
          "authorization_code": {
            "type": "string",
            "minLength": 1,
            "description": "The authorization code received from Zoom during the OAuth flow"
          },
          "redirect_uri": {
            "type": "string",
            "minLength": 1,
            "description": "The redirect URI used to obtain the authorization code"
          },
          "is_local_recording_token_supported": {
            "type": "boolean",
            "default": true,
            "description": "Whether the Zoom OAuth Connection supports generating local recording tokens"
          },
          "is_onbehalf_token_supported": {
            "type": "boolean",
            "default": false,
            "description": "Whether the Zoom OAuth Connection supports generating onbehalf tokens"
          },
          "metadata": {
            "description": "JSON object containing metadata to associate with the Zoom OAuth Connection"
          }
        },
        "required": [
          "authorization_code",
          "redirect_uri"
        ]
      },
      "PaginatedCalendarEventList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CalendarEvent"
            }
          }
        }
      },
      "PaginatedCalendarList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Calendar"
            }
          }
        }
      },
      "PaginatedChatMessageList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChatMessage"
            }
          }
        }
      },
      "PaginatedParticipantEventList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParticipantEvent"
            }
          }
        }
      },
      "PaginatedParticipantList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Participant"
            }
          }
        }
      },
      "PaginatedZoomOAuthConnectionList": {
        "type": "object",
        "required": [
          "results"
        ],
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cD00ODY%3D\""
            ]
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "examples": [
              "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3"
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoomOAuthConnection"
            }
          }
        }
      },
      "Participant": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string"
          },
          "user_uuid": {
            "type": [
              "string",
              "null"
            ]
          },
          "is_host": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "is_host",
          "name",
          "user_uuid",
          "uuid"
        ]
      },
      "ParticipantEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "participant_name": {
            "type": "string"
          },
          "participant_uuid": {
            "type": "string"
          },
          "participant_user_uuid": {
            "type": [
              "string",
              "null"
            ]
          },
          "participant_is_host": {
            "type": "boolean"
          },
          "event_type": {
            "type": "string",
            "readOnly": true
          },
          "event_data": {},
          "timestamp_ms": {
            "type": "integer"
          }
        },
        "required": [
          "event_data",
          "event_type",
          "id",
          "participant_name",
          "participant_user_uuid",
          "participant_uuid",
          "participant_is_host",
          "timestamp_ms"
        ]
      },
      "PatchedPatchBotRequest": {
        "type": "object",
        "description": "Mixin class providing validation for common attributes used in both patching and creating bots.",
        "properties": {
          "join_at": {
            "type": "string",
            "format": "date-time",
            "description": "The time the bot should join the meeting. ISO 8601 format, e.g. 2025-06-13T12:00:00Z"
          },
          "meeting_url": {
            "type": "string",
            "minLength": 1,
            "description": "The URL of the meeting to join, e.g. https://zoom.us/j/123?pwd=456"
          },
          "metadata": {
            "type": "object",
            "description": "JSON object containing metadata to associate with the bot"
          },
          "bot_name": {
            "type": "string",
            "minLength": 1,
            "description": "The name of the bot, e.g. 'My Bot'"
          },
          "bot_image": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BotImageRequest"
              }
            ],
            "description": "The image for the bot"
          },
          "recording_settings": {
            "type": "object",
            "properties": {
              "format": {
                "type": "string",
                "description": "The format of the recording to save. The supported formats are 'mp4', 'mp3' and 'none'. Defaults to 'mp4'."
              },
              "view": {
                "type": "string",
                "description": "The view to use for the recording. The supported views are 'speaker_view', 'gallery_view' and 'speaker_view_no_sidebar'."
              },
              "resolution": {
                "type": "string",
                "description": "The resolution to use for the recording. The supported resolutions are '1080p' and '720p'. Defaults to '1080p'.",
                "enum": [
                  "1080p",
                  "720p"
                ]
              },
              "record_chat_messages_when_paused": {
                "type": "boolean",
                "description": "Whether to record chat messages even when the recording is paused. Defaults to false.",
                "default": false
              },
              "record_async_transcription_audio_chunks": {
                "type": "boolean",
                "description": "Whether to record additional audio data which is needed for creating async (post-meeting) transcriptions. Defaults to false.",
                "default": false
              },
              "reserve_additional_storage": {
                "type": "boolean",
                "description": "Whether to reserve extra space to store the recording. Only needed when the bot will record video for longer than 6 hours. Defaults to false.",
                "default": false
              }
            },
            "additionalProperties": false,
            "required": [],
            "description": "The settings for the bot's recording. The settings specified here will completely replace the existing settings."
          }
        }
      },
      "PatchedPatchBotVoiceAgentSettingsRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "URL of a website containing a voice agent that gets the user's responses from the microphone. The bot will load this website and stream its video and audio to the meeting. The audio from the meeting will be sent to website via the microphone. See https://docs.attendee.dev/guides/voiceagents for further details. The video will be displayed through the bot's webcam. To display the video through screenshare, use the screenshare_url parameter instead. Set to \"\" to turn off."
          },
          "screenshare_url": {
            "type": "string",
            "description": "Behaves the same as url, but the video will be displayed through screenshare instead of the bot's webcam. Currently, you cannot provide both url and screenshare_url. Set to \"\" to turn off."
          }
        }
      },
      "PatchedPatchCalendarRequest": {
        "type": "object",
        "properties": {
          "client_secret": {
            "type": "string",
            "minLength": 1,
            "description": "The client secret for the calendar platform authentication"
          },
          "refresh_token": {
            "type": "string",
            "minLength": 1,
            "description": "The refresh token for accessing the calendar platform"
          },
          "metadata": {
            "description": "JSON object containing metadata to associate with the calendar"
          }
        }
      },
      "PlatformEnum": {
        "enum": [
          "google",
          "microsoft"
        ],
        "type": "string",
        "description": "* `google` - Google\n* `microsoft` - Microsoft"
      },
      "Recording": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "readOnly": true
          },
          "start_timestamp_ms": {
            "type": "integer"
          }
        },
        "required": [
          "start_timestamp_ms",
          "url"
        ]
      },
      "RecordingStateEnum": {
        "type": "string",
        "enum": [
          "not_started",
          "in_progress",
          "complete",
          "failed",
          "paused"
        ]
      },
      "SpeechRequest": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1
          },
          "text_to_speech_settings": {
            "type": "object",
            "properties": {
              "google": {
                "type": "object",
                "properties": {
                  "voice_language_code": {
                    "type": "string",
                    "description": "The voice language code (e.g. 'en-US'). See https://cloud.google.com/text-to-speech/docs/voices for a list of available language codes and voices."
                  },
                  "voice_name": {
                    "type": "string",
                    "description": "The name of the voice to use (e.g. 'en-US-Casual-K')"
                  }
                }
              }
            },
            "required": [
              "google"
            ]
          }
        },
        "required": [
          "text",
          "text_to_speech_settings"
        ]
      },
      "ToEnum": {
        "enum": [
          "everyone",
          "specific_user",
          "everyone_but_host"
        ],
        "type": "string",
        "description": "* `everyone` - everyone\n* `specific_user` - specific_user\n* `everyone_but_host` - everyone_but_host"
      },
      "TranscriptUtterance": {
        "type": "object",
        "properties": {
          "speaker_name": {
            "type": "string"
          },
          "speaker_uuid": {
            "type": "string"
          },
          "speaker_user_uuid": {
            "type": [
              "string",
              "null"
            ]
          },
          "speaker_is_host": {
            "type": "boolean"
          },
          "timestamp_ms": {
            "type": "integer"
          },
          "duration_ms": {
            "type": "integer"
          },
          "transcription": {}
        },
        "required": [
          "duration_ms",
          "speaker_name",
          "speaker_user_uuid",
          "speaker_uuid",
          "speaker_is_host",
          "timestamp_ms",
          "transcription"
        ]
      },
      "TranscriptionStateEnum": {
        "type": "string",
        "enum": [
          "not_started",
          "in_progress",
          "complete",
          "failed"
        ]
      },
      "TypeEnum": {
        "enum": [
          "image/png",
          "image/jpeg"
        ],
        "type": "string",
        "description": "* `image/png` - PNG Image\n* `image/jpeg` - JPEG Image"
      },
      "ZoomOAuthConnection": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "zoom_oauth_app_id": {
            "type": "string"
          },
          "user_id": {
            "type": "string",
            "readOnly": true
          },
          "account_id": {
            "type": "string",
            "readOnly": true
          },
          "state": {
            "allOf": [
              {
                "$ref": "#/components/schemas/StateFeeEnum"
              }
            ],
            "readOnly": true
          },
          "metadata": {
            "type": "object",
            "description": "Metadata associated with the zoom oauth connection",
            "readOnly": true
          },
          "is_local_recording_token_supported": {
            "type": "boolean"
          },
          "is_onbehalf_token_supported": {
            "type": "boolean"
          },
          "connection_failure_data": {
            "readOnly": true,
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "last_successful_sync_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "last_attempted_sync_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "account_id",
          "connection_failure_data",
          "created_at",
          "id",
          "is_local_recording_token_supported",
          "is_onbehalf_token_supported",
          "last_attempted_sync_at",
          "last_successful_sync_at",
          "metadata",
          "state",
          "updated_at",
          "user_id",
          "zoom_oauth_app_id"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://app.attendee.dev",
      "description": "Production server"
    }
  ],
  "tags": [
    {
      "name": "Bots",
      "description": "Bot management endpoints"
    }
  ],
  "x-ext-urls": {}
}