100ms Server-Side API

The 100ms Server-Side API is the unified REST control plane for the 100ms live video platform. It manages rooms (the persistent containers for a live session), templates and roles (policy), active rooms and peers (in-session control like kick/mute/message), recordings (composite and per-track), live streams (HLS output and RTMP ingest stream keys), external streams (push to YouTube/Twitch/Facebook Live), recording assets, room codes, polls, sessions, and an analytics API for querying webhook events, track events, recording events, error events, and peer quality stats. Authentication uses a short-lived management JWT (HS256) signed with an app access key + secret pair issued from the dashboard.

OpenAPI Specification

100ms-live-server-side-api-openapi.yml Raw ↑
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 <token>`.
  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/

# --- truncated at 32 KB (42 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/100ms-live/refs/heads/main/openapi/100ms-live-server-side-api-openapi.yml