---
title: "Join Meeting"
method: POST
path: "/bots"
tags: ["bots"]
---

# Join Meeting

`POST /bots`

Create and deploy a speaking bot in a meeting.

Launches an AI-powered bot that joins a video meeting through MeetingBaas
and processes audio using Pipecat's voice AI framework.

## Request body

- BotRequest — Request model for creating a speaking bot in a meeting.
  - `meeting_url` string, required — URL of the Google Meet, Zoom or Microsoft Teams meeting to join
  - `bot_name` string — Name to display for the bot in the meeting
  - `personas` string[], nullable — List of persona names to use. The first available will be selected.
  - `bot_image` string, nullable
  - `entry_message` string, nullable
  - `extra` object, nullable
  - `enable_tools` boolean
  - `prompt` string, nullable
  - `websocket_url` string, nullable — Optional public WebSocket base URL override, e.g. wss://bot.example.com
  - `turn_config` TurnConfig — Per-bot voice-activity / turn-taking tuning. All fields optional; unset fields fall back to the VAD_* env vars, then pipecat defaults. Human-facing bots want snappy turn-taking (low stop_secs); bot-vs-bot meetings want patience (higher stop_secs and start_secs) so the bots stop barging in on each other.
    - `confidence` number, nullable — VAD speech confidence threshold
    - `start_secs` number, nullable — Sustained speech (seconds) before a turn registers
    - `stop_secs` number, nullable — Silence (seconds) before the bot considers the speaker done and replies
    - `min_volume` number, nullable — Minimum input volume for VAD
  - `prompt_data_sources` PromptDataSource[], nullable — External text or URL data sources to append to the bot prompt
    - `name` string — Human-readable source name shown inside the prompt context block
    - `type` 'text' | 'url', required — Whether to load inline text or fetch an external HTTP(S) URL
    - `text` string, nullable — Inline context. Required when type is text.
    - `url` string, nullable — HTTP(S) URL to fetch. Required when type is url.
    - `headers` object, nullable — Optional HTTP headers for URL sources. Avoid request-specific secrets unless needed.
    - `token_limit` integer, nullable — Optional per-source token cap before the request-level cap is applied
  - `prompt_data_token_limit` integer — Approximate total token cap for loaded prompt_data_sources. 0 disables loading.
  - `mcp` MCPConfig — MCP server metadata and optional live connection details.
    - `servers` MCPServerConfig[] — MCP servers to document and optionally connect for tool calls
      - `name` string, required
      - `enabled` boolean — Whether this server may be used. Disabled servers are documented but not connected.
      - `url` string, nullable — Remote MCP server URL. Required for http, streamable_http, and sse transports.
      - `headers` object, nullable — Optional HTTP headers for remote MCP servers. Use only when a server requires them.
      - `transport` 'http' | 'streamable_http' | 'sse', nullable — Remote MCP transport. Omit for metadata-only servers that cannot execute tools.
      - `tools` string[], nullable — Known tool names exposed by this MCP server
      - `tool_allowlist` string[], nullable — Optional allowlist of MCP tool names this bot may call from this server.
      - `timeout_seconds` number, nullable — Optional per-server connection/tool timeout in seconds.
      - `instructions` string, nullable — Operator instructions or constraints for this MCP server
    - `instructions` string, nullable — Global MCP usage instructions for the bot
  - `mcp_profile` 'professional' | 'personal' | 'all', nullable — Optional trusted local mcpproxy group preset. 'professional' connects to MCP_PROXY_PROFESSIONAL_URL or http://127.0.0.1:8111/mcp; 'personal' connects to MCP_PROXY_PERSONAL_URL or http://127.0.0.1:8110/mcp; 'all' connects to MCP_PROXY_ALL_URL or http://127.0.0.1:8109/mcp. The preset is merged with explicit mcp servers when both are supplied.
  - `mcp_profile_tool_access` 'read_only' | 'read_write' — Tool exposure for mcp_profile presets. 'read_only' exposes retrieve_tools, call_tool_read, read_cache, and set_profile. 'read_write' also exposes call_tool_write. Presets never expose upstream_servers, call_tool_destructive, code_execution, registry, or quarantine tools.
  - `llm_provider` 'openai' | 'anthropic' | 'zai', nullable — LLM provider for this bot. Defaults to LLM_PROVIDER, then openai.
  - `llm_model` string, nullable — Provider model for this bot. Defaults to provider-specific env vars.
  - `speech_speed` number, nullable — TTS speaking speed multiplier. Defaults to CARTESIA_TTS_SPEED, TTS_SPEED, SPEECH_SPEED, or the runner default.

## Response `201`

Bot successfully created and joined the meeting

- JoinResponse — Response model for a bot joining a meeting
  - `bot_id` string, required — The MeetingBaas bot ID used for API operations with MeetingBaas

## Other responses

- `400` — Bad request - Missing required fields or invalid data
- `422` — Validation Error
- `500` — Server error - Failed to create bot through MeetingBaas API

---

[API](https://skmtc.net/meeting-baas/apis/meeting-baas-api.md) · [All operations](https://skmtc.net/meeting-baas/apis/meeting-baas-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/meeting-baas/meeting-baas-api/revisions/ede837500622/schema)
