API v2/POST

Create a bot

Create a bot to join a meeting immediately.

The bot will automatically join the meeting, request recording permissions, and start recording once accepted. You can provide a bot-specific callback URL to receive bot.completed and bot.failed events for this bot (in addition to your account's webhooks). The bot will send webhook events for status changes, completion, and failures.

Returns a bot_id (UUID) that you can use to track status, retrieve meeting data, and manage the bot. The bot will be queued immediately and join the meeting as soon as possible (may take up to 2 minutes depending on availability of bot slots).

Token Reservation: 0.5 tokens are reserved immediately upon creation. These tokens will be consumed based on the bot's duration and outcome. If the bot fails due to user-responsible errors (BOT_NOT_ACCEPTED, TIMEOUT_WAITING_TO_START), recording tokens will be charged based on the time spent in the waiting room.

Deduplication: By default, multiple bots can join the same meeting URL. Set allow_multiple_bots: false to prevent duplicate bots within 5 minutes. The deduplication check expires after 5 minutes, allowing a new bot to join the same meeting URL after that period.

Rate Limits: Subject to your API key's rate limits and your team's daily bot cap. The daily bot cap is checked before token reservation. If the cap is reached, the request will fail with a 429 status code.

Error Scenarios:

  • 402 Payment Required: Insufficient tokens available
  • 409 Conflict: Bot already exists for the same meeting URL (when allow_multiple_bots is false)
  • 429 Too Many Requests: Daily bot cap reached or rate limit exceeded
POST
/v2/bots

Authorization

ApiKeyAuth
x-meeting-baas-api-key<token>

Your Meeting BaaS API key. Get one from your account settings.

In: header

Request Body

application/json

allow_multiple_bots?boolean

Whether to allow multiple bots to join the same meeting.

If set to false, only a single bot will be allowed to join using the same meeting URL within the last 5 minutes. This prevents duplicate bots from joining the same meeting.

If set to true (default), multiple bots can join the same meeting URL.

Default: true

Defaulttrue
bot_image?|array<>|

The bot's avatar image(s).

Accepts a single HTTPS URL or an array of up to 5 HTTPS URLs pointing to image files (JPEG, PNG, or WebP). When multiple images are provided, they will be cycled based on the bot_image_config settings.

Defaultnull
bot_image_config?|

Configuration for how bot avatar images are displayed. Only relevant when multiple images are provided in bot_image.

Defaultnull
bot_name*string

The name requested for the bot.

This name is displayed for anonymous joins. For an authenticated Microsoft Teams join using teams_config, Microsoft Teams ignores this value and displays the signed-in Microsoft 365 account's display name and profile instead.

For a Microsoft Teams meeting the name must be one Teams accepts for a guest, or the request is rejected: at most 50 characters; only letters, numbers, spaces and ' ’ . _ @ - · ・; no consecutive spaces; and no leading, trailing or consecutive periods. This applies to authenticated joins too, because a failed sign-in falls back to joining as a guest under this name.

Length1 <= length <= 255
callback_config?|
Defaultnull
callback_enabled?boolean

Enable callback for this bot. When enabled, the callback_config property is used to provide the configuration.

Defaultfalse
entry_message?|

The message that the bot will send when it joins the meeting.

This message will be posted in the meeting chat when the bot successfully joins.

Available for Google Meet, Microsoft Teams, and Zoom meetings.

Maximum: 4096 characters

Defaultnull
extra?|

An optional extra configuration object for the bot.

This object can contain any custom key-value pairs that you want to associate with the bot. The data will be:

  • Included in all webhook event payloads (if a webhook endpoint is configured)
  • Part of the callback payload (if callback is enabled)
  • Returned when fetching the bot's details via the API

Useful for storing custom metadata, tracking information, or any other data you need to correlate with the bot.

Defaultnull
ignored_participant_names?array<>

Participant names to ignore when evaluating auto-leave conditions.

The bot will not count participants matching these names when determining whether to leave a meeting. This is useful when multiple bots may join the same meeting across different environments (e.g., sandbox, staging).

By ignoring other bots' participant names, each bot can correctly detect when human participants have left and leave the meeting rather than remaining indefinitely.

Default[]
meet_config?|

Meet-only configuration for authenticated bots via SAML SSO.

  • credential_id: pin a specific login.
  • email_group: pool selector (preferred — takes priority).
  • fallback: 'fail' (default) or 'anonymous' on saturation.

Leave null for anonymous Meet joins, Zoom, or Microsoft Teams.

Defaultnull
meeting_url*string

The URL of the meeting to join.

Must be a valid HTTPS URL for a Microsoft Teams, Google Meet, or Zoom meeting.

Example: "https://zoom.us/j/123456789" or "https://meet.google.com/abc-defg-hij"

Formaturi
recording_mode?string

The recording mode of the bot.

Determines what the bot records during the meeting:

  • speaker_view: Records the speaker's view (default). Shows the active speaker or presenter.
  • audio_only: Records only the audio without video.
  • gallery_view: Records the entire gallery view (coming soon).

Default: speaker_view

Default"speaker_view"
Value in"audio_only" | "speaker_view" | "gallery_view"
streaming_config?|
Defaultnull
streaming_enabled?boolean

Enable audio streaming for this bot. When enabled, the streaming_config property is used to provide the configuration.

Defaultfalse
teams_config?|

Teams-only configuration for authenticated bots via a signed-in Microsoft account.

Microsoft Teams displays the selected account's Microsoft 365 name and profile; bot_name is ignored for the authenticated join.

  • credential_id: pin a specific login and display identity.
  • email_group: least-loaded pool selector (takes priority).
  • fallback: 'fail' (default) or 'anonymous' on saturation.

Leave null for anonymous Teams joins, Zoom, or Google Meet.

Defaultnull
timeout_config?

Configuration for automatic meeting exit behavior. For Google Meet and Microsoft Teams, the bot uses waiting_room_timeout to wait in the waiting room, then no_one_joined_timeout to wait for participants when first joining the meeting, and finally switches to silence_timeout monitoring once participants are detected. Zoom only uses waiting_room_timeout. Optional max_recording_duration sets a hard cap on total recording time (up to 12 hours).

Default{"grace_period":0,"max_recording_duration":null,"no_one_joined_timeout":600,"silence_timeout":600,"waiting_room_timeout":600}
transcription_config?|
Defaultnull
transcription_enabled?boolean

Enable transcription for this bot. When enabled, the transcription_config property is used to customise the transcription provider and parameters.

Defaultfalse
zoom_config?|

Zoom-only configuration for authentication and join method.

  • credential_id: Use a stored Zoom credential (OBF token fetched by the bot from the API server).
  • credential_user_id: Resolve a stored credential by Zoom user ID.
  • obf_token: Provide a direct OBF token (one-off join).
  • obf_token_url: URL that returns an OBF token when the bot joins.
  • zak_token_url: URL that returns a ZAK for joining without the host.

Leave null for Google Meet and Microsoft Teams.

Defaultnull

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.meetingbaas.com/v2/bots" \  -H "Content-Type: application/json" \  -d '{    "bot_name": "Meeting BaaS Bot",    "meeting_url": ""  }'
{
  "data": {
    "bot_id": "41900e0f-e27a-4863-8321-478ccf15bbd8"
  },
  "success": true
}
{
  "code": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "retryAfter": 9007199254740991,
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}