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.

100ms Server-Side API is published by 100ms on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 8 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Rooms, Sessions, Recordings, Live Streams, and RTMP. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, SDKs, and 8 Naftiko capability specs.

Documentation

Specifications

SDKs

Other Resources

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