openapi: 3.1.0 info: title: 100ms Server-Side API description: > REST control plane for the 100ms live video and audio platform. Manage rooms, templates and roles (policy), active in-session control, recordings, live streams (HLS), external streams (RTMP push to YouTube/Twitch/Facebook), RTMP stream keys, room codes, polls, sessions, and analytics. All endpoints are authenticated with a short-lived management JWT signed with the app access key/secret pair from the dashboard. version: v2 contact: name: 100ms Support url: https://www.100ms.live/contact-sales license: name: 100ms Terms of Service url: https://www.100ms.live/legal/terms-and-conditions servers: - url: https://api.100ms.live/v2 description: Production security: - ManagementToken: [] tags: - name: Rooms description: Persistent containers for a live session. - name: Active Rooms description: In-session control of running rooms and connected peers. - name: Sessions description: Historical sessions inside a room. - name: Policy description: Templates, roles, and recording configuration. - name: Recordings description: Composite and track-level recordings of sessions. - name: Recording Assets description: Output assets (mp4, mp3, transcript, chat) produced by recordings. - name: Live Streams description: HLS live streams driven from a 100ms room. - name: External Streams description: Push the room feed to YouTube / Twitch / Facebook via RTMP. - name: Stream Keys description: Per-room RTMP ingest stream keys. - name: Room Codes description: Short codes used by client apps to join a room. - name: Polls description: Real-time polls and quizzes inside a room. - name: Analytics description: Query webhook events, track events, recording events, errors, and peer quality. paths: /rooms: get: summary: List Rooms operationId: listRooms tags: [Rooms] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: enabled schema: { type: boolean } - in: query name: name schema: { type: string } responses: '200': { $ref: '#/components/responses/RoomList' } '401': { $ref: '#/components/responses/Unauthorized' } post: summary: Create Room operationId: createRoom tags: [Rooms] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/RoomCreate' } responses: '200': { $ref: '#/components/responses/Room' } '400': { $ref: '#/components/responses/BadRequest' } '401': { $ref: '#/components/responses/Unauthorized' } /rooms/{room_id}: parameters: - $ref: '#/components/parameters/RoomId' get: summary: Retrieve A Room operationId: retrieveRoom tags: [Rooms] responses: '200': { $ref: '#/components/responses/Room' } '404': { $ref: '#/components/responses/NotFound' } post: summary: Update A Room operationId: updateRoom tags: [Rooms] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/RoomUpdate' } responses: '200': { $ref: '#/components/responses/Room' } '400': { $ref: '#/components/responses/BadRequest' } /rooms/{room_id}/enabled: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Disable Or Enable A Room operationId: setRoomEnabled tags: [Rooms] requestBody: required: true content: application/json: schema: type: object required: [enabled] properties: enabled: { type: boolean } responses: '200': { $ref: '#/components/responses/Room' } /active-rooms/{room_id}: parameters: - $ref: '#/components/parameters/RoomId' get: summary: Retrieve Active Room operationId: retrieveActiveRoom tags: [Active Rooms] responses: '200': { $ref: '#/components/responses/ActiveRoom' } '404': { $ref: '#/components/responses/NotFound' } /active-rooms/{room_id}/end-room: parameters: - $ref: '#/components/parameters/RoomId' post: summary: End Active Room operationId: endActiveRoom tags: [Active Rooms] requestBody: required: true content: application/json: schema: type: object properties: reason: { type: string } lock: { type: boolean, description: When true, the room is disabled after end. } responses: '200': { $ref: '#/components/responses/Empty' } /active-rooms/{room_id}/peers: parameters: - $ref: '#/components/parameters/RoomId' get: summary: List Peers operationId: listPeers tags: [Active Rooms] responses: '200': { $ref: '#/components/responses/PeerList' } /active-rooms/{room_id}/peers/{peer_id}: parameters: - $ref: '#/components/parameters/RoomId' - in: path name: peer_id required: true schema: { type: string } get: summary: Retrieve A Peer operationId: retrievePeer tags: [Active Rooms] responses: '200': { $ref: '#/components/responses/Peer' } post: summary: Update A Peer operationId: updatePeer tags: [Active Rooms] requestBody: required: true content: application/json: schema: type: object properties: name: { type: string } role: { type: string } metadata: { type: string } responses: '200': { $ref: '#/components/responses/Peer' } /active-rooms/{room_id}/remove-peers: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Remove Peers operationId: removePeers tags: [Active Rooms] requestBody: required: true content: application/json: schema: type: object properties: peer_id: { type: string } role: { type: string } reason: { type: string } responses: '200': { $ref: '#/components/responses/Empty' } /active-rooms/{room_id}/send-message: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Send Message operationId: sendMessage tags: [Active Rooms] requestBody: required: true content: application/json: schema: type: object required: [message] properties: message: { type: string } type: { type: string } peer_id: { type: string } role: { type: string } responses: '200': { $ref: '#/components/responses/Empty' } /sessions: get: summary: List Sessions operationId: listSessions tags: [Sessions] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } - in: query name: active schema: { type: boolean } responses: '200': { $ref: '#/components/responses/SessionList' } /sessions/{session_id}: parameters: - in: path name: session_id required: true schema: { type: string } get: summary: Retrieve A Session operationId: retrieveSession tags: [Sessions] responses: '200': { $ref: '#/components/responses/Session' } /templates: get: summary: List Templates operationId: listTemplates tags: [Policy] responses: '200': { $ref: '#/components/responses/TemplateList' } post: summary: Create Template operationId: createTemplate tags: [Policy] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/TemplateCreate' } responses: '200': { $ref: '#/components/responses/Template' } /templates/{template_id}: parameters: - $ref: '#/components/parameters/TemplateId' get: summary: Retrieve A Template operationId: retrieveTemplate tags: [Policy] responses: '200': { $ref: '#/components/responses/Template' } post: summary: Update A Template operationId: updateTemplate tags: [Policy] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/TemplateCreate' } responses: '200': { $ref: '#/components/responses/Template' } /templates/{template_id}/roles/{role_name}: parameters: - $ref: '#/components/parameters/TemplateId' - in: path name: role_name required: true schema: { type: string } get: summary: Retrieve A Role operationId: retrieveRole tags: [Policy] responses: '200': { $ref: '#/components/responses/Role' } post: summary: Create Or Update A Role operationId: upsertRole tags: [Policy] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/Role' } responses: '200': { $ref: '#/components/responses/Role' } delete: summary: Delete A Role operationId: deleteRole tags: [Policy] responses: '200': { $ref: '#/components/responses/Empty' } /templates/{template_id}/destinations: parameters: - $ref: '#/components/parameters/TemplateId' get: summary: Retrieve Destinations operationId: retrieveDestinations tags: [Policy] responses: '200': description: Destinations object content: application/json: schema: { type: object } post: summary: Update Destinations operationId: updateDestinations tags: [Policy] requestBody: required: true content: application/json: schema: { type: object } responses: '200': description: Updated destinations content: application/json: schema: { type: object } /templates/{template_id}/settings: parameters: - $ref: '#/components/parameters/TemplateId' get: summary: Retrieve Settings operationId: retrieveSettings tags: [Policy] responses: '200': description: Settings object content: application/json: schema: { type: object } post: summary: Update Settings operationId: updateSettings tags: [Policy] requestBody: required: true content: application/json: schema: { type: object } responses: '200': description: Updated settings content: application/json: schema: { type: object } /recordings: get: summary: List All Recordings operationId: listRecordings tags: [Recordings] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } - in: query name: session_id schema: { type: string } - in: query name: status schema: { type: string, enum: [running, completed, failed, paused] } responses: '200': { $ref: '#/components/responses/RecordingList' } /recordings/{recording_id}: parameters: - in: path name: recording_id required: true schema: { type: string } get: summary: Get Recording operationId: getRecording tags: [Recordings] responses: '200': { $ref: '#/components/responses/Recording' } /recordings/room/{room_id}/start: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Start Recording For Room operationId: startRecordingForRoom tags: [Recordings] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/RecordingStart' } responses: '200': { $ref: '#/components/responses/Recording' } /recordings/room/{room_id}/stop: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Stop Recording For Room operationId: stopRecordingForRoom tags: [Recordings] responses: '200': { $ref: '#/components/responses/Empty' } /recordings/{recording_id}/stop: parameters: - in: path name: recording_id required: true schema: { type: string } post: summary: Stop Recording By Id operationId: stopRecordingById tags: [Recordings] responses: '200': { $ref: '#/components/responses/Empty' } /recordings/room/{room_id}/pause: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Pause Recording For Room operationId: pauseRecording tags: [Recordings] responses: '200': { $ref: '#/components/responses/Empty' } /recordings/room/{room_id}/resume: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Resume Recording For Room operationId: resumeRecording tags: [Recordings] responses: '200': { $ref: '#/components/responses/Empty' } /recording-assets: get: summary: List All Recording Assets operationId: listRecordingAssets tags: [Recording Assets] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } - in: query name: session_id schema: { type: string } - in: query name: type schema: { type: string } responses: '200': { $ref: '#/components/responses/RecordingAssetList' } /recording-assets/{asset_id}: parameters: - in: path name: asset_id required: true schema: { type: string } get: summary: Get Recording Asset operationId: getRecordingAsset tags: [Recording Assets] responses: '200': { $ref: '#/components/responses/RecordingAsset' } /recording-assets/{asset_id}/presigned-url: parameters: - in: path name: asset_id required: true schema: { type: string } get: summary: Get Presigned Url operationId: getRecordingAssetPresignedUrl tags: [Recording Assets] responses: '200': description: Presigned URL content: application/json: schema: type: object properties: url: { type: string, format: uri } expiry: { type: integer } /live-streams: get: summary: List All Live Streams operationId: listLiveStreams tags: [Live Streams] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } - in: query name: status schema: { type: string } responses: '200': { $ref: '#/components/responses/LiveStreamList' } /live-streams/{stream_id}: parameters: - in: path name: stream_id required: true schema: { type: string } get: summary: Get Live Stream operationId: getLiveStream tags: [Live Streams] responses: '200': { $ref: '#/components/responses/LiveStream' } /live-streams/room/{room_id}/start: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Start Live Stream For Room operationId: startLiveStreamForRoom tags: [Live Streams] requestBody: required: true content: application/json: schema: type: object properties: meeting_url: { type: string, format: uri } recording: type: object properties: hls_vod: { type: boolean } single_file_per_layer: { type: boolean } responses: '200': { $ref: '#/components/responses/LiveStream' } /live-streams/room/{room_id}/stop: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Stop Live Stream For Room operationId: stopLiveStreamForRoom tags: [Live Streams] responses: '200': { $ref: '#/components/responses/Empty' } /live-streams/{stream_id}/stop: parameters: - in: path name: stream_id required: true schema: { type: string } post: summary: Stop Live Stream By Id operationId: stopLiveStreamById tags: [Live Streams] responses: '200': { $ref: '#/components/responses/Empty' } /live-streams/{stream_id}/pause-recording: parameters: - in: path name: stream_id required: true schema: { type: string } post: summary: Pause Live Stream Recording operationId: pauseLiveStreamRecording tags: [Live Streams] responses: '200': { $ref: '#/components/responses/Empty' } /live-streams/{stream_id}/resume-recording: parameters: - in: path name: stream_id required: true schema: { type: string } post: summary: Resume Live Stream Recording operationId: resumeLiveStreamRecording tags: [Live Streams] responses: '200': { $ref: '#/components/responses/Empty' } /live-streams/{stream_id}/timed-metadata: parameters: - in: path name: stream_id required: true schema: { type: string } post: summary: Send Timed Metadata operationId: sendTimedMetadata tags: [Live Streams] requestBody: required: true content: application/json: schema: type: object properties: payload: { type: string } duration: { type: integer } responses: '200': { $ref: '#/components/responses/Empty' } /external-streams: get: summary: List All External Streams operationId: listExternalStreams tags: [External Streams] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } responses: '200': { $ref: '#/components/responses/ExternalStreamList' } /external-streams/{stream_id}: parameters: - in: path name: stream_id required: true schema: { type: string } get: summary: Get External Stream operationId: getExternalStream tags: [External Streams] responses: '200': { $ref: '#/components/responses/ExternalStream' } /external-streams/room/{room_id}/start: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Start External Stream For Room operationId: startExternalStreamForRoom tags: [External Streams] requestBody: required: true content: application/json: schema: type: object required: [rtmp_urls] properties: meeting_url: { type: string, format: uri } rtmp_urls: type: array items: { type: string } resolution: type: object properties: width: { type: integer } height: { type: integer } responses: '200': { $ref: '#/components/responses/ExternalStream' } /external-streams/room/{room_id}/stop: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Stop External Stream For Room operationId: stopExternalStreamForRoom tags: [External Streams] responses: '200': { $ref: '#/components/responses/Empty' } /external-streams/{stream_id}/stop: parameters: - in: path name: stream_id required: true schema: { type: string } post: summary: Stop External Stream By Id operationId: stopExternalStreamById tags: [External Streams] responses: '200': { $ref: '#/components/responses/Empty' } /stream-keys/room/{room_id}: parameters: - $ref: '#/components/parameters/RoomId' get: summary: Get Rtmp Stream Key operationId: getRtmpStreamKey tags: [Stream Keys] responses: '200': { $ref: '#/components/responses/StreamKey' } post: summary: Create Rtmp Stream Key operationId: createRtmpStreamKey tags: [Stream Keys] requestBody: required: true content: application/json: schema: type: object properties: role: { type: string } user_id: { type: string } ttl_seconds: { type: integer } responses: '200': { $ref: '#/components/responses/StreamKey' } delete: summary: Disable Rtmp Stream Key operationId: disableRtmpStreamKey tags: [Stream Keys] responses: '200': { $ref: '#/components/responses/Empty' } /room-codes/room/{room_id}: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Create Room Codes operationId: createRoomCodes tags: [Room Codes] responses: '200': { $ref: '#/components/responses/RoomCodeList' } get: summary: Get Room Codes operationId: getRoomCodes tags: [Room Codes] responses: '200': { $ref: '#/components/responses/RoomCodeList' } /room-codes/code/{code}: parameters: - in: path name: code required: true schema: { type: string } post: summary: Update Room Code operationId: updateRoomCode tags: [Room Codes] requestBody: required: true content: application/json: schema: type: object properties: enabled: { type: boolean } responses: '200': { $ref: '#/components/responses/RoomCode' } /polls: post: summary: Create Or Update Poll operationId: createOrUpdatePoll tags: [Polls] requestBody: required: true content: application/json: schema: { $ref: '#/components/schemas/Poll' } responses: '200': { $ref: '#/components/responses/Poll' } /polls/{poll_id}: parameters: - in: path name: poll_id required: true schema: { type: string } get: summary: Get Poll operationId: getPoll tags: [Polls] responses: '200': { $ref: '#/components/responses/Poll' } /polls/room/{room_id}/link: parameters: - $ref: '#/components/parameters/RoomId' post: summary: Link Poll With Room operationId: linkPollWithRoom tags: [Polls] requestBody: required: true content: application/json: schema: type: object required: [poll_ids] properties: poll_ids: type: array items: { type: string } responses: '200': { $ref: '#/components/responses/Empty' } /analytics/events: get: summary: List Webhook Events operationId: listWebhookEvents tags: [Analytics] parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Start' - in: query name: room_id schema: { type: string } - in: query name: session_id schema: { type: string } - in: query name: type schema: { type: string } responses: '200': { $ref: '#/components/responses/WebhookEventList' } /analytics/events/replay: post: summary: Replay Webhook Events operationId: replayWebhookEvents tags: [Analytics] requestBody: required: true content: application/json: schema: type: object properties: event_ids: type: array items: { type: string } room_id: { type: string } session_id: { type: string } responses: '200': { $ref: '#/components/responses/Empty' } /analytics/track-events: get: summary: List Track Events operationId: listTrackEvents tags: [Analytics] parameters: - in: query name: session_id schema: { type: string } - in: query name: peer_id schema: { type: string } responses: '200': description: Track events content: application/json: schema: { type: object } /analytics/recording-events: get: summary: List Recording Events operationId: listRecordingEvents tags: [Analytics] parameters: - in: query name: session_id schema: { type: string } - in: query name: recording_id schema: { type: string } responses: '200': description: Recording events content: application/json: schema: { type: object } /analytics/error-events: get: summary: List Error Events operationId: listErrorEvents tags: [Analytics] parameters: - in: query name: session_id schema: { type: string } responses: '200': description: Error events content: application/json: schema: { type: object } /analytics/peer-quality: get: summary: Get Peer Quality Stats operationId: getPeerQualityStats tags: [Analytics] parameters: - in: query name: session_id schema: { type: string } - in: query name: peer_id schema: { type: string } responses: '200': description: Peer quality stats content: application/json: schema: { type: object } components: securitySchemes: ManagementToken: type: http scheme: bearer bearerFormat: JWT description: > Short-lived HS256 JWT generated server-side from the app access key/secret downloaded from the 100ms dashboard. Include as `Authorization: Bearer `. parameters: Limit: in: query name: limit schema: { type: integer, default: 10, maximum: 100 } Start: in: query name: start schema: { type: string, description: Cursor returned by the previous page. } RoomId: in: path name: room_id required: true schema: { type: string } TemplateId: in: path name: template_id required: true schema: { type: string } responses: Empty: description: Successful empty response content: application/json: schema: { type: object } BadRequest: description: Bad request content: application/json: schema: { $ref: '#/components/schemas/Error' } Unauthorized: description: Unauthorized content: application/json: schema: { $ref: '#/components/schemas/Error' } NotFound: description: Not found content: application/json: schema: { $ref: '#/components/schemas/Error' } Room: description: Room content: application/json: schema: { $ref: '#/components/schemas/Room' } RoomList: description: Page of rooms content: application/json: schema: { $ref: '#/components/schemas/RoomList' } ActiveRoom: description: Active room content: application/json: schema: { $ref: '#/components/schemas/ActiveRoom' } Peer: description: Peer content: application/json: schema: { $ref: '#/components/schemas/Peer' } PeerList: description: List of peers in the active room (peer_id keyed object). content: application/json: schema: type: object additionalProperties: { $ref: '#/components/schemas/Peer' } Session: description: Session content: application/json: schema: { $ref: '#/components/schemas/Session' } SessionList: description: Page of sessions content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/Session' } last: { type: string } limit: { type: integer } Template: description: Template content: application/json: schema: { $ref: '#/components/schemas/Template' } TemplateList: description: Page of templates content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/Template' } last: { type: string } limit: { type: integer } Role: description: Role content: application/json: schema: { $ref: '#/components/schemas/Role' } Recording: description: Recording content: application/json: schema: { $ref: '#/components/schemas/Recording' } RecordingList: description: Page of recordings content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/Recording' } last: { type: string } limit: { type: integer } RecordingAsset: description: Recording asset content: application/json: schema: { $ref: '#/components/schemas/RecordingAsset' } RecordingAssetList: description: Page of recording assets content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/RecordingAsset' } last: { type: string } limit: { type: integer } LiveStream: description: Live stream content: application/json: schema: { $ref: '#/components/schemas/LiveStream' } LiveStreamList: description: Page of live streams content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/LiveStream' } last: { type: string } limit: { type: integer } ExternalStream: description: External (RTMP-out) stream content: application/json: schema: { $ref: '#/components/schemas/ExternalStream' } ExternalStreamList: description: Page of external streams content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/ExternalStream' } last: { type: string } limit: { type: integer } StreamKey: description: RTMP stream key content: application/json: schema: { $ref: '#/components/schemas/StreamKey' } RoomCode: description: Room code content: application/json: schema: { $ref: '#/components/schemas/RoomCode' } RoomCodeList: description: List of room codes (one per role). content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/RoomCode' } Poll: description: Poll content: application/json: schema: { $ref: '#/components/schemas/Poll' } WebhookEventList: description: Page of webhook events content: application/json: schema: type: object properties: data: type: array items: { $ref: '#/components/schemas/WebhookEvent' } last: { type: string } limit: { type: integer } schemas: Error: type: object properties: code: { type: integer } message: { type: string } id: { type: string } Room: type: object properties: id: { type: string } name: { type: string } enabled: { type: boolean } description: { type: string } customer_id: { type: string } app_id: { type: string } recording_info: type: object properties: enabled: { type: boolean } upload_info: { type: object } template_id: { type: string } template: { type: string } region: { type: string, enum: [in, us, eu, auto] } size: { type: integer } max_duration_seconds: { type: integer } large_room: { type: boolean } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } customer: { type: string } RoomCreate: type: object properties: name: { type: string } description: { type: string } template_id: { type: string } region: { type: string, enum: [in, us, eu, auto] } recording_info: { type: object } size: { type: integer } max_duration_seconds: { type: integer } large_room: { type: boolean } webhook: type: object properties: url: { type: string, format: uri } RoomUpdate: type: object properties: name: { type: string } description: { type: string } template_id: { type: string } recording_info: { type: object } size: { type: integer } max_duration_seconds: { type: integer } RoomList: type: object properties: data: type: array items: { $ref: '#/components/schemas/Room' } last: { type: string } limit: { type: integer } ActiveRoom: type: object properties: id: { type: string } name: { type: string } session_id: { type: string } recording: type: object properties: running: { type: boolean } streaming: type: object properties: running: { type: boolean } peers: type: object additionalProperties: { $ref: '#/components/schemas/Peer' } Peer: type: object properties: id: { type: string } name: { type: string } user_id: { type: string } metadata: { type: string } role: { type: string } joined_at: { type: string, format: date-time } tracks: type: object additionalProperties: { type: object } Session: type: object properties: id: { type: string } room_id: { type: string } room_name: { type: string } active: { type: boolean } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } peers: type: array items: { $ref: '#/components/schemas/Peer' } template_id: { type: string } Template: type: object properties: id: { type: string } name: { type: string } customer_id: { type: string } roles: type: object additionalProperties: { $ref: '#/components/schemas/Role' } settings: { type: object } destinations: { type: object } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } TemplateCreate: type: object properties: name: { type: string } roles: type: object additionalProperties: { $ref: '#/components/schemas/Role' } settings: { type: object } destinations: { type: object } Role: type: object properties: name: { type: string } publishParams: type: object properties: allowed: type: array items: { type: string, enum: [audio, video, screen] } audio: { type: object } video: { type: object } screen: { type: object } subscribeParams: type: object properties: subscribeToRoles: type: array items: { type: string } maxSubsBitRate: { type: integer } permissions: type: object properties: endRoom: { type: boolean } removeOthers: { type: boolean } mute: { type: boolean } unmute: { type: boolean } changeRole: { type: boolean } sendRoomState: { type: boolean } hlsStreaming: { type: boolean } rtmpStreaming: { type: boolean } browserRecording: { type: boolean } pollWrite: { type: boolean } pollRead: { type: boolean } sendMessage: { type: boolean } priority: { type: integer } maxPeerCount: { type: integer } Recording: type: object properties: id: { type: string } room_id: { type: string } session_id: { type: string } status: { type: string, enum: [queued, init, running, paused, completed, failed] } created_at: { type: string, format: date-time } started_at: { type: string, format: date-time } stopped_at: { type: string, format: date-time } stopped_by: { type: string } duration: { type: integer } size: { type: integer } recording_assets: type: array items: { $ref: '#/components/schemas/RecordingAsset' } RecordingStart: type: object properties: meeting_url: { type: string, format: uri } resolution: type: object properties: width: { type: integer } height: { type: integer } recording: type: object properties: hls_vod: { type: boolean } single_file_per_layer: { type: boolean } RecordingAsset: type: object properties: id: { type: string } type: { type: string, enum: [room-composite, room-vod, transcript, chat-log, summary] } path: { type: string } format: { type: string } size: { type: integer } duration: { type: integer } room_id: { type: string } session_id: { type: string } recording_id: { type: string } created_at: { type: string, format: date-time } LiveStream: type: object properties: id: { type: string } room_id: { type: string } session_id: { type: string } status: { type: string, enum: [queued, init, running, paused, completed, failed] } url: { type: string, format: uri, description: HLS playback URL (master.m3u8). } playback_id: { type: string } created_at: { type: string, format: date-time } started_at: { type: string, format: date-time } stopped_at: { type: string, format: date-time } recording: type: object properties: enabled: { type: boolean } assets: type: array items: { $ref: '#/components/schemas/RecordingAsset' } ExternalStream: type: object properties: id: { type: string } room_id: { type: string } session_id: { type: string } status: { type: string } rtmp_urls: type: array items: { type: string } started_at: { type: string, format: date-time } stopped_at: { type: string, format: date-time } StreamKey: type: object properties: key: { type: string } url: { type: string, format: uri, description: RTMP ingest URL (rtmp://rtmp-in.100ms.live/live). } role: { type: string } user_id: { type: string } expires_at: { type: string, format: date-time } RoomCode: type: object properties: code: { type: string } room_id: { type: string } role: { type: string } enabled: { type: boolean } created_at: { type: string, format: date-time } Poll: type: object properties: id: { type: string } title: { type: string } type: { type: string, enum: [poll, quiz] } anonymous: { type: boolean } questions: type: array items: type: object properties: index: { type: integer } text: { type: string } type: { type: string, enum: [single-choice, multiple-choice, short-answer, long-answer] } options: type: array items: type: object properties: index: { type: integer } text: { type: string } is_correct_answer: { type: boolean } state: { type: string, enum: [draft, started, stopped] } created_at: { type: string, format: date-time } WebhookEvent: type: object properties: id: { type: string } version: { type: string } type: { type: string, description: 'Examples: session.open, session.close, peer.join, peer.leave, beam.started, beam.recording.success, hls.started, hls.stopped, hls.recording.success, rtmp.started, rtmp.failed, recording.success, recording.failed, transcription.success.' } timestamp: { type: string, format: date-time } data: { type: object }