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