{"openapi":"3.1.0","info":{"title":"Mizgerd service API","version":"1.0.0","summary":"Server-to-server API for rooms, participants, messages, content, recordings and staff accounts.","description":"Authenticate with `Authorization: Bearer mzk_xxxxxxxx_<secret>`. Keys are created by an administrator in the app (/admin/api-keys); the secret is shown once. A key acts as the administrator who created it, limited to its scopes. Every response carries `X-Request-Id`; errors use `{ error: { code, message }, requestId }`."},"servers":[{"url":"https://mizgerd.com/api/v1","description":"Production"},{"url":"http://localhost:3100/api/v1","description":"Local development"}],"tags":[{"name":"Rooms","description":"Create and configure rooms, read live room state, set the global layout."},{"name":"Invitations","description":"Guest invitation links (a capability: whoever holds the link can ask to join)."},{"name":"Participants","description":"Admit, deny or remove guests; grant the microphone and drawing."},{"name":"Messages","description":"Public room chat."},{"name":"Private messages","description":"One-way staff to participant messages."},{"name":"Presentation","description":"The room PDF: metadata, upload, page, file, stop."},{"name":"Annotations","description":"Persistent drawing over one PDF page."},{"name":"Whiteboard","description":"Whiteboard pages and drawing operations."},{"name":"Users","description":"Staff accounts (ADMIN, TEACHER). Guests are not accounts."},{"name":"Recordings","description":"Start, stop and read recordings made by the media server."}],"paths":{"/rooms":{"get":{"operationId":"getRooms","tags":["Rooms"],"summary":"List rooms (paginated)","description":"Requires the `rooms:read` scope. Acts with the authority of the administrator who created the key. Lists are bounded: limit 1 to 100, continue with page.next as cursor.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:read","parameters":[{"name":"limit","in":"query","required":false,"description":"1-100, default 50","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"opaque cursor from page.next","schema":{"type":"string"}}],"responses":{"200":{"description":"Page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Room"}},"page":{"type":"object","properties":{"next":{"type":["string","null"]},"limit":{"type":"integer"}}},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRooms","tags":["Rooms"],"summary":"Create a room","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120},"capacity":{"type":"integer","minimum":1,"maximum":500},"scheduledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"waitingRoom":{"type":"boolean"}},"required":["title"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Room"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}":{"get":{"operationId":"getRoomsByRoomId","tags":["Rooms"],"summary":"Get a room","description":"Requires the `rooms:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Room"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"operationId":"patchRoomsByRoomId","tags":["Rooms"],"summary":"Update lock, waiting room, public chat switch, capacity or camera quality (LOW, AUTO, HIGH)","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"locked":{"type":"boolean"},"waitingRoom":{"type":"boolean"},"chatEnabled":{"type":"boolean"},"capacity":{"type":"integer","minimum":1,"maximum":500},"cameraQuality":{"type":"string","enum":["LOW","AUTO","HIGH"]}}}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Room"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/layout":{"put":{"operationId":"putRoomsByRoomIdLayout","tags":["Rooms"],"summary":"Set the global layout (FOCUS, SPLIT or GALLERY); every client and recordings follow it","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"layout":{"type":"string","enum":["FOCUS","SPLIT","GALLERY"]}},"required":["layout"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Room"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/state":{"get":{"operationId":"getRoomsByRoomIdState","tags":["Rooms"],"summary":"Room state: waiting list, admitted participants, hand queue, layout, board/presentation summary, current recording","description":"Requires the `rooms:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/invite":{"get":{"operationId":"getRoomsByRoomIdInvite","tags":["Invitations"],"summary":"Get the guest invitation URL (a capability: needs rooms:write)","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/invite/rotate":{"post":{"operationId":"postRoomsByRoomIdInviteRotate","tags":["Invitations"],"summary":"Replace the invitation link (the old one stops working)","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/invite/revoke":{"post":{"operationId":"postRoomsByRoomIdInviteRevoke","tags":["Invitations"],"summary":"Revoke the invitation link","description":"Requires the `rooms:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"rooms:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants":{"get":{"operationId":"getRoomsByRoomIdParticipants","tags":["Participants"],"summary":"List participants (paginated)","description":"Requires the `participants:read` scope. Acts with the authority of the administrator who created the key. Lists are bounded: limit 1 to 100, continue with page.next as cursor.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1-100, default 50","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"opaque cursor","schema":{"type":"string"}}],"responses":{"200":{"description":"Page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Participant"}},"page":{"type":"object","properties":{"next":{"type":["string","null"]},"limit":{"type":"integer"}}},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}":{"get":{"operationId":"getRoomsByRoomIdParticipantsByParticipantId","tags":["Participants"],"summary":"Get one participant with their effective permissions","description":"Requires the `participants:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Participant"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/admit":{"post":{"operationId":"postRoomsByRoomIdParticipantsByParticipantIdAdmit","tags":["Participants"],"summary":"Admit a waiting guest; returns the participant with their effective permissions","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Participant"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/permissions":{"patch":{"operationId":"patchRoomsByRoomIdParticipantsByParticipantIdPermissions","tags":["Participants"],"summary":"Grant or revoke microphone, camera and drawing for an admitted guest in one atomic change; derived permissions (screenShare, subscribe, publicChat, privateMessageReceive) are rejected","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"microphone":{"type":"boolean"},"camera":{"type":"boolean"},"draw":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Participant"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/deny":{"post":{"operationId":"postRoomsByRoomIdParticipantsByParticipantIdDeny","tags":["Participants"],"summary":"Deny a waiting guest","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/remove":{"post":{"operationId":"postRoomsByRoomIdParticipantsByParticipantIdRemove","tags":["Participants"],"summary":"Remove a guest (final) and kick them from the media server","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/mic":{"put":{"operationId":"putRoomsByRoomIdParticipantsByParticipantIdMic","tags":["Participants"],"summary":"Grant or revoke the microphone","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/draw":{"put":{"operationId":"putRoomsByRoomIdParticipantsByParticipantIdDraw","tags":["Participants"],"summary":"Grant or revoke whiteboard / PDF-annotation drawing","description":"Requires the `participants:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"participants:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/messages":{"get":{"operationId":"getRoomsByRoomIdMessages","tags":["Messages"],"summary":"Public chat (newest 100, or the changes after `since`)","description":"Requires the `messages:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"ISO time cursor (updatedAt of the last item seen)","schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdMessages","tags":["Messages"],"summary":"Post to the public chat as the key's user","description":"Requires the `messages:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":4000}},"required":["body"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/messages/{messageId}":{"delete":{"operationId":"deleteRoomsByRoomIdMessagesByMessageId","tags":["Messages"],"summary":"Delete (tombstone) a public message","description":"Requires the `messages:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/participants/{participantId}/private-messages":{"get":{"operationId":"getRoomsByRoomIdParticipantsByParticipantIdPrivatemessages","tags":["Private messages"],"summary":"Private messages sent to one participant","description":"Requires the `messages:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdParticipantsByParticipantIdPrivatemessages","tags":["Private messages"],"summary":"Send a one-way private message to one admitted participant (max 1000 characters)","description":"Requires the `messages:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":4000}},"required":["body"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/private-messages/{messageId}":{"delete":{"operationId":"deleteRoomsByRoomIdPrivatemessagesByMessageId","tags":["Private messages"],"summary":"Retract a private message","description":"Requires the `messages:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"messages:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation":{"get":{"operationId":"getRoomsByRoomIdPresentation","tags":["Presentation"],"summary":"Current PDF metadata (no storage path)","description":"Requires the `content:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdPresentation","tags":["Presentation"],"summary":"Upload or replace the PDF (multipart: file, pageCount; max 25 MiB; starts on page 1)","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","pageCount"],"properties":{"file":{"type":"string","format":"binary","description":"PDF, max 25 MiB, magic bytes %PDF-"},"pageCount":{"type":"integer","minimum":1,"maximum":2000}}}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"delete":{"operationId":"deleteRoomsByRoomIdPresentation","tags":["Presentation"],"summary":"Stop presenting (deletes the file and its annotations)","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation/page":{"put":{"operationId":"putRoomsByRoomIdPresentationPage","tags":["Presentation"],"summary":"Go to a PDF page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["page"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation/file":{"get":{"operationId":"getRoomsByRoomIdPresentationFile","tags":["Presentation"],"summary":"Download the PDF (byte ranges supported)","description":"Requires the `content:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File bytes (single Range supported: 206 / 416).","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"416":{"description":"Range not satisfiable."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation/annotations":{"get":{"operationId":"getRoomsByRoomIdPresentationAnnotations","tags":["Annotations"],"summary":"Annotation operations of one PDF page (delta since a sequence number, max 500)","description":"Requires the `content:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"PDF page number","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"last seq seen","schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdPresentationAnnotations","tags":["Annotations"],"summary":"Add an annotation on a PDF page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"op":{"description":"Drawing operation: pen/eraser {k,c?,w,p:[[x,y]..]}, line/rect/ellipse {k,c,w,a,b}, text {k,c,s,at,t}. Coordinates are normalised 0..1."},"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["op","page"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation/annotations/undo":{"post":{"operationId":"postRoomsByRoomIdPresentationAnnotationsUndo","tags":["Annotations"],"summary":"Undo the newest annotation on a PDF page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["page"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/presentation/annotations/clear":{"post":{"operationId":"postRoomsByRoomIdPresentationAnnotationsClear","tags":["Annotations"],"summary":"Clear all annotations on a PDF page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["page"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board":{"get":{"operationId":"getRoomsByRoomIdBoard","tags":["Whiteboard"],"summary":"Whiteboard pages, current page and what is on stage","description":"Requires the `content:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/visibility":{"put":{"operationId":"putRoomsByRoomIdBoardVisibility","tags":["Whiteboard"],"summary":"Show the whiteboard on stage, or return to the PDF","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"shown":{"type":"boolean"}},"required":["shown"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/pages":{"post":{"operationId":"postRoomsByRoomIdBoardPages","tags":["Whiteboard"],"summary":"Add a whiteboard page (max 20)","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/current":{"put":{"operationId":"putRoomsByRoomIdBoardCurrent","tags":["Whiteboard"],"summary":"Switch the current whiteboard page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pageId":{"type":"string","minLength":1,"maxLength":40}},"required":["pageId"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/pages/{pageId}":{"delete":{"operationId":"deleteRoomsByRoomIdBoardPagesByPageId","tags":["Whiteboard"],"summary":"Delete a whiteboard page (never the last)","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/pages/{pageId}/ops":{"get":{"operationId":"getRoomsByRoomIdBoardPagesByPageIdOps","tags":["Whiteboard"],"summary":"Operations of one whiteboard page (delta since a sequence number, max 500)","description":"Requires the `content:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"last seq seen","schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdBoardPagesByPageIdOps","tags":["Whiteboard"],"summary":"Draw on a whiteboard page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"op":{"description":"Drawing operation: pen/eraser {k,c?,w,p:[[x,y]..]}, line/rect/ellipse {k,c,w,a,b}, text {k,c,s,at,t}. Coordinates are normalised 0..1."}},"required":["op"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/pages/{pageId}/undo":{"post":{"operationId":"postRoomsByRoomIdBoardPagesByPageIdUndo","tags":["Whiteboard"],"summary":"Undo the newest drawing on a page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/board/pages/{pageId}/clear":{"post":{"operationId":"postRoomsByRoomIdBoardPagesByPageIdClear","tags":["Whiteboard"],"summary":"Clear a whiteboard page","description":"Requires the `content:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"content:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/users":{"get":{"operationId":"getUsers","tags":["Users"],"summary":"List staff accounts (paginated; search, role and status filters)","description":"Requires the `users:read` scope. Acts with the authority of the administrator who created the key. Lists are bounded: limit 1 to 100, continue with page.next as cursor.","security":[{"bearerAuth":[]}],"x-required-scope":"users:read","parameters":[{"name":"q","in":"query","required":false,"description":"name or email contains","schema":{"type":"string"}},{"name":"role","in":"query","required":false,"description":"ADMIN|TEACHER|ASSISTANT","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"active|disabled","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"created|name|login","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1-100, default 25","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"opaque cursor from page.next","schema":{"type":"string"}}],"responses":{"200":{"description":"Page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"page":{"type":"object","properties":{"next":{"type":["string","null"]},"limit":{"type":"integer"}}},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postUsers","tags":["Users"],"summary":"Create a staff account (role ADMIN or TEACHER; password policy applies)","description":"Requires the `users:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["ADMIN","TEACHER"]},"password":{"type":"string"}},"required":["name","email","role","password"]}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/users/{userId}":{"get":{"operationId":"getUsersByUserId","tags":["Users"],"summary":"Get a staff account","description":"Requires the `users:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:read","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"patch":{"operationId":"patchUsersByUserId","tags":["Users"],"summary":"Edit name, email or role (an admin cannot change their own role; the last active admin cannot be demoted)","description":"Requires the `users:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:write","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["ADMIN","TEACHER","ASSISTANT"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/users/{userId}/status":{"put":{"operationId":"putUsersByUserIdStatus","tags":["Users"],"summary":"Enable or disable an account; disabling signs it out at once and keeps its rooms and history","description":"Requires the `users:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:write","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"active":{"type":"boolean"}},"required":["active"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/users/{userId}/password":{"put":{"operationId":"putUsersByUserIdPassword","tags":["Users"],"summary":"Set a new password and sign the account out everywhere","description":"Requires the `users:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:write","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string"}},"required":["password"]}}}},"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/TooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/users/{userId}/sessions":{"delete":{"operationId":"deleteUsersByUserIdSessions","tags":["Users"],"summary":"Revoke every session of an account (force sign-out)","description":"Requires the `users:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"users:write","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/recordings":{"get":{"operationId":"getRoomsByRoomIdRecordings","tags":["Recordings"],"summary":"List recordings (newest 50) with status","description":"Requires the `recordings:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"recordings:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}},"post":{"operationId":"postRoomsByRoomIdRecordings","tags":["Recordings"],"summary":"Start recording (one open recording per room)","description":"Requires the `recordings:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"recordings:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/recordings/stop":{"post":{"operationId":"postRoomsByRoomIdRecordingsStop","tags":["Recordings"],"summary":"Stop the open recording","description":"Requires the `recordings:write` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"recordings:write","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/recordings/{recordingId}":{"get":{"operationId":"getRoomsByRoomIdRecordingsByRecordingId","tags":["Recordings"],"summary":"Recording status and playback metadata","description":"Requires the `recordings:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"recordings:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"recordingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"},"requestId":{"type":"string"}},"required":["data","requestId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/rooms/{roomId}/recordings/{recordingId}/file":{"get":{"operationId":"getRoomsByRoomIdRecordingsByRecordingIdFile","tags":["Recordings"],"summary":"Stream the MP4 (READY only; byte ranges supported)","description":"Requires the `recordings:read` scope. Acts with the authority of the administrator who created the key.","security":[{"bearerAuth":[]}],"x-required-scope":"recordings:read","parameters":[{"name":"roomId","in":"path","required":true,"schema":{"type":"string"}},{"name":"recordingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File bytes (single Range supported: 206 / 416).","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"416":{"description":"Range not satisfiable."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Scopes: rooms:read, rooms:write, participants:read, participants:write, messages:read, messages:write, content:read, content:write, recordings:read, recordings:write, users:read, users:write"}},"responses":{"BadRequest":{"description":"Invalid request or domain validation failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing, malformed, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Key lacks the required scope, or the key owner may not manage this room.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Not found (also used for resources that belong to another room).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"State conflict, e.g. email_taken, last_admin, self_change, or an open recording already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooLarge":{"description":"JSON body over 1 MB (payload_too_large) or PDF over 25 MiB (pdf_too_large).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected failure, or the media server did not confirm a change (fail-closed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limited (300 requests/minute per key).","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Permissions":{"type":"object","description":"What the participant may do right now, derived on the server. Only microphone, camera and draw are assignable (PATCH .../permissions); the rest are derived.","required":["subscribe","microphone","camera","screenShare","draw","publicChat","privateMessageReceive"],"properties":{"subscribe":{"type":"boolean"},"microphone":{"type":"boolean"},"camera":{"type":"boolean"},"screenShare":{"type":"boolean","description":"True only for staff who manage the room."},"draw":{"type":"boolean"},"publicChat":{"type":"boolean","description":"Admitted and the room chat is open."},"privateMessageReceive":{"type":"boolean","description":"True for admitted guests (one-way staff messages); false for staff."}}},"Participant":{"type":"object","required":["id","name","status","staff","micGranted","cameraGranted","drawGranted","handRaisedAt","joinedAt","permissions"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"enum":["WAITING","ADMITTED","DENIED","REMOVED"]},"staff":{"type":"boolean"},"micGranted":{"type":"boolean"},"cameraGranted":{"type":"boolean"},"drawGranted":{"type":"boolean"},"handRaisedAt":{"type":["string","null"],"format":"date-time"},"joinedAt":{"type":"string","format":"date-time"},"permissions":{"$ref":"#/components/schemas/Permissions"}}},"Room":{"type":"object","required":["id","title","capacity","locked","waitingRoom","chatEnabled","layout","cameraQuality","stage","scheduledAt","createdAt"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"capacity":{"type":"integer"},"locked":{"type":"boolean"},"waitingRoom":{"type":"boolean"},"chatEnabled":{"type":"boolean"},"layout":{"enum":["FOCUS","SPLIT","GALLERY"]},"cameraQuality":{"enum":["LOW","AUTO","HIGH"],"description":"Ceiling for every publisher camera. LOW 640x360 15 fps up to 250 kbps; AUTO 1280x720 24 fps up to 800 kbps; HIGH 1280x720 30 fps up to 1200 kbps. Recordings stay 720p."},"stage":{"enum":["PDF","BOARD"]},"scheduledAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"User":{"type":"object","required":["id","name","email","role","active","disabledAt","createdAt","lastLoginAt","activeSessions"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role":{"enum":["ADMIN","TEACHER","ASSISTANT"]},"active":{"type":"boolean"},"disabledAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"lastLoginAt":{"type":["string","null"],"format":"date-time","description":"Written at each sign-in; null until the account signs in."},"activeSessions":{"type":"integer","description":"Unexpired sessions."}}},"Error":{"type":"object","required":["error","requestId"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"requestId":{"type":"string"}}}}}}