openapi: 3.0.1
info:
    version: v1
    title: OpenVidu Meet REST API
    description: >
        The OpenVidu Meet REST API allows seamless integration of OpenVidu Meet rooms into your application.
        This REST API provides endpoints to manage rooms and recordings in OpenVidu Meet.
    termsOfService: https://openvidu.io/conditions/terms-of-service/
    contact:
        name: OpenVidu
        email: commercial@openvidu.io
        url: https://openvidu.io/support/

servers:
    - url: http://localhost:6080/meet/api/v1
      description: Development server

tags:
    - name: OpenVidu Meet - Room
      description: Operations related to managing OpenVidu Meet rooms
    - name: OpenVidu Meet - Recordings
      description: Operations related to managing OpenVidu Meet recordings
    # - name: OpenVidu Meet - Participant
    #   description: Operations related to managing participants in OpenVidu Meet rooms
    # - name: Internal API - Room
    #   description: Operations related to managing OpenVidu Meet rooms
    - name: Internal API - Participant
      description: Operations related to managing participants in OpenVidu Meet rooms
    - name: Internal API - Recordings
      description: Operations related to managing OpenVidu Meet recordings

paths:
    /rooms:
        post:
            operationId: createRoom
            summary: Create a new OpenVidu Meet room
            description: >
                Creates a new OpenVidu Meet room with the specified expiration date.
                The room will be available for participants to join using the generated URLs.
            tags:
                - OpenVidu Meet - Room
            security:
                - apiKeyInHeader: []
            requestBody:
                description: Room configuration options
                content:
                    application/json:
                        schema:
                            $ref: '#/components/schemas/OpenViduMeetRoomOptions'
                            examples:
                                default:
                                    value:
                                        expirationDate: 1620000000000
                                        roomNamePrefix: 'OpenVidu'
                                        maxParticipants: 10
                                        preferences:
                                            chatPreferences:
                                                enabled: true
                                            recordingPreferences:
                                                enabled: true
                                            virtualBackgroundPreferences:
                                                enabled: true
                                withNestedAttributes:
                                    summary: Room creation with nested preferences
                                    value:
                                        expirationDate: 1620000000000
                                        roomNamePrefix: 'OpenVidu'
                                        maxParticipants: 15
                                        preferences:
                                            chatPreferences:
                                                enabled: true
                                            recordingPreferences:
                                                enabled: false
                                            virtualBackgroundPreferences:
                                                enabled: true
            responses:
                '200':
                    description: Successfully generated the OpenVidu Meet room
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/OpenViduMeetRoom'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '422':
                    description: Unprocessable Entity — The request body is invalid
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    error:
                                        type: string
                                        example: 'Unprocessable Entity'
                                    message:
                                        type: string
                                        example: 'Invalid request body'
                                    details:
                                        type: array
                                        items:
                                            type: object
                                            properties:
                                                field:
                                                    type: string
                                                    example: 'expirationDate'
                                                message:
                                                    type: string
                                                    example: 'Expected number, received string'
                            example:
                                error: 'Unprocessable Entity'
                                message: 'Invalid request body'
                                details:
                                    - field: 'expirationDate'
                                      message: 'Expected number, received string'
                                    - field: 'roomNamePrefix'
                                      message: 'Expected string, received number'
                '415':
                    description: 'Unsupported Media Type'
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unsupported Media Type'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Internal server error'
        get:
            operationId: getRooms
            summary: Get a list of OpenVidu Meet rooms
            description: >
                Retrieves a list of OpenVidu Meet rooms that are currently active.
                You can specify a comma-separated list of fields (using the "fields" query parameter) to include only
                those properties in the response (e.g. roomName, preferences).
            tags:
                - OpenVidu Meet - Room
            security:
                - apiKeyInHeader: []
            parameters:
                - name: fields
                  in: query
                  required: false
                  description: |
                      Comma-separated list of fields to include in the response.
                      For example: "roomName,preferences". Only allowed fields will be returned.
                  schema:
                      type: string
                - name: page
                  in: query
                  required: false
                  description: The page number for pagination (default is 1).
                  schema:
                      type: integer
                      default: 1
                - name: limit
                  in: query
                  required: false
                  description: The number of rooms per page (default is 10).
                  schema:
                      type: integer
                      default: 10
            responses:
                '200':
                    description: Successfully retrieved the list of OpenVidu Meet rooms
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    rooms:
                                        type: array
                                        items:
                                        $ref: '#/components/schemas/OpenViduMeetRoom'
                                    pagination:
                                        type: object
                                        properties:
                                            totalItems:
                                                type: integer
                                                description: Total number of rooms.
                                            totalPages:
                                                type: integer
                                                description: Total number of pages.
                                            currentPage:
                                                type: integer
                                                description: Current page number.

                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'
    /rooms/{roomName}:
        get:
            operationId: getRoom
            summary: Get details of an OpenVidu Meet room
            description: >
                Retrieves the details of an OpenVidu Meet room with the specified room name.
                Additionally, you can specify a comma-separated list of fields (using the "fields" query parameter)
                to include only those properties in the response (e.g. roomName, preferences).
            tags:
                - OpenVidu Meet - Room
            security:
                - apiKeyInHeader: []
            parameters:
                - name: roomName
                  in: path
                  required: true
                  description: The name of the room to retrieve
                  schema:
                      type: string
                - name: fields
                  in: query
                  required: false
                  description: |
                      Comma-separated list of fields to include in the response.
                      For example: "roomName,preferences". Only allowed fields will be returned.
                  schema:
                      type: string
            responses:
                '200':
                    description: Successfully retrieved the OpenVidu Meet room
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/OpenViduMeetRoom'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Room not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 404
                                message: 'Room not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'
        put:
            operationId: updateRoom
            summary: Update an OpenVidu Meet room
            description: >
                Updates the preferences of an OpenVidu Meet room with the specified room name.
            tags:
                - OpenVidu Meet - Room
            security:
                - apiKeyInHeader: []
            parameters:
                - name: roomName
                  in: path
                  required: true
                  description: The name of the room to update
                  schema:
                      type: string
            requestBody:
                description: Room preferences to update
                content:
                    application/json:
                        schema:
                            $ref: '#/components/schemas/RoomPreferences'
                            examples:
                                default:
                                    value:
                                        preferences:
                                            chatPreferences:
                                                enabled: true
                                            recordingPreferences:
                                                enabled: true
                                            virtualBackgroundPreferences:
                                                enabled: true
            responses:
                '200':
                    description: Successfully updated the OpenVidu Meet room
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/OpenViduMeetRoom'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Room not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 404
                                message: 'Room not found'
                '422':
                    description: Unprocessable Entity — The request body is invalid
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    error:
                                        type: string
                                        example: 'Unprocessable Entity'
                                    message:
                                        type: string
                                        example: 'Invalid request body'
                                    details:
                                        type: array
                                        items:
                                            type: object
                                            properties:
                                                field:
                                                    type: string
                                                    example: 'recordingPreferences'
                                                message:
                                                    type: string
                                                    example: 'Expected boolean, received string'
        delete:
            operationId: deleteRoom
            summary: Delete an OpenVidu Meet room
            description: >
                Deletes an OpenVidu Meet room with the specified room name.
            tags:
                - OpenVidu Meet - Room
            security:
                - apiKeyInHeader: []
            parameters:
                - name: roomName
                  in: path
                  required: true
                  description: The name of the room to delete
                  schema:
                      type: string
            responses:
                '204':
                    description: Successfully deleted the OpenVidu Meet room
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Room not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 404
                                message: 'Room not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'
    /recordings:
        post:
            operationId: createRecording
            summary: Start a recording
            description: >
                Start a new recording for an OpenVidu Meet room with the specified room ID.
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            requestBody:
                description: Recording details
                content:
                    application/json:
                        schema:
                            type: object
                            required:
                                - roomId
                            properties:
                                roomId:
                                    type: string
                                    example: 'room-123'
                                    description: >
                                        The unique identifier of the room to record.

            responses:
                '200':
                    description: Successfully created the OpenVidu Meet recording
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/MeetRecording'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Room not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Room Error'
                                message: 'The room "room-123" does not exist'
                '409':
                    description: Conflict — The room is already being recorded
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'The room "room-123" is already being recorded'
                '422':
                    description: Unprocessable Entity — The request body is invalid
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    error:
                                        type: string
                                        example: 'Unprocessable Entity'
                                    message:
                                        type: string
                                        example: 'Invalid request body'
                                    details:
                                        type: array
                                        items:
                                            type: object
                                            properties:
                                                field:
                                                    type: string
                                                    example: 'roomId'
                                                message:
                                                    type: string
                                                    example: 'roomId not found'
                            example:
                                error: 'Unprocessable Entity'
                                message: 'Invalid request body'
                                details:
                                    - field: 'roomId'
                                      example: 'roomId not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Unexpected Error'
                                message: 'Something went wrong'
        get:
            operationId: getRecordings
            summary: Get all recordings
            description: >
                Retrieves a paginated list of all recordings available in the system.
                You can apply filters to narrow down the results based on specific criteria.
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: status
                  in: query
                  required: false
                  description: |
                      Filter recordings by their status.

                      Possible values:
                      - `STARTING`
                      - `ACTIVE`
                      - `ENDING`
                      - `COMPLETE`
                      - `FAILED`
                      - `ABORTED`
                      - `LIMITED_REACHED`

                      You can provide multiple statuses as a comma-separated list (e.g., `status=ACTIVE,FAILED`).
                      If not specified, recordings with any status will be returned.

                      > ⚠️ **Note:** Using this filter may impact performance for large datasets.
                  schema:
                      type: string
                - name: roomId
                  in: query
                  required: false
                  description: |
                      The unique identifier of the room for which you want to retrieve recordings.
                      If not provided, recordings from all rooms will be returned.
                  schema:
                      type: string
                - name: maxItems
                  in: query
                  required: false
                  description: The number of recordings per page (default is 10). Maximum is 100.
                  schema:
                      type: integer
                      default: 10
                - name: nextPageToken
                  in: query
                  required: false
                  description: The token to retrieve the next page of recordings.
                  schema:
                      type: string
            responses:
                '200':
                    description: Successfully retrieved the recording list
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    recordings:
                                        type: array
                                        items:
                                        $ref: '#/components/schemas/MeetRecording'
                                    pagination:
                                        type: object
                                        properties:
                                            isTruncated:
                                                type: boolean
                                                description: Indicates if there are more recordings to retrieve.
                                            nextPageToken:
                                                type: string
                                                description: The token to retrieve the next page of recordings.

                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'
        delete:
            operationId: bulkDeleteRecordings
            summary: Bulk delete recordings
            description: >
                Deletes multiple recordings at once with the specified recording IDs.
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: recordingIds
                  in: query
                  required: true
                  description: |
                      The unique IDs of the recordings to delete.
                      You can provide multiple recording IDs as a comma-separated list (e.g., `recordingIds=room-123--EG_XYZ--XX445,room-123--EG_XYZ--XX446`).
                  schema:
                      type: string
            responses:
                '200':
                    description: Bulk deletion completed. Includes lists of successfully deleted IDs and errors.
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    deleted:
                                        type: array
                                        items:
                                            type: string
                                        description: List of successfully deleted recording IDs.
                                        example:
                                            - 'room-123--EG_XYZ--XX445'
                                            - 'room-123--EG_XYZ--XX446'
                                    notDeleted:
                                        type: array
                                        description: List of recordings that could not be deleted along with the corresponding error messages.
                                        items:
                                            type: object
                                            properties:
                                                recordingId:
                                                    type: string
                                                    description: The unique identifier of the recording that was not deleted.
                                                    example: 'room-123--EG_XYZ--XX447'
                                                error:
                                                    type: string
                                                    description: A message explaining why the deletion failed.
                                                    example: 'Recording not found'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '422':
                    description: Unprocessable Entity — The request body is invalid
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    error:
                                        type: string
                                        example: 'Unprocessable Entity'
                                    message:
                                        type: string
                                        example: 'Invalid request body'
                                    details:
                                        type: array
                                        items:
                                            type: object
                                            properties:
                                                field:
                                                    type: string
                                                    example: 'recordingIds'
                                                message:
                                                    type: string
                                                    example: 'recordingIds not found'
                            example:
                                error: 'Unprocessable Entity'
                                message: 'Invalid request body'
                                details:
                                    - field: 'recordingIds'
                                      example: 'recordingIds not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Unexpected Error'
                                message: 'Something went wrong'
    /recordings/{recordingId}:
        put:
            operationId: stopRecording
            summary: Stop a recording
            description: >
                Stops a recording with the specified recording ID.
                The recording must be in an `ACTIVE` state; otherwise, a 409 error is returned.
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: recordingId
                  in: path
                  required: true
                  description: The unique identifier of the recording to stop.
                  schema:
                      type: string
                      example: 'room-123--EG_XYZ--XX445'
            responses:
                '200':
                    description: Successfully stopped the recording.
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/MeetRecording'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Recording not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'Recording "room-123--EG_XYZ--XX445" not found'
                '409':
                    description: Conflict — The recording is already stopped.
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'Recording "room-123--EG_XYZ--XX445" is already stopped'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Unexpected Error'
                                message: 'Something went wrong'
        get:
            operationId: getRecording
            summary: Get a recording
            description: >
                Retrieves the details of a recording with the specified recording ID.
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: recordingId
                  in: path
                  required: true
                  description: The unique identifier of the recording to retrieve
                  schema:
                      type: string
                      example: 'room-123--EG_XYZ--XX445'
            responses:
                '200':
                    description: Successfully retrieved the recording.
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/MeetRecording'

                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Recording not found — The recording with the specified ID was not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'Recording "room-123--EG_XYZ--XX445" not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Unexpected Error'
                                message: 'Something went wrong'
        delete:
            operationId: deleteRecording
            summary: Delete a recording
            description: >
                Deletes a recording with the specified recording.
                The recording will only be deleted if it exists and is not in progress (i.e., not in a state such as `ACTIVE`, `STARTING`, or `ENDING`).
            tags:
                - OpenVidu Meet - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: recordingId
                  in: path
                  required: true
                  description: The unique identifier of the recording to delete.
                  schema:
                      type: string
                      example: 'room-123--EG_XYZ--XX445'
            responses:
                '204':
                    description: Recording successfully deleted. No content is returned.
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Recording not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'Recording "room-123--EG_XYZ--XX445" not found'
                '409':
                    description: Conflict — The recording is in progress
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Recording Error'
                                message: 'Recording "room-123--EG_XYZ--XX445" is in progress'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                name: 'Unexpected Error'
                                message: 'Something went wrong'
    /recordings/{recordingId}/stream:
        get:
            operationId: getRecordingStream
            summary: Stream an OpenVidu Meet recording
            description: >
                Streams the OpenVidu Meet recording with the specified recording ID.
                This endpoint supports range requests, allowing partial content retrieval
                for video playback without downloading the entire file.
            tags:
                - Internal API - Recordings
            security:
                - apiKeyInHeader: []
            parameters:
                - name: recordingId
                  in: path
                  required: true
                  description: The ID of the recording to stream
                  schema:
                      type: string
                - name: Range
                  in: header
                  required: false
                  description: >
                      Byte range for partial content retrieval.
                      Example: `bytes=0-1023` to request the first 1024 bytes of the file.
                  schema:
                      type: string
            responses:
                '200':
                    description: Successfully streaming the full recording
                    headers:
                        Accept-Ranges:
                            description: Indicates that byte-range requests are supported
                            schema:
                                type: string
                        Content-Length:
                            description: The total file size in bytes
                            schema:
                                type: integer
                    content:
                        video/mp4:
                            schema:
                                type: string
                                format: binary
                '206':
                    description: Partial content streaming based on byte range
                    headers:
                        Accept-Ranges:
                            description: Indicates that byte-range requests are supported
                            schema:
                                type: string
                        Content-Range:
                            description: Specifies the range of bytes being sent
                            schema:
                                type: string
                        Content-Length:
                            description: The length of the partial content in bytes
                            schema:
                                type: integer
                    content:
                        video/mp4:
                            schema:
                                type: string
                                format: binary
                '400':
                    description: Bad Request — Invalid range header format
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 400
                                message: 'Invalid Range header'
                '401':
                    description: Unauthorized — The API key is missing or invalid
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Unauthorized'
                '404':
                    description: Recording not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 404
                                message: 'Recording not found'
                '416':
                    description: Requested range not satisfiable
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 416
                                message: 'Requested range not satisfiable'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'

    /participants/token:
        post:
            operationId: generateParticipantToken
            summary: Generate a token for a participant
            description: >
                Generates a token for a participant to join an OpenVidu Meet room.
            tags:
                - Internal API - Participant
            requestBody:
                description: Participant details
                content:
                    application/json:
                        schema:
                            type: object
                            required:
                                - roomName
                                - participantName
                                - secret
                            properties:
                                roomName:
                                    type: string
                                    example: 'OpenVidu-123456'
                                    description: >
                                        The name of the room to join.
                                participantName:
                                    type: string
                                    example: 'Alice'
                                    description: >
                                        The name of the participant.
                                secret:
                                    type: string
                                    example: 'abc123456'
                                    description: >
                                        The secret token from the room Url
            responses:
                '200':
                    description: Successfully generated the participant token
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    token:
                                        type: string
                                        example: 'token_123456'
                                        description: >
                                            The token to authenticate the participant.
                '404':
                    description: Room not found
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    name:
                                        type: string
                                        example: 'Room not found'
                                    message:
                                        type: string
                                        example: 'The room does not exist'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                message: 'Internal server error'
    /participants/{participantName}:
        delete:
            operationId: disconnectParticipant
            summary: Delete a participant from a room
            description: >
                Deletes a participant from an OpenVidu Meet room.
            tags:
                - Internal API - Participant
            security:
                - apiKeyInHeader: []
            parameters:
                - name: participantName
                  in: path
                  required: true
                  description: The name of the participant to delete
                  schema:
                      type: string
                - name: roomName
                  in: query
                  required: true
                  description: The name of the room from which to delete the participant
                  schema:
                      type: string
            responses:
                '204':
                    description: Successfully disconnect the participant
                '404':
                    description: Participant not found
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 404
                                message: 'Participant not found'
                '500':
                    description: Internal server error
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/Error'
                            example:
                                code: 500
                                message: 'Internal server error'
components:
    securitySchemes:
        apiKeyInHeader:
            type: apiKey
            name: X-API-KEY
            in: header
            description: >
                The API key to authenticate the request. This key is required to access the OpenVidu Meet API.
        jwtInCookie:
            type: apiKey
            name: OvMeetAccessToken
            in: cookie
            description: >
                The JWT token to authenticate the request in case of consuming the API from the OpenVidu Meet admin console.
    schemas:
        OpenViduMeetRoomOptions:
            type: object
            required:
                - expirationDate
            properties:
                expirationDate:
                    type: number
                    example: 1620000000000
                    description: >
                        The expiration date of the room in milliseconds since the Unix epoch.
                        After this date, the room will be closed and no new participants will be allowed to join.
                roomNamePrefix:
                    type: string
                    example: 'OpenVidu'
                    description: >
                        A prefix to be used for the room name. The room name will be generated by appending a random
                        alphanumeric string to this prefix.
                maxParticipants:
                    type: integer
                    example: 10
                    description: >
                        The maximum number of participants allowed in the room. If the number of participants exceeds
                        this limit, new participants will not be allowed to join.
                preferences:
                    $ref: '#/components/schemas/RoomPreferences'
                    description: >
                        The preferences for the room.
        RoomPreferences:
            type: object
            properties:
                chatPreferences:
                    $ref: '#/components/schemas/ChatPreferences'
                    description: >
                        Preferences for the chat feature in the room.

                recordingPreferences:
                    $ref: '#/components/schemas/RecordingPreferences'
                    description: >
                        Preferences for recording the room.

                virtualBackgroundPreferences:
                    $ref: '#/components/schemas/VirtualBackgroundPreferences'
                    description: >
                        Preferences for virtual background in the room.
        ChatPreferences:
            type: object
            properties:
                enabled:
                    type: boolean
                    default: true
                    example: true
                    description: >
                        If true, the room will be allowed to send and receive chat messages.
        RecordingPreferences:
            type: object
            properties:
                enabled:
                    type: boolean
                    default: true
                    example: true
                    description: >
                        If true, the room will be allowed to record the video of the participants.
        VirtualBackgroundPreferences:
            type: object
            properties:
                enabled:
                    type: boolean
                    default: true
                    example: true
                    description: >
                        If true, the room will be allowed to use virtual background.
        OpenViduMeetRoom:
            type: object
            properties:
                roomName:
                    type: string
                    example: 'OpenVidu-123456'
                    description: >
                        The name of the room. This name is generated by appending a random alphanumeric string to the
                        room name prefix specified in the request.
                creationDate:
                    type: number
                    example: 1620000000000
                    description: >
                        The creation date of the room in milliseconds since the Unix epoch.
                expirationDate:
                    type: number
                    example: 1620000000000
                    description: >
                        The expiration date of the room in milliseconds since the Unix epoch.
                        After this date, the room will be closed and no new participants will be allowed to join.
                roomNamePrefix:
                    type: string
                    example: 'OpenVidu'
                    description: >
                        The prefix used for the room name. The room name is generated by appending a random alphanumeric
                        string to this prefix.
                preferences:
                    $ref: '#/components/schemas/RoomPreferences'
                    description: >
                        The preferences for the room.
                maxParticipants:
                    type: integer
                    example: 10
                    description: >
                        The maximum number of participants allowed in the room. If the number of participants exceeds
                        this limit, new participants will not be allowed to join.
                moderatorURL:
                    type: string
                    example: 'http://localhost:6080/meet/OpenVidu-123456/?secret=tok_123456'
                    description: >
                        The URL for the moderator to join the room. The moderator has special permissions to manage the
                        room and participants.
                publisherURL:
                    type: string
                    example: 'http://localhost:6080/meet/OpenVidu-123456/?secret=tok_123456'
                    description: >
                        The URL for the publisher to join the room. The publisher has permissions to publish audio and
                        video streams to the room.
                viewerURL:
                    type: string
                    example: 'http://localhost:6080/meet/OpenVidu-123456/?secret=tok_123456'
                    description: >
                        The URL for the viewer to join the room. The viewer has read-only permissions to watch the room
                        and participants.
        MeetRecording:
            type: object
            properties:
                recordingId:
                    type: string
                    example: 'room-123--EG_XYZ--XX445'
                    description: >
                        The unique identifier of the recording.
                roomId:
                    type: string
                    example: 'room-123'
                    description: >
                        The ID of the room where the recording was made.
                outputMode:
                    type: string
                    example: 'COMPOSED'
                    description: >
                        The output mode of the recording. Possible values are "COMPOSED".
                status:
                    type: string
                    example: 'ACTIVE'
                    description: >
                        The status of the recording.

                          Possible values:
                          - `STARTING`
                          - `ACTIVE`
                          - `ENDING`
                          - `COMPLETE`
                          - `FAILED`
                          - `ABORTED`
                          - `LIMITED_REACHED`

                filename:
                    type: string
                    example: 'room-123--XX445.mp4'
                    description: >
                        The name of the recording file.
                startDate:
                    type: number
                    example: 1620000000000
                    description: >
                        The date when the recording was started in milliseconds since the Unix epoch.
                endDate:
                    type: number
                    example: 1620000000000
                    description: >
                        The date when the recording was stopped in milliseconds since the Unix epoch.
                duration:
                    type: number
                    example: 3600
                    description: >
                        The duration of the recording in seconds.
                size:
                    type: number
                    example: 1024
                    description: >
                        The size of the recording file in bytes.
                errorCode:
                    type: number
                    example: 100
                    description: >
                        The error code of the recording.
                error:
                    type: string
                    example: 'error'
                    description: >
                        The error message of the recording.
                details:
                    type: string
                    example: 'Stopped using API'
                    description: >
                        Additional details about the recording.
        Error:
            type: object
            required:
                - message
            properties:
                name:
                    type: string
                message:
                    type: string
