diff --git a/backend/openapi/openvidu-meet-api.yaml b/backend/openapi/openvidu-meet-api.yaml index b0687dc..27f20e2 100644 --- a/backend/openapi/openvidu-meet-api.yaml +++ b/backend/openapi/openvidu-meet-api.yaml @@ -33,6 +33,7 @@ paths: - OpenVidu Meet - Room security: - apiKeyInHeader: [] + - accessTokenCookie: [] requestBody: description: Room configuration options content: @@ -73,13 +74,21 @@ paths: schema: $ref: '#/components/schemas/OpenViduMeetRoom' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '422': description: Unprocessable Entity — The request body is invalid content: @@ -139,6 +148,7 @@ paths: - OpenVidu Meet - Room security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: fields in: query @@ -173,7 +183,7 @@ paths: rooms: type: array items: - $ref: '#/components/schemas/OpenViduMeetRoom' + $ref: '#/components/schemas/OpenViduMeetRoom' pagination: type: object properties: @@ -188,13 +198,21 @@ paths: description: Current page number. '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '500': description: Internal server error content: @@ -216,6 +234,8 @@ paths: - OpenVidu Meet - Room security: - apiKeyInHeader: [] + - accessTokenCookie: [] + - participantTokenCookie: [] parameters: - name: roomName in: path @@ -239,13 +259,21 @@ paths: schema: $ref: '#/components/schemas/OpenViduMeetRoom' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access/participant token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The participant authenticated with the access token is not moderator of the room + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Room not found content: @@ -273,6 +301,7 @@ paths: - OpenVidu Meet - Room security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: roomName in: path @@ -304,13 +333,21 @@ paths: schema: $ref: '#/components/schemas/OpenViduMeetRoom' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Room not found content: @@ -353,6 +390,7 @@ paths: - OpenVidu Meet - Room security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: roomName in: path @@ -364,13 +402,21 @@ paths: '204': description: Successfully deleted the OpenVidu Meet room '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Room not found content: @@ -398,7 +444,7 @@ paths: tags: - OpenVidu Meet - Recordings security: - - apiKeyInHeader: [] + - participantTokenCookie: [] requestBody: description: Recording details content: @@ -413,7 +459,6 @@ paths: example: 'room-123' description: > The unique identifier of the room to record. - responses: '200': description: Successfully created the OpenVidu Meet recording @@ -422,13 +467,21 @@ paths: schema: $ref: '#/components/schemas/MeetRecordingStart' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The participant access token is missing or invalid content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — Recording is not enabled for the room or the participant authenticated with the access token has not enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Room not found content: @@ -496,6 +549,7 @@ paths: - OpenVidu Meet - Recordings security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: # - name: status # in: query @@ -550,7 +604,7 @@ paths: recordings: type: array items: - $ref: '#/components/schemas/MeetRecording' + $ref: '#/components/schemas/MeetRecording' pagination: type: object properties: @@ -562,13 +616,21 @@ paths: description: The token to retrieve the next page of recordings. '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '500': description: Internal server error content: @@ -587,6 +649,7 @@ paths: - OpenVidu Meet - Recordings security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: recordingIds in: query @@ -627,13 +690,21 @@ paths: description: A message explaining why the deletion failed. example: 'Recording not found' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '422': description: Unprocessable Entity — The request body is invalid content: @@ -683,7 +754,7 @@ paths: tags: - OpenVidu Meet - Recordings security: - - apiKeyInHeader: [] + - participantTokenCookie: [] parameters: - name: recordingId in: path @@ -706,13 +777,21 @@ paths: schema: $ref: '#/components/schemas/MeetRecording' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The participant access token is missing or invalid content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — Recording is not enabled for the room or the participant authenticated with the access token has not enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Recording not found content: @@ -749,6 +828,7 @@ paths: - OpenVidu Meet - Recordings security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: recordingId in: path @@ -766,13 +846,21 @@ paths: $ref: '#/components/schemas/MeetRecording' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Recording not found — The recording with the specified ID was not found content: @@ -801,6 +889,7 @@ paths: - OpenVidu Meet - Recordings security: - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: recordingId in: path @@ -813,13 +902,21 @@ paths: '204': description: Recording successfully deleted. No content is returned. '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The API key is missing or invalid, or the access token is missing or invalid when using cookie-based authentication content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Recording not found content: @@ -855,12 +952,18 @@ components: in: header description: > The API key to authenticate the request. This key is required to access the OpenVidu Meet API. - jwtInCookie: + accessTokenCookie: 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. + The JWT token to authenticate the request in case of consuming the API from the OpenVidu Meet frontend. + participantTokenCookie: + type: apiKey + name: OvMeetParticipantToken + in: cookie + description: > + The JWT token to authenticate the participant when entering the room. schemas: OpenViduMeetRoomOptions: type: object @@ -988,75 +1091,76 @@ components: The URL for the viewer to join the room. The viewer has read-only permissions to watch the room and participants. MeetRecordingBase: - 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 value: "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 (milliseconds since the Unix epoch). + 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 value: "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 (milliseconds since the Unix epoch). MeetRecording: - allOf: - - $ref: '#/components/schemas/MeetRecordingBase' - - type: object - properties: - endDate: - type: number - example: 1620000000000 - description: The date when the recording was stopped (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 - description: The error message of the recording. - nullable: true - details: - type: string - example: 'Stopped using API' - description: Additional details about the recording. + allOf: + - $ref: '#/components/schemas/MeetRecordingBase' + - type: object + properties: + endDate: + type: number + example: 1620000000000 + description: The date when the recording was stopped (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 + description: The error message of the recording. + nullable: true + details: + type: string + example: 'Stopped using API' + description: Additional details about the recording. MeetRecordingStart: $ref: '#/components/schemas/MeetRecordingBase' + Error: type: object required: diff --git a/backend/openapi/openvidu-meet-internal-api.yaml b/backend/openapi/openvidu-meet-internal-api.yaml index 5a3bb1d..fd1afe7 100644 --- a/backend/openapi/openvidu-meet-internal-api.yaml +++ b/backend/openapi/openvidu-meet-internal-api.yaml @@ -12,13 +12,14 @@ info: url: https://openvidu.io/support/ servers: - - url: http://localhost:6080/meet/api/v1 + - url: http://localhost:6080/meet/internal-api/v1 description: Development server tags: - 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: /recordings/{recordingId}/stream: get: @@ -31,7 +32,7 @@ paths: tags: - Internal API - Recordings security: - - apiKeyInHeader: [] + - accessTokenCookie: [] parameters: - name: recordingId in: path @@ -94,13 +95,21 @@ paths: code: 400 message: 'Invalid Range header' '401': - description: Unauthorized — The API key is missing or invalid + description: Unauthorized — The access token is missing or invalid content: application/json: schema: $ref: '#/components/schemas/Error' example: message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Recording not found content: @@ -136,35 +145,25 @@ paths: Generates a token for a participant to join an OpenVidu Meet room. tags: - Internal API - Participant + security: + - accessTokenCookie: [] 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 + $ref: '#/components/schemas/TokenOptions' responses: '200': description: Successfully generated the participant token + headers: + Set-Cookie: + description: > + The cookie containing the participant token. + This cookie is used to authenticate the participant in the room. + schema: + type: string + example: 'OvMeetParticipantToken=token_123456; Path=/; HttpOnly; SameSite=Strict' content: application/json: schema: @@ -175,19 +174,118 @@ paths: example: 'token_123456' description: > The token to authenticate the participant. + '401': + description: Unauthorized — The access token is missing or invalid when authentication is required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions when authentication is required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Room not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + name: 'Room Error' + message: 'The room does not exist' + '409': + description: Conflict — The participant already exists in the room + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + name: 'Participant Error' + message: 'Participant already exists in the room' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Internal server error' + /participants/token/refresh: + post: + operationId: refreshParticipantToken + summary: Refresh a token for a participant + description: > + Refresh a token for a participant in an OpenVidu Meet room. + tags: + - Internal API - Participant + security: + - accessTokenCookie: [] + requestBody: + description: Participant details + content: + application/json: + schema: + $ref: '#/components/schemas/TokenOptions' + responses: + '200': + description: Successfully refreshed the participant token + headers: + Set-Cookie: + description: > + The cookie containing the participant token. + This cookie is used to authenticate the participant in the room. + schema: + type: string + example: 'OvMeetParticipantToken=token_123456; Path=/; HttpOnly; SameSite=Strict' content: application/json: schema: type: object properties: - name: + token: type: string - example: 'Room not found' - message: - type: string - example: 'The room does not exist' + example: 'token_123456' + description: > + The token to authenticate the participant. + '401': + description: Unauthorized — The access token is missing or invalid when authentication is required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Unauthorized' + '403': + description: Forbidden — The user authenticated with the access token does not have enough permissions when authentication is required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' + '404': + description: Room or participant not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + name: 'Participant Error' + message: 'Participant not found in the room' + '409': + description: Conflict — Current token is still valid + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Participant token is still valid' '500': description: Internal server error content: @@ -205,7 +303,7 @@ paths: tags: - Internal API - Participant security: - - apiKeyInHeader: [] + - participantTokenCookie: [] parameters: - name: participantName in: path @@ -222,6 +320,22 @@ paths: responses: '204': description: Successfully disconnect the participant + '401': + description: Unauthorized — The participant access token is missing or invalid + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Unauthorized' + '403': + description: Forbidden — The participant authenticated with the access token is not moderator of the room + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + message: 'Insufficient permissions to access this resource' '404': description: Participant not found content: @@ -243,214 +357,119 @@ paths: 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: + accessTokenCookie: 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. + The JWT token to authenticate the request in case of consuming the API from the OpenVidu Meet frontend. + refreshTokenCookie: + type: apiKey + name: OvMeetRefreshToken + in: cookie + description: > + The JWT token to refresh the access token in case of consuming the API from the OpenVidu Meet frontend. + participantTokenCookie: + type: apiKey + name: OvMeetParticipantToken + in: cookie + description: > + The JWT token to authenticate the participant when entering the room. schemas: - OpenViduMeetRoomOptions: + MeetRecordingBase: type: object - required: - - expirationDate properties: - expirationDate: + 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 value: "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 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. + description: The date when the recording was started (milliseconds since the Unix epoch). - recordingPreferences: - $ref: '#/components/schemas/RecordingPreferences' - description: > - Preferences for recording the room. + MeetRecording: + allOf: + - $ref: '#/components/schemas/MeetRecordingBase' + - type: object + properties: + endDate: + type: number + example: 1620000000000 + description: The date when the recording was stopped (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 + description: The error message of the recording. + nullable: true + details: + type: string + example: 'Stopped using API' + description: Additional details about the recording. - 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: + MeetRecordingStart: + $ref: '#/components/schemas/MeetRecordingBase' + + TokenOptions: type: object + required: + - roomName + - participantName + - secret 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: + The name of the room to join. + participantName: type: string - example: 'OpenVidu' + example: 'Alice' 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: + The name of the participant. + secret: type: string - example: 'http://localhost:6080/meet/OpenVidu-123456/?secret=tok_123456' + example: 'abc123456' 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. - MeetRecordingBase: - 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 value: "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 (milliseconds since the Unix epoch). + The secret token from the room Url - MeetRecording: - allOf: - - $ref: '#/components/schemas/MeetRecordingBase' - - type: object - properties: - endDate: - type: number - example: 1620000000000 - description: The date when the recording was stopped (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 - description: The error message of the recording. - nullable: true - details: - type: string - example: 'Stopped using API' - description: Additional details about the recording. - - MeetRecordingStart: - $ref: '#/components/schemas/MeetRecordingBase' Error: type: object required: