{"openapi":"3.1.0","info":{"title":"Meeting BaaS API","summary":"API for recording and transcribing video meetings across Zoom, Google Meet, and Microsoft Teams. Features include bot management, calendar integration, and transcription services.","description":"Meeting BaaS API","termsOfService":"https://meetingbaas.com/terms-and-conditions","version":"1.1"},"servers":[{"url":"https://api.meetingbaas.com","description":"Production server"}],"paths":{"/bots/":{"post":{"summary":"Join","description":"Have a bot join a meeting, now or in the future. You can provide a `webhook_url` parameter to receive webhook events specific to this bot, overriding your account's default webhook URL. Events include recording completion, failures, and transcription updates.","operationId":"join","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinResponse"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/bots/{uuid}":{"delete":{"summary":"Leave","description":"Leave","operationId":"leave","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaveResponse"}}}}}}},"/bots/meeting_data":{"get":{"summary":"Get Meeting Data","description":"Get meeting recording and metadata","operationId":"get_meeting_data","parameters":[{"in":"query","name":"bot_id","required":true,"schema":{"type":"string"},"style":"form"},{"in":"query","name":"include_transcripts","description":"Whether to include transcription data in the response. Defaults to true if not specified.","schema":{"description":"Whether to include transcription data in the response. Defaults to true if not specified.","default":true,"type":"boolean"},"style":"form"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Metadata"}}}}}}},"/bots/{uuid}/delete_data":{"post":{"summary":"Delete Data","description":"Deletes a bot's data including recording, transcription, and logs. Only metadata is retained. Rate limited to 5 requests per minute per API key.","operationId":"delete_data","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"401":{"description":"no content"},"403":{"description":"no content"},"404":{"description":"no content"},"429":{"description":"no content"}}}},"/bots/bots_with_metadata":{"get":{"summary":"List Bots with Metadata","description":"Retrieves a paginated list of the user's bots with essential metadata, including IDs, names, and meeting details. Supports filtering, sorting, and advanced querying options.","operationId":"bots_with_metadata","parameters":[{"in":"query","name":"bot_name","description":"Filter bots by name containing this string.\n\nPerforms a case-insensitive partial match on the bot's name. Useful for finding bots with specific naming conventions or to locate a particular bot when you don't have its ID.\n\nExample: \"Sales\" would match \"Sales Meeting\", \"Quarterly Sales\", etc.","schema":{"description":"Filter bots by name containing this string.\n\nPerforms a case-insensitive partial match on the bot's name. Useful for finding bots with specific naming conventions or to locate a particular bot when you don't have its ID.\n\nExample: \"Sales\" would match \"Sales Meeting\", \"Quarterly Sales\", etc.","type":["string","null"]},"style":"form"},{"in":"query","name":"created_after","description":"Filter bots created after this date (ISO format).\n\nLimits results to bots created at or after the specified timestamp. Used for time-based filtering to find recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","schema":{"description":"Filter bots created after this date (ISO format).\n\nLimits results to bots created at or after the specified timestamp. Used for time-based filtering to find recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","type":["string","null"]},"style":"form"},{"in":"query","name":"created_before","description":"Filter bots created before this date (ISO format).\n\nLimits results to bots created at or before the specified timestamp. Used for time-based filtering to exclude recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-31T23:59:59\"","schema":{"description":"Filter bots created before this date (ISO format).\n\nLimits results to bots created at or before the specified timestamp. Used for time-based filtering to exclude recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-31T23:59:59\"","type":["string","null"]},"style":"form"},{"in":"query","name":"cursor","description":"Cursor for pagination, obtained from previous response.\n\nUsed for retrieving the next set of results after a previous call. The cursor value is returned in the `nextCursor` field of responses that have additional results available.\n\nFormat: Base64-encoded string containing pagination metadata","schema":{"description":"Cursor for pagination, obtained from previous response.\n\nUsed for retrieving the next set of results after a previous call. The cursor value is returned in the `nextCursor` field of responses that have additional results available.\n\nFormat: Base64-encoded string containing pagination metadata","type":["string","null"]},"style":"form"},{"in":"query","name":"ended_after","description":"Filter bots ended after this date (ISO format).\n\nLimits results to bots that ended at or after the specified timestamp. Useful for finding completed meetings within a specific time period.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","schema":{"description":"Filter bots ended after this date (ISO format).\n\nLimits results to bots that ended at or after the specified timestamp. Useful for finding completed meetings within a specific time period.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","type":["string","null"]},"style":"form"},{"in":"query","name":"filter_by_extra","description":"Filter bots by matching values in the extra JSON payload.\n\nThis parameter performs in-memory filtering on the `extra` JSON field, similar to a SQL WHERE clause. It reduces the result set to only include bots that match all specified conditions.\n\nFormat specifications: - Single condition: \"field:value\" - Multiple conditions: \"field1:value1,field2:value2\"\n\nExamples: - \"customer_id:12345\" - Only bots with this customer ID - \"status:active,project:sales\" - Only active bots from sales projects\n\nNotes: - All conditions must match for a bot to be included - Values are matched exactly (case-sensitive) - Bots without the specified field are excluded","schema":{"description":"Filter bots by matching values in the extra JSON payload.\n\nThis parameter performs in-memory filtering on the `extra` JSON field, similar to a SQL WHERE clause. It reduces the result set to only include bots that match all specified conditions.\n\nFormat specifications: - Single condition: \"field:value\" - Multiple conditions: \"field1:value1,field2:value2\"\n\nExamples: - \"customer_id:12345\" - Only bots with this customer ID - \"status:active,project:sales\" - Only active bots from sales projects\n\nNotes: - All conditions must match for a bot to be included - Values are matched exactly (case-sensitive) - Bots without the specified field are excluded","type":["string","null"]},"style":"form"},{"in":"query","name":"limit","description":"Maximum number of bots to return in a single request.\n\nLimits the number of results returned in a single API call. This parameter helps control response size and page length.\n\nDefault: 10 Minimum: 1 Maximum: 50","schema":{"description":"Maximum number of bots to return in a single request.\n\nLimits the number of results returned in a single API call. This parameter helps control response size and page length.\n\nDefault: 10 Minimum: 1 Maximum: 50","default":10,"type":"integer","format":"int32"},"style":"form"},{"in":"query","name":"meeting_url","description":"Filter bots by meeting URL containing this string.\n\nPerforms a case-insensitive partial match on the bot's meeting URL. Use this to find bots associated with specific meeting platforms or particular meeting IDs.\n\nExample: \"zoom.us\" would match all Zoom meetings","schema":{"description":"Filter bots by meeting URL containing this string.\n\nPerforms a case-insensitive partial match on the bot's meeting URL. Use this to find bots associated with specific meeting platforms or particular meeting IDs.\n\nExample: \"zoom.us\" would match all Zoom meetings","type":["string","null"]},"style":"form"},{"in":"query","name":"sort_by_extra","description":"Sort the results by a field in the extra JSON payload.\n\nThis parameter performs in-memory sorting on the `extra` JSON field, similar to a SQL ORDER BY clause. It changes the order of results but not which results are included.\n\nFormat specifications: - Default (ascending): \"field\" - Explicit direction: \"field:asc\" or \"field:desc\"\n\nExamples: - \"customer_id\" - Sort by customer_id (ascending) - \"priority:desc\" - Sort by priority (descending)\n\nNotes: - Applied after all filtering - String comparison is used for sorting - Bots with the field come before bots without it - Can be combined with filter_by_extra","schema":{"description":"Sort the results by a field in the extra JSON payload.\n\nThis parameter performs in-memory sorting on the `extra` JSON field, similar to a SQL ORDER BY clause. It changes the order of results but not which results are included.\n\nFormat specifications: - Default (ascending): \"field\" - Explicit direction: \"field:asc\" or \"field:desc\"\n\nExamples: - \"customer_id\" - Sort by customer_id (ascending) - \"priority:desc\" - Sort by priority (descending)\n\nNotes: - Applied after all filtering - String comparison is used for sorting - Bots with the field come before bots without it - Can be combined with filter_by_extra","type":["string","null"]},"style":"form"},{"in":"query","name":"speaker_name","description":"NOTE: this is a preview feature and not yet available\n\nFilter bots by speaker name containing this string.\n\nPerforms a case-insensitive partial match on the speakers in the meeting. Useful for finding meetings that included a specific person.\n\nExample: \"John\" would match meetings with speakers like \"John Smith\" or \"John Doe\"","schema":{"description":"NOTE: this is a preview feature and not yet available\n\nFilter bots by speaker name containing this string.\n\nPerforms a case-insensitive partial match on the speakers in the meeting. Useful for finding meetings that included a specific person.\n\nExample: \"John\" would match meetings with speakers like \"John Smith\" or \"John Doe\"","type":["string","null"]},"style":"form"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRecentBotsResponse"}}}}}}},"/bots/retranscribe":{"post":{"summary":"Retranscribe Bot","description":"Transcribe or retranscribe a bot's audio using the Default or your provided Speech to Text Provider","operationId":"retranscribe_bot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetranscribeBody"}}},"required":true},"responses":{"200":{"description":"description"},"202":{"description":"no content"}}}},"/bots/{uuid}/screenshots":{"get":{"summary":"Get Screenshots","description":"Retrieves screenshots captured during the bot's session","operationId":"get_screenshots","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotsList"}}}}}}},"/bots/webhooks":{"get":{"tags":["Webhooks"],"summary":"Webhook Events Documentation","description":"Meeting BaaS sends webhook events to your configured webhook URL when specific events occur.\n\n## Webhook Event Types\n\n### 1. `complete`\nSent when a bot successfully completes recording a meeting. Contains full transcription data and a link to the recording.\n```json\n{\n  \\\"event\\\": \\\"complete\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"event_uuid\\\": \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n    \\\"transcript\\\": [\n      {\n        \\\"speaker\\\": \\\"John Doe\\\",\n        \\\"offset\\\": 1.5,\n        \\\"start_time\\\": 1.5,\n        \\\"end_time\\\": 2.4,\n        \\\"words\\\": [\n          {\n            \\\"start\\\": 1.5,\n            \\\"end\\\": 1.9,\n            \\\"word\\\": \\\"Hello\\\"\n          },\n          {\n            \\\"start\\\": 2.0,\n            \\\"end\\\": 2.4,\n            \\\"word\\\": \\\"everyone\\\"\n          }\n        ]\n      }\n    ],\n    \\\"speakers\\\": [\n      \\\"Jane Smith\\\",\n      \\\"John Doe\\\"\n    ],\n    \\\"mp4\\\": \\\"https://storage.example.com/recordings/video123.mp4?token=abc\\\",\n    \\\"audio\\\": \\\"https://storage.example.com/recordings/audio123.wav?token=abc\\\",\n    \\\"event\\\": \\\"complete\\\",\n    \\\"extra\\\": {\n      \\\"foo\\\": \\\"bar\\\"\n    }\n  }\n}\n```\n\nThe `complete` event includes:\n- **bot_id**: Unique identifier for the bot that completed recording\n- **event_uuid**: UUID of the calendar event (if this bot was created from an event)\n- **speakers**: A set of speaker names identified in the meeting\n- **transcript**: Full transcript data with speaker identification and word timing\n- **mp4**: URL to the recording file (valid for 24 hours by default)\n- **event**: Event type identifier (\"complete\")\n\n### 2. `failed`\nSent when a bot fails to join or record a meeting. Contains error details.\n```json\n{\n  \\\"event\\\": \\\"failed\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"event_uuid\\\": \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n    \\\"error\\\": \\\"meeting_not_found\\\",\n    \\\"message\\\": \\\"Could not join meeting: The meeting ID was not found or has expired\\\",\n    \\\"extra\\\": {\n      \\\"foo\\\": \\\"bar\\\"\n    }\n  }\n}\n```\n\nThe `failed` event includes:\n- **bot_id**: Unique identifier for the bot that failed\n- **event_uuid**: UUID of the calendar event (if this bot was created from an event)\n- **error**: Error code identifying the type of failure\n- **message**: Detailed human-readable error message\n\nCommon error types include:\n- `meeting_not_found`: The meeting ID or link was invalid or expired\n- `access_denied`: The bot was denied access to the meeting\n- `authentication_error`: Failed to authenticate with the meeting platform\n- `network_error`: Network connectivity issues during recording\n- `internal_error`: Internal server error\n\n### 3. `calendar.sync_events`\nSent when calendar events are synced. Contains information about which events were updated.\n```json\n{\n  \\\"event\\\": \\\"calendar.sync_events\\\",\n  \\\"data\\\": {\n    \\\"calendar_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"last_updated_ts\\\": \\\"2023-05-01T12:00:00Z\\\",\n    \\\"affected_event_uuids\\\": [\n      \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n      \\\"123e4567-e89b-12d3-a456-426614174002\\\"\n    ]\n  }\n}\n```\n\nThe `calendar.sync_events` event includes:\n- **calendar_id**: UUID of the calendar that was synced\n- **last_updated_ts**: ISO-8601 timestamp of when the sync occurred\n- **affected_event_uuids**: Array of UUIDs for calendar events that were added, updated, or deleted\n\nThis event is triggered when:\n- Calendar data is synced with the external provider (Google, Microsoft)\n- Multiple events may be created, updated, or deleted in a single sync operation\n- Use this event to update your local cache of calendar events\n\n### 4. `transcription_complete`\nSent when transcription is completed separately from recording (e.g., after retranscribing).\n```json\n{\n  \\\"event\\\": \\\"transcription_complete\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\"\n  }\n}\n```\n\nThe `transcription_complete` event includes:\n- **bot_id**: Unique identifier for the bot with the completed transcription\n\nThis event is sent when:\n- You request a retranscription via the `/bots/retranscribe` endpoint\n- An asynchronous transcription process completes after the recording has ended\n\n## Setting Up Webhooks\n\nYou can configure webhooks in two ways:\n1. **Account-level webhook URL**: Set a default webhook URL for all bots in your account using the `/accounts/webhook_url` endpoint\n2. **Bot-specific webhook URL**: Provide a `webhook_url` parameter when creating a bot with the `/bots` endpoint\n\nYour webhook endpoint must:\n- Accept POST requests with JSON payload\n- Return a 2xx status code to acknowledge receipt\n- Process requests within 10 seconds to avoid timeouts\n- Handle each event type appropriately based on the event type\n\nAll webhook requests include:\n- `x-meeting-baas-api-key` header with your API key for verification\n- `content-type: application/json` header\n- JSON body containing the event details\n\n## Webhook Reliability\n\nIf your endpoint fails to respond or returns an error, the system will attempt to retry the webhook delivery. For critical events, we recommend implementing:\n\n- Idempotency handling to prevent duplicate processing of the same event\n- Proper logging of webhook receipts for audit purposes\n- Asynchronous processing to quickly acknowledge receipt before handling the event data\n\nFor security, always validate the API key in the `x-meeting-baas-api-key` header matches your API key.","operationId":"webhook_documentation","responses":{"200":{"description":"","content":{"application/json":{"schema":{}}}}}}},"/bots/webhooks/bot":{"get":{"tags":["Webhooks"],"summary":"Bot Webhook Events Documentation","description":"Meeting BaaS sends the following webhook events related to bot recordings.\n\n## Bot Webhook Event Types\n\n### 1. `complete`\nSent when a bot successfully completes recording a meeting.\n\n**Payload Structure:**\n```json\n{\n  \\\"event\\\": \\\"complete\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"event_uuid\\\": \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n    \\\"transcript\\\": [\n      {\n        \\\"speaker\\\": \\\"John Doe\\\",\n        \\\"offset\\\": 1.5,\n        \\\"start_time\\\": 1.5,\n        \\\"end_time\\\": 2.4,\n        \\\"words\\\": [\n          {\n            \\\"start\\\": 1.5,\n            \\\"end\\\": 1.9,\n            \\\"word\\\": \\\"Hello\\\"\n          },\n          {\n            \\\"start\\\": 2.0,\n            \\\"end\\\": 2.4,\n            \\\"word\\\": \\\"everyone\\\"\n          }\n        ]\n      }\n    ],\n    \\\"speakers\\\": [\n      \\\"John Doe\\\",\n      \\\"Jane Smith\\\"\n    ],\n    \\\"mp4\\\": \\\"https://storage.example.com/recordings/video123.mp4?token=abc\\\",\n    \\\"audio\\\": \\\"https://storage.example.com/recordings/audio123.wav?token=abc\\\",\n    \\\"event\\\": \\\"complete\\\",\n    \\\"extra\\\": {\n      \\\"foo\\\": \\\"bar\\\"\n    }\n  }\n}\n```\n\n**When it's triggered:**\n- After a bot successfully records and processes a meeting\n- After the recording is uploaded and made available\n- When all processing of the meeting recording is complete\n\n**What to do with it:**\n- Download the MP4 recording for storage in your system\n- Store the transcript data in your database\n- Update meeting status in your application\n- Notify users that the recording is available\n- Use `event_uuid` to correlate with calendar events (if applicable)\n\n### 2. `failed`\nSent when a bot fails to join or record a meeting.\n\n**Payload Structure:**\n```json\n{\n  \\\"event\\\": \\\"failed\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"event_uuid\\\": \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n    \\\"error\\\": \\\"meeting_not_found\\\",\n    \\\"message\\\": \\\"Could not join meeting: The meeting ID was not found or has expired\\\",\n    \\\"extra\\\": {\n      \\\"foo\\\": \\\"bar\\\"\n    }\n  }\n}\n```\n\n**Common error types:**\n- `meeting_not_found`: The meeting ID or link was invalid or expired\n- `access_denied`: The bot was denied access to the meeting\n- `authentication_error`: Failed to authenticate with the meeting platform\n- `network_error`: Network connectivity issues during recording\n- `internal_error`: Internal server error\n\n**What to do with it:**\n- Log the failure for troubleshooting\n- Notify administrators or users about the failed recording\n- Attempt to reschedule if appropriate\n- Update meeting status in your system\n- Use `event_uuid` to correlate with calendar events (if applicable)\n\n### 3. `transcription_complete`\nSent when transcription is completed separately from recording.\n\n**Payload Structure:**\n```json\n{\n  \\\"event\\\": \\\"transcription_complete\\\",\n  \\\"data\\\": {\n    \\\"bot_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\"\n  }\n}\n```\n\n**When it's triggered:**\n- After requesting retranscription via the API\n- When an asynchronous transcription job completes\n- When a higher quality or different language transcription becomes available\n\n**What to do with it:**\n- Update the transcript data in your system\n- Notify users that improved transcription is available\n- Run any post-processing on the new transcript data\n\n## Webhook Usage Tips\n\n- Each event includes the `bot_id` so you can correlate with your internal data\n- The `event_uuid` field is included when the bot was created from a calendar event (null for direct bots or scheduled bots)\n- The complete event includes speaker identification and full transcript data\n- For downloading recordings, the mp4 URL is valid for 24 hours\n- Handle the webhook asynchronously and return 200 OK quickly to prevent timeouts\n\nFor security, always validate the API key in the `x-meeting-baas-api-key` header matches your API key.","operationId":"bot_webhook_documentation","responses":{"200":{"description":"","content":{"application/json":{"schema":{}}}}}}},"/bots/webhooks/calendar":{"get":{"tags":["Webhooks"],"summary":"Calendar Webhook Events Documentation","description":"Meeting BaaS sends the following webhook events related to calendar integrations.\n\n## Calendar Webhook Event Types\n\n### 1. `calendar.sync_events`\nSent when calendar events are synced with external providers.\n\n**Payload Structure:**\n```json\n{\n  \\\"event\\\": \\\"calendar.sync_events\\\",\n  \\\"data\\\": {\n    \\\"calendar_id\\\": \\\"123e4567-e89b-12d3-a456-426614174000\\\",\n    \\\"last_updated_ts\\\": \\\"2023-05-01T12:00:00Z\\\",\n    \\\"affected_event_uuids\\\": [\n      \\\"123e4567-e89b-12d3-a456-426614174001\\\",\n      \\\"123e4567-e89b-12d3-a456-426614174002\\\"\n    ]\n  }\n}\n```\n\n**When it's triggered:**\n- After initial calendar connection is established\n- When external calendar providers (Google, Microsoft) send change notifications\n- After manual calendar resync operations\n- During scheduled periodic syncs\n- When events are created, updated, or deleted in the source calendar\n\n**What to do with it:**\n- Update your local copy of calendar events\n- Process any new events that match your criteria\n- Remove any deleted events from your system\n- Update schedules for any modified events\n- Refresh your UI to show the latest calendar data\n\n**Field details:**\n- `calendar_id`: The UUID of the synchronized calendar\n- `last_updated_ts`: ISO-8601 timestamp when the sync occurred\n- `affected_event_uuids**: Array of UUIDs for events that were changed\n\n## Integration with Meeting BaaS Calendar API\n\nAfter receiving a calendar webhook event, you can:\n1. Use the `/calendar_events` endpoint to retrieve detailed information about specific events\n2. Use the `/calendars/:uuid` endpoint to get calendar metadata\n3. Schedule recording bots for any new meetings with the `/calendar_events/:uuid/bot` endpoint\n\n## Webhook Usage Tips\n\n- Each event includes affected event UUIDs for efficient processing\n- You don't need to retrieve all calendar events - just process the changed ones\n- The timestamp helps determine the sequence of updates\n- For high-frequency calendars, consider batch processing of multiple events\n\nFor security, always validate the API key in the `x-meeting-baas-api-key` header matches your API key.","operationId":"calendar_webhook_documentation","responses":{"200":{"description":"","content":{"application/json":{"schema":{}}}}}}},"/calendars/raw":{"post":{"tags":["Calendars"],"summary":"List Raw Calendars","description":"Retrieves unprocessed calendar data directly from the provider (Google, Microsoft) using provided OAuth credentials. This endpoint is typically used during the initial setup process to allow users to select which calendars to integrate. Returns a list of available calendars with their unique IDs, email addresses, and primary status. This data is not persisted until a calendar is formally created using the create_calendar endpoint.","operationId":"list_raw_calendars","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRawCalendarsParams"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRawCalendarsResponse"}}}}}}},"/calendars/":{"get":{"tags":["Calendars"],"summary":"List Calendars","description":"Retrieves all calendars that have been integrated with the system for the authenticated user. Returns a list of calendars with their names, email addresses, provider information, and sync status. This endpoint shows only calendars that have been formally connected through the create_calendar endpoint, not all available calendars from the provider.","operationId":"list_calendars","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Calendar"}}}}}}},"post":{"tags":["Calendars"],"summary":"Create Calendar","description":"Integrates a new calendar with the system using OAuth credentials. This endpoint establishes a connection with the calendar provider (Google, Microsoft), sets up webhook notifications for real-time updates, and performs an initial sync of all calendar events. It requires OAuth credentials (client ID, client secret, and refresh token) and the platform type. Once created, the calendar is assigned a unique UUID that should be used for all subsequent operations. Returns the newly created calendar object with all integration details.","operationId":"create_calendar","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarParams"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarResponse"}}}}}}},"/calendars/resync_all":{"post":{"tags":["Calendars"],"summary":"Resync All Calendars","description":"Forces a sync of all your connected calendars with their providers (Google, Microsoft).\n\nProcesses each calendar individually and returns:\n- `synced_calendars`: UUIDs of successfully synced calendars\n- `errors`: Details of any failures\n\nSends webhook notifications for calendars with updates.","operationId":"resync_all_calendars","parameters":[{"in":"query","name":"days","description":"Number of days to sync forward (default: 30 for rolling window)","schema":{"description":"Number of days to sync forward (default: 30 for rolling window)","type":["integer","null"],"format":"int32"},"style":"form"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResyncAllCalendarsResponse"}}}}}}},"/calendars/{uuid}":{"get":{"tags":["Calendars"],"summary":"Get Calendar","description":"Retrieves detailed information about a specific calendar integration by its UUID. Returns comprehensive calendar data including the calendar name, email address, provider details (Google, Microsoft), sync status, and other metadata. This endpoint is useful for displaying calendar information to users or verifying the status of a calendar integration before performing operations on its events.","operationId":"get_calendar","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calendar"}}}}}},"delete":{"tags":["Calendars"],"summary":"Delete Calendar","description":"Permanently removes a calendar integration by its UUID, including all associated events and bot configurations. This operation cancels any active subscriptions with the calendar provider, stops all webhook notifications, and unschedules any pending recordings. All related resources are cleaned up in the database. This action cannot be undone, and subsequent requests to this calendar's UUID will return 404 Not Found errors.","operationId":"delete_calendar","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"no content"}}},"patch":{"tags":["Calendars"],"summary":"Update Calendar","description":"Updates a calendar integration with new credentials or platform while maintaining the same UUID. This operation is performed as an atomic transaction to ensure data integrity. The system automatically unschedules existing bots to prevent duplicates, updates the calendar credentials, and triggers a full resync of all events. Useful when OAuth tokens need to be refreshed or when migrating a calendar between providers. Returns the updated calendar object with its new configuration.","operationId":"update_calendar","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCalendarParams"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarResponse"}}}}}}},"/calendar_events/{uuid}":{"get":{"tags":["Calendars"],"summary":"Get Event","description":"Retrieves comprehensive details about a specific calendar event by its UUID. Returns complete event information including title, meeting link, start and end times, organizer status, recurrence information, and the full list of attendees with their names and email addresses. Also includes any associated bot parameters if recording is scheduled for this event. The raw calendar data from the provider is also included for advanced use cases.","operationId":"get_event","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}}}}},"/calendar_events/{uuid}/bot":{"post":{"tags":["Calendars"],"summary":"Schedule Record Event","description":"Configures a bot to automatically join and record a specific calendar event at its scheduled time. The UUID in the request path is the event UUID. The request body contains detailed bot configuration, including recording options, streaming settings, and webhook notification URLs. For recurring events, the 'all_occurrences' parameter can be set to true to schedule recording for all instances of the recurring series, or false (default) to schedule only the specific instance. Returns the updated event(s) with the bot parameters attached.","operationId":"schedule_record_event","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"},{"in":"query","name":"all_occurrences","description":"schedule a bot to all occurences of a recurring event","schema":{"description":"schedule a bot to all occurences of a recurring event","type":["boolean","null"]},"style":"form"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotParam2"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"delete":{"tags":["Calendars"],"summary":"Unschedule Record Event","description":"Cancels a previously scheduled recording for a calendar event and releases associated bot resources. For recurring events, the 'all_occurrences' parameter controls whether to unschedule from all instances of the recurring series or just the specific occurrence. This operation is idempotent and will not error if no bot was scheduled. Returns the updated event(s) with the bot parameters removed.","operationId":"unschedule_record_event","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"},{"in":"query","name":"all_occurrences","description":"unschedule a bot from all occurences of a recurring event","schema":{"description":"unschedule a bot from all occurences of a recurring event","type":["boolean","null"]},"style":"form"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"patch":{"tags":["Calendars"],"summary":"Patch Bot","description":"Updates the configuration of a bot already scheduled to record an event. Allows modification of recording settings, webhook URLs, and other bot parameters without canceling and recreating the scheduled recording. For recurring events, the 'all_occurrences' parameter determines whether changes apply to all instances or just the specific occurrence. Returns the updated event(s) with the modified bot parameters.","operationId":"patch_bot","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"},{"in":"query","name":"all_occurrences","description":"schedule a bot to all occurences of a recurring event","schema":{"description":"schedule a bot to all occurences of a recurring event","type":["boolean","null"]},"style":"form"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotParam3"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}}},"/calendar_events/":{"get":{"tags":["Calendars"],"summary":"List Events","description":"Retrieves a paginated list of calendar events with comprehensive filtering options. Supports filtering by organizer email, attendee email, date ranges (start_date_gte, start_date_lte), and event status. Results can be limited to upcoming events (default), past events, or all events. Each event includes full details such as meeting links, participants, and recording status. The response includes a 'next' pagination cursor for retrieving additional results.","operationId":"list_events","parameters":[{"in":"query","name":"attendee_email","description":"If provided, filters events to include only those with this attendee's email address Example: \"jane.smith@example.com\"","schema":{"description":"If provided, filters events to include only those with this attendee's email address Example: \"jane.smith@example.com\"","type":["string","null"]},"style":"form"},{"in":"query","name":"calendar_id","description":"Calendar ID to filter events by This is required to specify which calendar's events to retrieve","required":true,"schema":{"description":"Calendar ID to filter events by This is required to specify which calendar's events to retrieve","type":"string"},"style":"form"},{"in":"query","name":"cursor","description":"Optional cursor for pagination This value is included in the `next` field of the previous response","schema":{"description":"Optional cursor for pagination This value is included in the `next` field of the previous response","type":["string","null"]},"style":"form"},{"in":"query","name":"organizer_email","description":"If provided, filters events to include only those with this organizer's email address Example: \"john.doe@example.com\"","schema":{"description":"If provided, filters events to include only those with this organizer's email address Example: \"john.doe@example.com\"","type":["string","null"]},"style":"form"},{"in":"query","name":"start_date_gte","description":"If provided, filters events to include only those with a start date greater than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","schema":{"description":"If provided, filters events to include only those with a start date greater than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","type":["string","null"]},"style":"form"},{"in":"query","name":"start_date_lte","description":"If provided, filters events to include only those with a start date less than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-12-31T23:59:59Z\"","schema":{"description":"If provided, filters events to include only those with a start date less than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-12-31T23:59:59Z\"","type":["string","null"]},"style":"form"},{"in":"query","name":"status","description":"Filter events by meeting status Valid values: \"upcoming\" (default) returns events after current time, \"past\" returns previous events, \"all\" returns both","schema":{"description":"Filter events by meeting status Valid values: \"upcoming\" (default) returns events after current time, \"past\" returns previous events, \"all\" returns both","type":["string","null"]},"style":"form"},{"in":"query","name":"updated_at_gte","description":"If provided, fetches only events updated at or after this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","schema":{"description":"If provided, fetches only events updated at or after this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","type":["string","null"]},"style":"form"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEventResponse"}}}}}}},"/zoom_oauth_connections/":{"get":{"tags":["Zoom OAuth"],"summary":"List Zoom OAuth Connections","description":"Retrieves all Zoom OAuth connections associated with the authenticated account. Each connection represents a Zoom user who has authorized your app via OAuth. Use this to display connected users or to find the `zoom_user_id` needed for the `zoom_obf_token_user_id` bot parameter. Sensitive token data is never included in the response.","operationId":"list_zoom_oauth_connections","responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ZoomOAuthConnectionResponse"}}}}}},"security":[{"ApiKeyAuth":[]}]},"post":{"tags":["Zoom OAuth"],"summary":"Create Zoom OAuth Connection","description":"Exchanges a Zoom OAuth authorization code for access and refresh tokens, retrieves the Zoom user's profile, and stores the connection for managed OBF token generation. The authorization code is obtained by directing a Zoom user through the OAuth consent flow for your Zoom OAuth app. Once stored, you can reference this connection's `zoom_user_id` as the `zoom_obf_token_user_id` parameter when creating a bot, and the system will automatically fetch a fresh OBF token at join time. Note: the authorization code is single-use and expires in approximately 10 minutes.","operationId":"create_zoom_oauth_connection","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConnectionRequest"}}},"required":true},"responses":{"200":{"description":"Error response"},"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoomOAuthConnectionResponse"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/zoom_oauth_connections/{uuid}":{"get":{"tags":["Zoom OAuth"],"summary":"Get Zoom OAuth Connection","description":"Retrieves a specific Zoom OAuth connection by its UUID. Returns the connection details including the Zoom user ID, account ID, connection state, and granted scopes. Sensitive token data is never included in the response.","operationId":"get_zoom_oauth_connection","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoomOAuthConnectionResponse"}}}}},"security":[{"ApiKeyAuth":[]}]},"delete":{"tags":["Zoom OAuth"],"summary":"Delete Zoom OAuth Connection","description":"Permanently deletes a Zoom OAuth connection by its UUID, removing all stored tokens. After deletion, bots using this connection's `zoom_user_id` as `zoom_obf_token_user_id` will no longer be able to automatically fetch OBF tokens. The Zoom user would need to re-authorize to create a new connection.","operationId":"delete_zoom_oauth_connection","parameters":[{"in":"path","name":"uuid","description":"The UUID identifier","required":true,"schema":{"description":"The UUID identifier","type":"string"},"style":"simple"}],"responses":{"200":{"description":"Error response"},"204":{"description":"no content"}},"security":[{"ApiKeyAuth":[]}]}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-meeting-baas-api-key","description":"API key for authentication"}},"schemas":{"Account":{"description":"This structure represents the user's account information.","type":"object","required":["created_at","email","id","secret","status"],"properties":{"company_name":{"type":["string","null"]},"created_at":{"$ref":"#/components/schemas/SystemTime"},"email":{"type":"string"},"firstname":{"type":["string","null"]},"id":{"type":"integer","format":"int32"},"lastname":{"type":["string","null"]},"phone":{"type":["string","null"]},"secret":{"type":"string"},"status":{"type":"integer","format":"int32"}}},"AccountInfos":{"description":"Structure consisting account information.","type":"object","required":["account"],"properties":{"account":{"$ref":"#/components/schemas/Account"}}},"ApiKeyResponse":{"type":"object","required":["api_key"],"properties":{"api_key":{"type":"string"}}},"Attendee":{"type":"object","required":["email"],"properties":{"email":{"description":"The email address of the meeting attendee","type":"string"},"name":{"description":"The display name of the attendee if available from the calendar provider (Google, Microsoft)","type":["string","null"]}}},"AudioFile":{"type":"object","required":["file_extension","file_type","filename"],"properties":{"file_extension":{"type":"string"},"file_type":{"type":"string"},"filename":{"type":"string"}}},"AudioFrequency":{"type":"string","enum":["16khz","24khz"]},"AutomaticLeaveRequest":{"type":"object","properties":{"noone_joined_timeout":{"description":"The timeout in seconds for the bot to wait for participants to join before leaving the meeting, defaults to 600 seconds (10 minutes). Minimum: 120 seconds (2 minutes). Maximum: 1800 seconds (30 minutes). When a bot first joins a meeting, it uses this timeout to determine if any participants have joined. If no participants are detected within this period, the bot will leave the meeting. Once participants are detected, the silence_timeout takes over. Applies to Google Meet and Microsoft Teams only.","type":["integer","null"],"format":"uint32","minimum":0.0},"silence_timeout":{"description":"The timeout in seconds for the bot to leave the meeting if no speaker activity is detected, defaults to 600 seconds (10 minutes). Minimum: 300 seconds (5 minutes). Maximum: 1800 seconds (30 minutes). This timeout becomes active after participants are detected. The bot monitors for audio activity, and if no sound is detected for the duration of this timeout, it will automatically leave the meeting. Important: Configure these timeouts carefully to ensure the bot doesn't leave too early - the noone_joined_timeout should be long enough to wait for late joiners, and the silence_timeout should account for intentional pauses. Applies to Google Meet and Microsoft Teams only.","type":["integer","null"],"format":"uint32","minimum":0.0},"waiting_room_timeout":{"description":"The timeout in seconds for the bot to wait in the waiting room before leaving the meeting, defaults to 600 seconds (10 minutes). Minimum: 120 seconds (2 minutes). Maximum: 1800 seconds (30 minutes). Note: Google Meet also has it's own waiting room timeout (about ~10 minutes). Setting a higher value for such meetings would have no effect because Google Meet will deny entry to the bot after its own timeout.","type":["integer","null"],"format":"uint32","minimum":0.0}}},"Bot":{"type":"object","required":["bot","duration","params"],"properties":{"bot":{"$ref":"#/components/schemas/Bot2"},"duration":{"type":"integer","format":"int64"},"params":{"$ref":"#/components/schemas/BotParam"}}},"Bot2":{"type":"object","required":["account_id","bot_exited_at","bot_joined_at","bot_param_id","created_at","diarization_v2","ended_at","id","is_stopped","meeting_url","mp4_s3_path","reserved","uuid"],"properties":{"account_id":{"type":"integer","format":"int32"},"bot_exited_at":{"$ref":"#/components/schemas/OptionalDateTime"},"bot_joined_at":{"$ref":"#/components/schemas/OptionalDateTime"},"bot_param_id":{"type":"integer","format":"int32"},"created_at":{"$ref":"#/components/schemas/DateTime"},"diarization_fails":{"type":["integer","null"],"format":"int32"},"diarization_v2":{"type":"boolean"},"ended_at":{"$ref":"#/components/schemas/OptionalDateTime"},"errors":{"type":["string","null"]},"event_id":{"type":["integer","null"],"format":"int32"},"id":{"type":"integer","format":"int32"},"is_stopped":{"type":"boolean"},"meeting_url":{"type":"string"},"mp4_s3_path":{"type":"string"},"reserved":{"type":"boolean"},"scheduled_bot_id":{"type":["integer","null"],"format":"int32"},"session_id":{"type":["string","null"]},"transcription_fails":{"type":["integer","null"],"format":"int32"},"transcription_payloads":true,"user_reported_error":true,"uuid":{"type":"string","format":"uuid"}}},"BotCrashedQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"}}},"BotCrashedRequest":{"type":"object","required":["crashReason"],"properties":{"crashReason":{"type":"string"},"efsManifest":{"type":["array","null"],"items":{"$ref":"#/components/schemas/EfsManifestEntry"}},"exitCode":{"type":["integer","null"],"format":"int32"},"signal":{"type":["integer","null"],"format":"int32"}}},"BotData":{"type":"object","required":["bot","transcripts"],"properties":{"bot":{"$ref":"#/components/schemas/BotWithParams"},"event_uuid":{"description":"UUID of the calendar event (if this bot was created from an event)","type":["string","null"],"format":"uuid"},"transcripts":{"type":"array","items":{"$ref":"#/components/schemas/Transcript"}}}},"BotPagined":{"description":"Paginated bot results with status information\n\nThis response includes bots with their status information and pagination metadata to support loading additional results.\n\nThe bots are automatically sorted by status priority (critical issues first).","type":"object","required":["bots","has_more"],"properties":{"bots":{"description":"List of bots with status information, sorted by priority","type":"array","items":{"$ref":"#/components/schemas/BotWithStatus"}},"has_more":{"description":"Whether there are more results available at the next offset","type":"boolean"}}},"BotParam":{"type":"object","required":["bot_name","extra","transcription_custom_parameters","webhook_url"],"properties":{"bot_image":{"type":["string","null"]},"bot_name":{"type":"string"},"deduplication_key":{"type":["string","null"]},"enter_message":{"type":["string","null"]},"extra":{"$ref":"#/components/schemas/Extra"},"noone_joined_timeout":{"type":["integer","null"],"format":"int32"},"recording_mode":{"anyOf":[{"$ref":"#/components/schemas/RecordingMode"},{"type":"null"}]},"speech_to_text_api_key":{"type":["string","null"]},"speech_to_text_provider":{"anyOf":[{"$ref":"#/components/schemas/SpeechToTextProvider"},{"type":"null"}]},"streaming_audio_frequency":{"anyOf":[{"$ref":"#/components/schemas/AudioFrequency"},{"type":"null"}]},"streaming_input":{"type":["string","null"]},"streaming_output":{"type":["string","null"]},"transcription_custom_parameters":{"$ref":"#/components/schemas/Extra"},"waiting_room_timeout":{"type":["integer","null"],"format":"int32"},"webhook_url":{"type":"string"},"zoom_access_token_url":{"type":["string","null"]},"zoom_obf_token":{"type":["string","null"]},"zoom_obf_token_url":{"type":["string","null"]},"zoom_obf_token_user_id":{"type":["string","null"]},"zoom_sdk_id":{"type":["string","null"]},"zoom_sdk_pwd":{"type":["string","null"]}}},"BotParam2":{"type":"object","required":["bot_name"],"properties":{"bot_image":{"type":["string","null"]},"bot_name":{"type":"string"},"deduplication_key":{"type":["string","null"]},"enter_message":{"type":["string","null"]},"extra":{"default":null,"$ref":"#/components/schemas/Extra"},"noone_joined_timeout":{"type":["integer","null"],"format":"int32"},"recording_mode":{"anyOf":[{"$ref":"#/components/schemas/RecordingMode"},{"type":"null"}]},"silence_timeout":{"type":["integer","null"],"format":"int32"},"speech_to_text":{"anyOf":[{"$ref":"#/components/schemas/SpeechToText"},{"type":"null"}]},"streaming_audio_frequency":{"anyOf":[{"$ref":"#/components/schemas/AudioFrequency"},{"type":"null"}]},"streaming_input":{"type":["string","null"]},"streaming_output":{"type":["string","null"]},"transcription_custom_parameters":{"default":null,"$ref":"#/components/schemas/Extra"},"waiting_room_timeout":{"type":["integer","null"],"format":"int32"},"webhook_url":{"type":["string","null"]},"zoom_access_token_url":{"type":["string","null"]},"zoom_obf_token":{"type":["string","null"]},"zoom_obf_token_url":{"type":["string","null"]},"zoom_obf_token_user_id":{"type":["string","null"]},"zoom_sdk_id":{"type":["string","null"]},"zoom_sdk_pwd":{"type":["string","null"]}}},"BotParam3":{"type":"object","properties":{"bot_image":{"default":null,"type":["string","null"]},"bot_name":{"default":null,"type":["string","null"]},"deduplication_key":{"default":null,"type":["string","null"]},"enter_message":{"default":null,"type":["string","null"]},"extra":{"default":null},"noone_joined_timeout":{"default":null,"type":["integer","null"],"format":"int32"},"recording_mode":{"anyOf":[{"anyOf":[{"$ref":"#/components/schemas/RecordingMode"},{"type":"null"}]},{"type":"null"}]},"speech_to_text":{"default":null,"anyOf":[{"anyOf":[{"$ref":"#/components/schemas/SpeechToText"},{"type":"null"}]},{"type":"null"}]},"streaming_audio_frequency":{"default":null,"anyOf":[{"anyOf":[{"$ref":"#/components/schemas/AudioFrequency"},{"type":"null"}]},{"type":"null"}]},"streaming_input":{"default":null,"type":["string","null"]},"streaming_output":{"default":null,"type":["string","null"]},"transcription_custom_parameters":{"default":null},"waiting_room_timeout":{"default":null,"type":["integer","null"],"format":"int32"},"webhook_url":{"default":null,"type":["string","null"]},"zoom_access_token_url":{"default":null,"type":["string","null"]},"zoom_obf_token":{"default":null,"type":["string","null"]},"zoom_obf_token_url":{"default":null,"type":["string","null"]},"zoom_obf_token_user_id":{"default":null,"type":["string","null"]},"zoom_sdk_id":{"default":null,"type":["string","null"]},"zoom_sdk_pwd":{"default":null,"type":["string","null"]}}},"BotStatusResponse":{"description":"API response type for frontend developers to display and sort bot statuses\n\n# Fields * `value` - String representation of the status suitable for displaying and filtering * `type` - Category of status (success, error, warning, pending) * `details` - Optional detailed explanation of the status * `sort_priority` - Numeric value for sorting (lower = higher priority) * `category` - Logical grouping of similar status types","type":"object","required":["category","sort_priority","type","value"],"properties":{"category":{"description":"Logical grouping of status","type":"string"},"details":{"description":"Detailed explanation when available","type":["string","null"]},"sort_priority":{"description":"Numeric priority for sorting (0 = highest priority)","type":"integer","format":"int32"},"type":{"description":"Status type (success, error, warning, pending)","type":"string"},"value":{"description":"Display text for the status","type":"string"}}},"BotWithParams":{"type":"object","required":["account_id","bot_exited_at","bot_joined_at","bot_name","bot_param_id","created_at","diarization_v2","ended_at","extra","id","is_stopped","meeting_url","mp4_s3_path","reserved","transcription_custom_parameters","uuid","webhook_url"],"properties":{"account_id":{"type":"integer","format":"int32"},"bot_exited_at":{"$ref":"#/components/schemas/OptionalDateTime"},"bot_image":{"type":["string","null"]},"bot_joined_at":{"$ref":"#/components/schemas/OptionalDateTime"},"bot_name":{"type":"string"},"bot_param_id":{"type":"integer","format":"int32"},"created_at":{"$ref":"#/components/schemas/DateTime"},"deduplication_key":{"type":["string","null"]},"diarization_fails":{"type":["integer","null"],"format":"int32"},"diarization_v2":{"type":"boolean"},"ended_at":{"$ref":"#/components/schemas/OptionalDateTime"},"enter_message":{"type":["string","null"]},"errors":{"type":["string","null"]},"event_id":{"type":["integer","null"],"format":"int32"},"extra":{"$ref":"#/components/schemas/Extra"},"id":{"type":"integer","format":"int32"},"is_stopped":{"type":"boolean"},"meeting_url":{"type":"string"},"mp4_s3_path":{"type":"string"},"noone_joined_timeout":{"type":["integer","null"],"format":"int32"},"recording_mode":{"anyOf":[{"$ref":"#/components/schemas/RecordingMode"},{"type":"null"}]},"reserved":{"type":"boolean"},"scheduled_bot_id":{"type":["integer","null"],"format":"int32"},"session_id":{"type":["string","null"]},"silence_timeout":{"type":["integer","null"],"format":"int32"},"speech_to_text_api_key":{"type":["string","null"]},"speech_to_text_provider":{"anyOf":[{"$ref":"#/components/schemas/SpeechToTextProvider"},{"type":"null"}]},"streaming_audio_frequency":{"anyOf":[{"$ref":"#/components/schemas/AudioFrequency"},{"type":"null"}]},"streaming_input":{"type":["string","null"]},"streaming_output":{"type":["string","null"]},"transcription_custom_parameters":{"$ref":"#/components/schemas/Extra"},"transcription_fails":{"type":["integer","null"],"format":"int32"},"transcription_payloads":true,"user_reported_error":true,"uuid":{"type":"string","format":"uuid"},"waiting_room_timeout":{"type":["integer","null"],"format":"int32"},"webhook_url":{"type":"string"},"zoom_access_token_url":{"type":["string","null"]},"zoom_obf_token":{"type":["string","null"]},"zoom_obf_token_url":{"type":["string","null"]},"zoom_obf_token_user_id":{"type":["string","null"]},"zoom_sdk_id":{"type":["string","null"]},"zoom_sdk_pwd":{"type":["string","null"]}}},"BotWithStatus":{"description":"Bot information with status metadata\n\nThis struct combines the bot data with status information optimized for UI display.","type":"object","required":["account_id","bot_exited_at","bot_joined_at","bot_param_id","created_at","diarization_v2","duration","ended_at","id","meeting_url","mp4_s3_path","params","reserved","status","uuid"],"properties":{"account_email":{"description":"The email of the account owner (only included for special domain users)","type":["string","null"]},"account_id":{"description":"The account that owns this bot","type":"integer","format":"int32"},"bot_exited_at":{"description":"When the bot actually exited the meeting (precise timing)","$ref":"#/components/schemas/OptionalDateTime"},"bot_joined_at":{"description":"When the bot actually joined the meeting (precise timing)","$ref":"#/components/schemas/OptionalDateTime"},"bot_param_id":{"description":"ID of the bot parameters used","type":"integer","format":"int32"},"created_at":{"description":"When the bot was created","$ref":"#/components/schemas/DateTime"},"diarization_fails":{"description":"Number of diarization failures","type":["integer","null"],"format":"int32"},"diarization_v2":{"description":"Whether diarization v2 is enabled","type":"boolean"},"duration":{"description":"Duration of the recording in seconds","type":"integer","format":"int64"},"ended_at":{"description":"When the bot ended recording","$ref":"#/components/schemas/OptionalDateTime"},"errors":{"description":"Any error messages","type":["string","null"]},"event_id":{"description":"ID of the calendar event if scheduled","type":["integer","null"],"format":"int32"},"id":{"description":"The bot's unique identifier","type":"integer","format":"int32"},"meeting_url":{"description":"The meeting URL this bot is recording","type":"string"},"mp4_s3_path":{"description":"Path to the MP4 file in S3","type":"string"},"params":{"description":"Bot parameters","$ref":"#/components/schemas/BotParam"},"reserved":{"description":"Whether this bot is reserved","type":"boolean"},"scheduled_bot_id":{"description":"ID of the scheduled bot if scheduled","type":["integer","null"],"format":"int32"},"session_id":{"description":"The session ID for this bot instance","type":["string","null"]},"status":{"description":"Frontend-friendly status information for display and sorting","$ref":"#/components/schemas/BotStatusResponse"},"transcription_fails":{"description":"Number of transcription failures","type":["integer","null"],"format":"int32"},"user_reported_error":{"description":"User reported error information"},"uuid":{"description":"Unique identifier for this bot","type":"string","format":"uuid"}}},"Calendar":{"type":"object","required":["email","google_id","name","uuid"],"properties":{"email":{"type":"string"},"google_id":{"type":"string"},"name":{"type":"string"},"resource_id":{"type":["string","null"]},"uuid":{"type":"string","format":"uuid"}}},"CalendarListEntry":{"type":"object","required":["email","id","is_primary"],"properties":{"email":{"type":"string"},"id":{"type":"string"},"is_primary":{"type":"boolean"}}},"CalendarUuidParam":{"description":"Calendar UUID path parameter for API endpoints","type":"object","required":["calendar_uuid"],"properties":{"calendar_uuid":{"description":"The calendar UUID","type":"string"}}},"CheckStopRequestQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"}}},"CheckStopRequestResponse":{"type":"object","required":["is_stopped"],"properties":{"is_stopped":{"type":"boolean"}}},"CreateCalendarParams":{"type":"object","required":["oauth_client_id","oauth_client_secret","oauth_refresh_token","platform"],"properties":{"oauth_client_id":{"type":"string"},"oauth_client_secret":{"type":"string"},"oauth_refresh_token":{"type":"string"},"platform":{"$ref":"#/components/schemas/Provider"},"raw_calendar_id":{"type":["string","null"]}}},"CreateCalendarResponse":{"type":"object","required":["calendar"],"properties":{"calendar":{"$ref":"#/components/schemas/Calendar"}}},"CreateConnectionRequest":{"type":"object","required":["authorization_code","redirect_uri","zoom_client_id","zoom_client_secret"],"properties":{"authorization_code":{"description":"The OAuth authorization code received from Zoom after user consent. This is a single-use code that expires in approximately 10 minutes.","type":"string"},"redirect_uri":{"description":"The redirect URI that was used in the OAuth authorization request. Must match exactly what was configured in your Zoom OAuth app.","type":"string"},"zoom_client_id":{"description":"Your Zoom OAuth app's Client ID, found in the Zoom App Marketplace under your app's credentials.","type":"string"},"zoom_client_secret":{"description":"Your Zoom OAuth app's Client Secret, found in the Zoom App Marketplace under your app's credentials.","type":"string"}}},"DailyTokenConsumption":{"type":"object","required":["consumption_by_service","date"],"properties":{"consumption_by_service":{"$ref":"#/components/schemas/TokenConsumptionByService"},"date":{"type":"string"}}},"DateTime":{"type":"string","format":"date-time"},"DeleteResponse":{"type":"object","required":["ok","status"],"properties":{"ok":{"description":"Whether the request was processed successfully","type":"boolean"},"status":{"description":"The detailed status of the deletion operation","$ref":"#/components/schemas/DeleteStatus"}}},"DeleteStatus":{"oneOf":[{"description":"All data was successfully deleted","type":"string","enum":["deleted"]},{"description":"Some data was deleted, but other parts couldn't be removed","type":"string","enum":["partiallyDeleted"]},{"description":"No data needed to be deleted as it was already removed","type":"string","enum":["alreadyDeleted"]},{"description":"No data was found for the specified bot","type":"string","enum":["noDataFound"]}]},"EfsManifestEntry":{"type":"object","required":["path","size"],"properties":{"path":{"type":"string"},"size":{"type":"integer","format":"uint64","minimum":0.0}}},"EndMeetingQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"}}},"EndMeetingTrampolineQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"}}},"EndMeetingTrampolineRequest":{"type":"object","required":["bot_exited_at","bot_joined_at","diarization_v2"],"properties":{"bot_exited_at":{"type":"integer","format":"uint64","minimum":0.0},"bot_joined_at":{"type":"integer","format":"uint64","minimum":0.0},"diarization_fail_count":{"type":["integer","null"],"format":"uint","minimum":0.0},"diarization_v2":{"type":"boolean"},"ended_at":{"description":"Optional Unix timestamp (seconds, no ms) for when the meeting actually ended. When provided (e.g. for manual replay), used instead of server time for bot.ended_at.","default":null,"type":["integer","null"],"format":"uint64","minimum":0.0},"files_generated":{"anyOf":[{"$ref":"#/components/schemas/FilesGenerated"},{"type":"null"}]},"transcription_fail_count":{"type":["integer","null"],"format":"uint","minimum":0.0}}},"Event":{"type":"object","required":["attendees","calendar_uuid","deleted","end_time","google_id","is_organizer","is_recurring","last_updated_at","meeting_url","name","raw","start_time","uuid"],"properties":{"attendees":{"type":"array","items":{"$ref":"#/components/schemas/Attendee"}},"bot_param":{"description":"Associated bot parameters if a bot is scheduled for this event","anyOf":[{"$ref":"#/components/schemas/BotParam"},{"type":"null"}]},"calendar_uuid":{"type":"string","format":"uuid"},"deleted":{"description":"Indicates whether this event has been deleted","type":"boolean"},"end_time":{"description":"The end time of the event in UTC timezone","type":"string","format":"date-time"},"google_id":{"description":"The unique identifier of the event from the calendar provider (Google, Microsoft)","type":"string"},"is_organizer":{"description":"Indicates whether the current user is the organizer of this event","type":"boolean"},"is_recurring":{"description":"Indicates whether this event is part of a recurring series","type":"boolean"},"last_updated_at":{"description":"The timestamp when this event was last updated","type":"string","format":"date-time"},"meeting_url":{"description":"The URL that can be used to join the meeting (if available)","type":"string"},"name":{"description":"The title/name of the calendar event","type":"string"},"raw":{"description":"The raw calendar data from the provider in JSON format","$ref":"#/components/schemas/Extra"},"recurring_event_id":{"description":"For recurring events, the ID of the parent recurring event series (if applicable)","type":["string","null"]},"start_time":{"description":"The start time of the event in UTC timezone","type":"string","format":"date-time"},"uuid":{"type":"string","format":"uuid"}}},"Extra":{"description":"Custom data object","additionalProperties":true},"FailedRecordRequest":{"type":"object","required":["meeting_url","message"],"properties":{"ended_at":{"description":"Optional Unix timestamp (seconds, no ms) for when the bot actually ended. When provided (e.g. for manual replay), used instead of server time to avoid incorrect billing.","default":null,"type":["integer","null"],"format":"uint64","minimum":0.0},"error_code":{"default":null,"type":["string","null"]},"meeting_url":{"type":"string"},"message":{"type":"string"}}},"FilesGenerated":{"type":"object","required":["file_extension","file_type","filename"],"properties":{"audio_file":{"anyOf":[{"$ref":"#/components/schemas/AudioFile"},{"type":"null"}]},"file_extension":{"type":"string"},"file_type":{"type":"string"},"filename":{"type":"string"}}},"GetAllBotsQuery":{"description":"Query parameters for getting all bots","type":"object","required":["limit","offset"],"properties":{"account_id":{"description":"Filter by account ID (comma-separated for multiple values)\n\nExample: \"1,2,3\" will match bots from accounts 1, 2, or 3","default":null,"type":["array","null"],"items":{"type":"string"}},"bot_uuid":{"description":"Filter by bot UUID (comma-separated for multiple values)\n\nExample: \"123e4567-e89b-12d3-a456-426614174000,987fcdeb-51d3-a456-426614174000\"","default":null,"type":["array","null"],"items":{"type":"string"}},"creator_email_contains":{"description":"Filter by creator email containing any of these texts (comma-separated)\n\nExample: \"john,doe\" will match emails containing either \"john\" or \"doe\"","default":null,"type":["array","null"],"items":{"type":"string"}},"diarization_v2":{"description":"Filter by diarization v2 status (comma-separated for multiple values)\n\nExample: \"true,false\" will match both diarization v2 and non-diarization v2 bots","default":null,"type":["array","null"],"items":{"type":"string"}},"end_date":{"description":"Filter by end date","default":null,"type":["string","null"],"format":"partial-date-time"},"extra_contains":{"description":"Filter by extra JSON containing any of these texts (comma-separated)\n\nExample: \"customer_id,project\" will match extra JSON containing either \"customer_id\" or \"project\"","default":null,"type":["array","null"],"items":{"type":"string"}},"limit":{"description":"Limit for pagination","type":"integer","format":"int64"},"meeting_url":{"description":"Filter by exact meeting URL (comma-separated for multiple values)\n\nExample: \"https://meet.google.com/abc-def,https://zoom.us/j/123456\"","default":null,"type":["array","null"],"items":{"type":"string"}},"meeting_url_contains":{"description":"Filter by meeting URL containing any of these texts (comma-separated)\n\nExample: \"meet.google.com,zoom.us\" will match URLs containing either \"meet.google.com\" or \"zoom.us\"","default":null,"type":["array","null"],"items":{"type":"string"}},"offset":{"description":"Offset for pagination","type":"integer","format":"int64"},"reserved":{"description":"Filter by reserved status (comma-separated for multiple values)\n\nExample: \"true,false\" will match both reserved and non-reserved bots","default":null,"type":["array","null"],"items":{"type":"string"}},"start_date":{"description":"Filter by start date","default":null,"type":["string","null"],"format":"partial-date-time"},"status":{"description":"Filter by user-reported status (comma-separated for multiple values)\n\nExample: \"open,in_progress,closed\" will match bots with any of these user-reported statuses","default":null,"type":["array","null"],"items":{"type":"string"}},"status_category":{"description":"Filter by status category (comma-separated for multiple values)\n\nExample: \"system_error,auth_error,connection_error\" will match bots with any of these categories\n\nCommon categories are: - system_error: Internal system issues - auth_error: Authentication and authorization issues - connection_error: Network and meeting connection issues - permission_error: Access and permission issues - input_error: Invalid input parameters - webhook_error: Webhook delivery issues - duplicate_error: Duplicate meeting or bot issues - unknown_error: Unclassified errors","default":null,"type":["array","null"],"items":{"type":"string"}},"status_priority":{"description":"Filter by status priority (comma-separated for multiple values)\n\nExample: \"critical,high,medium,low\" will match bots with any of these priorities\n\nPriorities are: - critical: System errors requiring immediate attention - high: Serious issues that prevent meeting functionality - medium: Issues that affect functionality but not critically - low: Minor issues that don't greatly impact functionality - none: For success states","default":null,"type":["array","null"],"items":{"type":"string"}},"status_type":{"description":"Filter by status type (comma-separated for multiple values)\n\nExample: \"success,error,warning,pending\" will match bots with any of these status types\n\nStatus types are: - success: Bot completed successfully or is in progress - error: Bot encountered a system error - warning: Bot has a non-critical issue - pending: Bot is waiting to start","default":null,"type":["array","null"],"items":{"type":"string"}},"user_email":{"description":"Filter by user email (comma-separated for multiple values)\n\nExample: \"user1@example.com,user2@example.com\" will match bots from accounts with these emails","default":null,"type":["array","null"],"items":{"type":"string"}},"user_reported_error_contains":{"description":"Filter by user reported error containing any of these texts (comma-separated)\n\nExample: \"failed,error\" will match errors containing either \"failed\" or \"error\"","default":null,"type":["array","null"],"items":{"type":"string"}},"user_reported_error_json":{"description":"Filter by user reported error JSON (comma-separated for multiple conditions)\n\nExample: '{\"status\":\"open\"},{\"priority\":\"high\"}' will match bots with either status open or priority high","default":null,"type":["array","null"],"items":true}}},"GetMeetingDataQuery":{"type":"object","required":["bot_id"],"properties":{"bot_id":{"type":"string"},"include_transcripts":{"description":"Whether to include transcription data in the response. Defaults to true if not specified.","default":true,"type":"boolean"}}},"GetStartedAccount":{"type":"object","required":["email"],"properties":{"email":{"type":"string"},"firstname":{"type":["string","null"]},"google_token_id":{"type":["string","null"]},"lastname":{"type":["string","null"]},"microsoft_token_id":{"type":["string","null"]}}},"GetWebhookUrlResponse":{"type":"object","properties":{"webhook_url":{"type":["string","null"]}}},"GetstartedQuery":{"type":"object","properties":{"redirect_url":{"type":["string","null"]}}},"JoinRequest":{"type":"object","required":["bot_name","meeting_url"],"properties":{"automatic_leave":{"description":"Configuration for automatic meeting exit behavior. The bot uses waiting_room_timeout to wait in the waiting room, then noone_joined_timeout to wait for participants when first joining the meeting, and finally switches to silence_timeout monitoring once participants are detected. Applies to Google Meet and Microsoft Teams only.","anyOf":[{"$ref":"#/components/schemas/AutomaticLeaveRequest"},{"type":"null"}]},"bot_image":{"description":"The image to use for the bot, must be a URL. Recommended ratio is 16:9.","type":["string","null"],"format":"uri"},"bot_name":{"type":"string"},"deduplication_key":{"description":"We prevent multiple bots with same API key joining a meeting within 5 mins, unless overridden by deduplication_key.","type":["string","null"]},"entry_message":{"description":"There are no entry messages on Microsoft Teams as guests outside of an organization do not have access to the chat.","type":["string","null"]},"extra":{"description":"A JSON object that allows you to add custom data to a bot for your convenience, e.g. your end user's ID.","default":null,"$ref":"#/components/schemas/Extra"},"meeting_url":{"type":"string"},"recording_mode":{"description":"The recording mode for the bot, defaults to 'speaker_view'. Supported values are 'speaker_view' and 'audio_only'. 'gallery_view' is currently under development.","anyOf":[{"$ref":"#/components/schemas/RecordingMode"},{"type":"null"}]},"reserved":{"description":"Deprecated, do not use.","default":false,"type":"boolean"},"speech_to_text":{"description":"The default speech to text provider is Gladia.","anyOf":[{"$ref":"#/components/schemas/SpeechToText"},{"type":"null"}]},"start_time":{"description":"Reserved has been deprecated in favour of start_time. Unix timestamp (in seconds) for when the bot should join the meeting. The bot joins eaxctly at the start time.","type":["integer","null"],"format":"uint64","minimum":0.0},"streaming":{"description":"WebSocket streams for 16 kHz audio. Input stream receives audio sent to the bot. Output stream receives audio from the bot.","anyOf":[{"$ref":"#/components/schemas/StreamingApiParameter"},{"type":"null"}]},"transcription_custom_parameters":{"description":"For your own transcription parameters","default":null},"webhook_url":{"description":"A webhook URL to send events to, overrides the webhook URL set in your account settings.","type":["string","null"]},"zoom_access_token_url":{"description":"URL that returns a Zoom ZAK token (short-lived access token) for joining authenticated meetings.","type":["string","null"]},"zoom_obf_token":{"description":"A raw Zoom On Behalf Of (OBF) token for joining external Zoom meetings. Required for meetings that enforce authenticated join after March 2, 2026.","type":["string","null"]},"zoom_obf_token_url":{"description":"URL that returns a Zoom OBF token. The bot will fetch the token from this URL at join time.","type":["string","null"]},"zoom_obf_token_user_id":{"description":"The Zoom user ID associated with a stored OAuth connection. When set, the system will automatically fetch an OBF token using the managed OAuth credentials.","type":["string","null"]},"zoom_sdk_id":{"description":"For the Own Zoom Credentials feature, we need your zoom sdk id.","type":["string","null"]},"zoom_sdk_pwd":{"description":"For the Own Zoom Credentials feature, we need your zoom sdk pwd.","type":["string","null"]}},"additionalProperties":false},"JoinRequestScheduled":{"type":"object","required":["bot_param_id","meeting_url","schedule_origin"],"properties":{"bot_param_id":{"type":"integer","format":"int32"},"meeting_url":{"type":"string"},"schedule_origin":{"$ref":"#/components/schemas/ScheduleOrigin"}},"additionalProperties":false},"JoinResponse":{"type":"object","required":["bot_id"],"properties":{"bot_id":{"type":"string","format":"uuid"}}},"JoinResponse2":{"type":"object","required":["bot_id"],"properties":{"bot_id":{"type":"string","format":"uuid"}}},"LeaveResponse":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"ListEventResponse":{"type":"object","required":["data"],"properties":{"data":{"description":"Vector of calendar events matching the list criteria","type":"array","items":{"$ref":"#/components/schemas/Event"}},"next":{"description":"Optional url for fetching the next page of results if there are more results to fetch. The limit of events returned is 100. When None, there are no more results to fetch.","type":["string","null"]}}},"ListRawCalendarsParams":{"type":"object","required":["oauth_client_id","oauth_client_secret","oauth_refresh_token","platform"],"properties":{"oauth_client_id":{"type":"string"},"oauth_client_secret":{"type":"string"},"oauth_refresh_token":{"type":"string"},"platform":{"$ref":"#/components/schemas/Provider"}}},"ListRawCalendarsResponse":{"type":"object","required":["calendars"],"properties":{"calendars":{"type":"array","items":{"$ref":"#/components/schemas/CalendarListEntry"}}}},"ListRecentBotsQuery":{"description":"Query parameters for listing recent bots","type":"object","properties":{"bot_name":{"description":"Filter bots by name containing this string.\n\nPerforms a case-insensitive partial match on the bot's name. Useful for finding bots with specific naming conventions or to locate a particular bot when you don't have its ID.\n\nExample: \"Sales\" would match \"Sales Meeting\", \"Quarterly Sales\", etc.","type":["string","null"]},"created_after":{"description":"Filter bots created after this date (ISO format).\n\nLimits results to bots created at or after the specified timestamp. Used for time-based filtering to find recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","type":["string","null"]},"created_before":{"description":"Filter bots created before this date (ISO format).\n\nLimits results to bots created at or before the specified timestamp. Used for time-based filtering to exclude recent additions.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-31T23:59:59\"","type":["string","null"]},"cursor":{"description":"Cursor for pagination, obtained from previous response.\n\nUsed for retrieving the next set of results after a previous call. The cursor value is returned in the `nextCursor` field of responses that have additional results available.\n\nFormat: Base64-encoded string containing pagination metadata","type":["string","null"]},"ended_after":{"description":"Filter bots ended after this date (ISO format).\n\nLimits results to bots that ended at or after the specified timestamp. Useful for finding completed meetings within a specific time period.\n\nFormat: ISO-8601 date-time string (YYYY-MM-DDThh:mm:ss) Example: \"2023-05-01T00:00:00\"","type":["string","null"]},"filter_by_extra":{"description":"Filter bots by matching values in the extra JSON payload.\n\nThis parameter performs in-memory filtering on the `extra` JSON field, similar to a SQL WHERE clause. It reduces the result set to only include bots that match all specified conditions.\n\nFormat specifications: - Single condition: \"field:value\" - Multiple conditions: \"field1:value1,field2:value2\"\n\nExamples: - \"customer_id:12345\" - Only bots with this customer ID - \"status:active,project:sales\" - Only active bots from sales projects\n\nNotes: - All conditions must match for a bot to be included - Values are matched exactly (case-sensitive) - Bots without the specified field are excluded","type":["string","null"]},"limit":{"description":"Maximum number of bots to return in a single request.\n\nLimits the number of results returned in a single API call. This parameter helps control response size and page length.\n\nDefault: 10 Minimum: 1 Maximum: 50","default":10,"type":"integer","format":"int32"},"meeting_url":{"description":"Filter bots by meeting URL containing this string.\n\nPerforms a case-insensitive partial match on the bot's meeting URL. Use this to find bots associated with specific meeting platforms or particular meeting IDs.\n\nExample: \"zoom.us\" would match all Zoom meetings","type":["string","null"]},"sort_by_extra":{"description":"Sort the results by a field in the extra JSON payload.\n\nThis parameter performs in-memory sorting on the `extra` JSON field, similar to a SQL ORDER BY clause. It changes the order of results but not which results are included.\n\nFormat specifications: - Default (ascending): \"field\" - Explicit direction: \"field:asc\" or \"field:desc\"\n\nExamples: - \"customer_id\" - Sort by customer_id (ascending) - \"priority:desc\" - Sort by priority (descending)\n\nNotes: - Applied after all filtering - String comparison is used for sorting - Bots with the field come before bots without it - Can be combined with filter_by_extra","type":["string","null"]},"speaker_name":{"description":"NOTE: this is a preview feature and not yet available\n\nFilter bots by speaker name containing this string.\n\nPerforms a case-insensitive partial match on the speakers in the meeting. Useful for finding meetings that included a specific person.\n\nExample: \"John\" would match meetings with speakers like \"John Smith\" or \"John Doe\"","type":["string","null"]}}},"ListRecentBotsResponse":{"description":"Response for listing recent bots","type":"object","required":["bots"],"properties":{"bots":{"description":"List of recent bots with their metadata\n\nThis field is serialized as both \"bots\" and \"recent_bots\" for backwards compatibility. New clients should use the \"bots\" field name.","type":"array","items":{"$ref":"#/components/schemas/RecentBotEntry"}},"last_updated":{"description":"Timestamp of when this data was generated (in ISO-8601 format)\n\nThis field is maintained for backwards compatibility. It is automatically set to the current time when the response is created.","default":"2026-04-28T02:23:37.074150850+00:00","type":"string","format":"date-time"},"next_cursor":{"description":"Optional cursor for pagination","type":["string","null"]}}},"LoginAccount":{"type":"object","required":["password","pseudo"],"properties":{"app_signin_token":{"type":["string","null"]},"google_chrome_token_id":{"type":["string","null"]},"google_token_id":{"type":["string","null"]},"microsoft_token_id":{"type":["string","null"]},"password":{"type":"string"},"pseudo":{"type":"string"}}},"LoginQuery":{"type":"object","properties":{"redirect_url":{"type":["string","null"]}}},"Metadata":{"type":"object","required":["audio","bot_data","duration","meeting_participants_file","mp4","speaker_diarization_file","speaker_diarization_file_network"],"properties":{"audio":{"description":"URL to access the recording WAV audio file. Will be an empty string if the file doesn't exist in S3.","type":"string"},"bot_data":{"$ref":"#/components/schemas/BotData"},"duration":{"description":"Duration of the recording in seconds","type":"integer","format":"int64"},"meeting_participants_file":{"description":"URL to access the meeting participants log file. Contains information about meeting participants. Will be an empty string if the file doesn't exist in S3.","type":"string"},"mp4":{"description":"URL to access the recording MP4 file. Will be an empty string if the file doesn't exist in S3.","type":"string"},"speaker_diarization_file":{"description":"URL to access the speaker diarization metadata file. Contains real-time speaker activity data with timestamps indicating when each speaker is talking. The file contains JSON arrays with speaker information including name, ID, timestamp, and speaking status. Will be an empty string if the file doesn't exist in S3.","type":"string"},"speaker_diarization_file_network":{"description":"URL to access the network speaker detection log file. Contains speaker observation observed through network (not UI changes). Will be an empty string if the file doesn't exist in S3.","type":"string"}}},"ObfTokenQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"},"zoom_user_id":{"type":["string","null"]}}},"OptionalDateTime":{"type":["string","null"],"format":"date-time"},"PostWebhookUrlRequest":{"type":"object","required":["webhook_url"],"properties":{"webhook_url":{"type":"string"}}},"Provider":{"description":"Fields with value `\"simple\"` parse as `Kind::Simple`. Fields with value `\"fancy\"` parse as `Kind::SoFancy`.","type":"string","enum":["Google","Microsoft"]},"PublicBotAnalytics":{"description":"Watered-down bot info for public analytics","type":"object","required":["created_at","duration","meeting_platform","status"],"properties":{"created_at":{"$ref":"#/components/schemas/DateTime"},"duration":{"type":"integer","format":"int64"},"meeting_platform":{"type":"string"},"status":{"$ref":"#/components/schemas/BotStatusResponse"},"user_reported_error_message":{"type":["string","null"]},"user_reported_error_status":{"type":["string","null"]}}},"QueryListEvent":{"type":"object","required":["calendar_id"],"properties":{"attendee_email":{"description":"If provided, filters events to include only those with this attendee's email address Example: \"jane.smith@example.com\"","type":["string","null"]},"calendar_id":{"description":"Calendar ID to filter events by This is required to specify which calendar's events to retrieve","type":"string"},"cursor":{"description":"Optional cursor for pagination This value is included in the `next` field of the previous response","type":["string","null"]},"organizer_email":{"description":"If provided, filters events to include only those with this organizer's email address Example: \"john.doe@example.com\"","type":["string","null"]},"start_date_gte":{"description":"If provided, filters events to include only those with a start date greater than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","type":["string","null"]},"start_date_lte":{"description":"If provided, filters events to include only those with a start date less than or equal to this timestamp Format: ISO-8601 string, e.g., \"2023-12-31T23:59:59Z\"","type":["string","null"]},"status":{"description":"Filter events by meeting status Valid values: \"upcoming\" (default) returns events after current time, \"past\" returns previous events, \"all\" returns both","type":["string","null"]},"updated_at_gte":{"description":"If provided, fetches only events updated at or after this timestamp Format: ISO-8601 string, e.g., \"2023-01-01T00:00:00Z\"","type":["string","null"]}}},"QueryPatchRecordEvent":{"type":"object","properties":{"all_occurrences":{"description":"schedule a bot to all occurences of a recurring event","type":["boolean","null"]}}},"QueryScheduleRecordEvent":{"type":"object","properties":{"all_occurrences":{"description":"schedule a bot to all occurences of a recurring event","type":["boolean","null"]}}},"QueryUnScheduleRecordEvent":{"type":"object","properties":{"all_occurrences":{"description":"unschedule a bot from all occurences of a recurring event","type":["boolean","null"]}}},"ReceivedMessageQuery":{"type":"object","required":["session_id"],"properties":{"session_id":{"type":"string"}}},"RecentBotEntry":{"description":"Entry for a recent bot in the list response","type":"object","required":["bot_name","created_at","extra","id","meeting_url","speakers","uuid"],"properties":{"access_count":{"description":"Number of times this bot data has been accessed (if tracked)","type":["integer","null"],"format":"int32"},"bot_name":{"description":"Name of the bot","type":"string"},"created_at":{"description":"Creation timestamp of the bot in ISO-8601 format","type":"string"},"duration":{"description":"Duration of the bot session in seconds (if completed)","type":["integer","null"],"format":"int64"},"ended_at":{"description":"End time of the bot session (if completed) in ISO-8601 format","type":["string","null"]},"extra":{"description":"Extra custom data provided during bot creation","$ref":"#/components/schemas/Extra"},"id":{"description":"Unique identifier of the bot (legacy field)\n\nThis field is maintained for backwards compatibility. It is serialized as a UUID string to match the old API format. New clients should use the uuid field instead.","type":"integer","format":"int32"},"last_accessed_at":{"description":"Last time this bot data was accessed (if available)","type":["string","null"]},"meeting_url":{"description":"URL of the meeting the bot joined","type":"string"},"session_id":{"description":"Session ID if the bot is active","type":["string","null"]},"speakers":{"description":"List of unique speaker names from the bot's transcripts","type":"array","items":{"type":"string"}},"uuid":{"description":"Unique identifier of the bot (new field)\n\nThis is the preferred field to use for bot identification. The id field is maintained for backwards compatibility.","type":"string","format":"uuid"}}},"RecognizerTranscript":{"type":"object","required":["speaker","start_time"],"properties":{"end_time":{"type":["number","null"],"format":"double"},"lang":{"type":["string","null"]},"speaker":{"type":"string"},"start_time":{"type":"number","format":"double"},"user_id":{"type":["integer","null"],"format":"int32"}}},"RecognizerWord":{"type":"object","required":["end_time","start_time","text"],"properties":{"end_time":{"type":"number","format":"double"},"start_time":{"type":"number","format":"double"},"text":{"type":"string"},"user_id":{"type":["integer","null"],"format":"int32"}}},"RecordingMode":{"description":"Recording mode for the bot","oneOf":[{"description":"Records the active speaker view","type":"string","enum":["speaker_view"]},{"description":"Records the gallery view showing multiple participants","type":"string","enum":["gallery_view"]},{"description":"Records only the audio from the meeting","type":"string","enum":["audio_only"]}]},"ResyncAllCalendarsQuery":{"description":"Resync all calendars for the user\n\nThis will fetch all events from the calendar again, regardless of whether they have been synced before. It is useful when the calendar data becomes out of sync.","type":"object","properties":{"days":{"description":"Number of days to sync forward (default: 30 for rolling window)","type":["integer","null"],"format":"int32"}}},"ResyncAllCalendarsResponse":{"type":"object","required":["errors","synced_calendars"],"properties":{"errors":{"description":"List of calendar UUIDs that failed to resync, with detailed error messages explaining the failure reason","type":"array","items":{"type":"array","items":[{"type":"string","format":"uuid"},{"type":"string"}],"maxItems":2,"minItems":2}},"synced_calendars":{"description":"List of calendar UUIDs that were successfully resynced with their calendar provider (Google, Microsoft)","type":"array","items":{"type":"string","format":"uuid"}}}},"ResyncAllQuery":{"description":"Resync all calendars for the user\n\nThis will fetch all events from the calendar again, regardless of whether they have been fetched before. It is useful when the calendar data becomes out of sync.","type":"object","properties":{"days":{"description":"Number of days to sync forward (default: 30 for rolling window)","type":["integer","null"],"format":"int32"}}},"ResyncAllResponse":{"type":"object","required":["errors","synced_calendars"],"properties":{"errors":{"description":"List of calendar UUIDs that failed to resync, with error messages","type":"array","items":{"type":"array","items":[{"type":"string","format":"uuid"},{"type":"string"}],"maxItems":2,"minItems":2}},"synced_calendars":{"description":"List of calendar UUIDs that were successfully resynced","type":"array","items":{"type":"string","format":"uuid"}}}},"RetranscribeBody":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"},"speech_to_text":{"anyOf":[{"$ref":"#/components/schemas/SpeechToText"},{"type":"null"}]},"webhook_url":{"type":["string","null"]}}},"RetryWebhookQuery":{"type":"object","required":["bot_uuid"],"properties":{"bot_uuid":{"type":"string"},"webhook_url":{"type":["string","null"]}}},"ScheduleOrigin":{"oneOf":[{"type":"object","required":["Event"],"properties":{"Event":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","format":"int32"}}}},"additionalProperties":false},{"type":"object","required":["ScheduledBot"],"properties":{"ScheduledBot":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","format":"int32"}}}},"additionalProperties":false}]},"ScreenshotWrapper":{"description":"Schema-compatible wrapper for the Screenshot struct","type":"object","required":["date","url"],"properties":{"date":{"type":"string"},"url":{"type":"string"}}},"ScreenshotsList":{"description":"Wrapper struct for Screenshots list that implements JsonSchema","type":"array","items":{"$ref":"#/components/schemas/ScreenshotWrapper"}},"SpeechToText":{"anyOf":[{"$ref":"#/components/schemas/SpeechToTextApiParameter"},{"$ref":"#/components/schemas/SpeechToTextProvider"}]},"SpeechToTextApiParameter":{"type":"object","required":["provider"],"properties":{"api_key":{"type":["string","null"]},"provider":{"$ref":"#/components/schemas/SpeechToTextProvider"}}},"SpeechToTextProvider":{"type":"string","enum":["Gladia","Runpod","Default"]},"StartRecordFailedQuery":{"type":"object","properties":{"bot_uuid":{"type":["string","null"]}}},"StreamingApiParameter":{"type":"object","properties":{"audio_frequency":{"anyOf":[{"$ref":"#/components/schemas/AudioFrequency"},{"type":"null"}]},"input":{"type":["string","null"]},"output":{"type":["string","null"]}}},"SyncResponse":{"type":"object","properties":{"affected_event_uuids":{"description":"UUIDs of affected events","type":["array","null"],"items":{"type":"string","format":"uuid"}},"has_updates":{"description":"timestamp of last updated event if some events has been updated.","type":["string","null"],"format":"date-time"}}},"SystemTime":{"type":"object","required":["nanos_since_epoch","secs_since_epoch"],"properties":{"nanos_since_epoch":{"type":"integer","format":"uint32","minimum":0.0},"secs_since_epoch":{"type":"integer","format":"uint64","minimum":0.0}}},"TokenConsumptionByService":{"type":"object","required":["duration","recording_tokens","streaming_input_hour","streaming_input_tokens","streaming_output_hour","streaming_output_tokens","transcription_byok_hour","transcription_byok_tokens","transcription_hour","transcription_tokens"],"properties":{"duration":{"type":"string"},"recording_tokens":{"type":"string"},"streaming_input_hour":{"type":"string"},"streaming_input_tokens":{"type":"string"},"streaming_output_hour":{"type":"string"},"streaming_output_tokens":{"type":"string"},"transcription_byok_hour":{"type":"string"},"transcription_byok_tokens":{"type":"string"},"transcription_hour":{"type":"string"},"transcription_tokens":{"type":"string"}}},"TokenConsumptionQuery":{"type":"object","required":["end_date","start_date"],"properties":{"end_date":{"type":"string","format":"partial-date-time"},"start_date":{"type":"string","format":"partial-date-time"}}},"Transcript":{"type":"object","required":["bot_id","id","speaker","start_time","words"],"properties":{"bot_id":{"type":"integer","format":"int32"},"end_time":{"type":["number","null"],"format":"double"},"id":{"type":"integer","format":"int32"},"lang":{"type":["string","null"]},"speaker":{"type":"string"},"start_time":{"type":"number","format":"double"},"user_id":{"type":["integer","null"],"format":"int32"},"words":{"type":"array","items":{"$ref":"#/components/schemas/Word"}}}},"Transcript2":{"type":"object","required":["bot_id","id","speaker","start_time"],"properties":{"bot_id":{"type":"integer","format":"int32"},"end_time":{"type":["number","null"],"format":"double"},"id":{"type":"integer","format":"int32"},"lang":{"type":["string","null"]},"speaker":{"type":"string"},"start_time":{"type":"number","format":"double"},"user_id":{"type":["integer","null"],"format":"int32"}}},"Transcript3":{"type":"object","required":["id"],"properties":{"bot_id":{"type":["integer","null"],"format":"int32"},"end_time":{"type":["number","null"],"format":"double"},"id":{"type":"integer","format":"int32"},"lang":{"type":["string","null"]},"speaker":{"type":["string","null"]},"start_time":{"type":["number","null"],"format":"double"},"user_id":{"type":["integer","null"],"format":"int32"}}},"UpdateCalendarParams":{"type":"object","required":["oauth_client_id","oauth_client_secret","oauth_refresh_token","platform"],"properties":{"oauth_client_id":{"type":"string"},"oauth_client_secret":{"type":"string"},"oauth_refresh_token":{"type":"string"},"platform":{"$ref":"#/components/schemas/Provider"}}},"UserReportedErrorPayload":{"type":"object","required":["note"],"properties":{"chat_id":{"type":["string","null"]},"note":{"type":"string"},"status":{"anyOf":[{"$ref":"#/components/schemas/UserReportedErrorStatus"},{"type":"null"}]}}},"UserReportedErrorStatus":{"description":"Example usage for frontend developers\n\n```ignore // How to use in your API handler: let status = calculate_bot_status(bot.errors, bot.ended_at, bot.duration, bot.created_at); let status_response = status_to_response(status);\n\n// How to sort by priority: bots.sort_by_key(|bot| bot.status.sort_priority);\n\n// How to filter by type: let errors = bots.filter(|bot| bot.status.r#type == \"error\");\n\n// How to filter by category: let connection_errors = bots.filter(|bot| bot.status.category == \"connection_error\"); ```","type":"string","enum":["open","in_progress","closed"]},"UserTokensResponse":{"type":"object","required":["available_tokens","total_tokens_purchased"],"properties":{"available_tokens":{"type":"string"},"last_purchase_date":{"type":["string","null"],"format":"partial-date-time"},"total_tokens_purchased":{"type":"string"}}},"UuidParam":{"description":"UUID path parameter for API endpoints","type":"object","required":["uuid"],"properties":{"uuid":{"description":"The UUID identifier","type":"string"}}},"Version":{"type":"object","required":["build_date","build_timestamp","location"],"properties":{"build_date":{"type":"string"},"build_timestamp":{"type":"string"},"location":{"type":"string"}}},"Word":{"type":"object","required":["bot_id","end_time","id","start_time","text"],"properties":{"bot_id":{"type":"integer","format":"int32"},"end_time":{"type":"number","format":"double"},"id":{"type":"integer","format":"int32"},"start_time":{"type":"number","format":"double"},"text":{"type":"string"},"user_id":{"type":["integer","null"],"format":"int32"}}},"ZoomOAuthConnectionResponse":{"description":"A stored Zoom OAuth connection. Tokens are managed server-side and never exposed.","type":"object","required":["created_at","state","updated_at","uuid","zoom_user_id"],"properties":{"connection_failure_data":{"description":"Details about why the connection failed. Only present when `state` is `refresh_failed`."},"created_at":{"description":"Timestamp when the connection was first created.","type":"string","format":"partial-date-time"},"scopes":{"description":"OAuth scopes granted by the user during authorization (e.g. `user:read:user`).","type":["string","null"]},"state":{"description":"Connection state. `connected` means tokens are valid; `refresh_failed` means the token refresh failed and the user needs to re-authorize.","type":"string"},"updated_at":{"description":"Timestamp when the connection was last updated (e.g. token refresh).","type":"string","format":"partial-date-time"},"uuid":{"description":"Unique identifier for this connection.","type":"string","format":"uuid"},"zoom_account_id":{"description":"The Zoom account ID that the connected user belongs to.","type":["string","null"]},"zoom_user_id":{"description":"The Zoom user ID of the connected user. Use this value as `zoom_obf_token_user_id` when creating a bot to have the system automatically fetch an OBF token for this user.","type":"string"}}}}},"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Webhooks","description":"Webhooks allow you to receive real-time notifications when specific events occur in the Meeting BaaS system. To use webhooks, set a webhook URL in your account settings or provide it when creating a bot.","externalDocs":{"description":"Detailed webhook documentation","url":"https://docs.meetingbaas.com/webhooks"}}]}