Compare commits

..

2 Commits

Author SHA1 Message Date
juancarmore
029802787a Reapply "Revert commits 6c7bfd4 5638025 da7759d ba374ce cf84de4 39a9b7d e990c19"
This reverts commit 450aa85b887e2ce56052c8abe75fbe4722a2ef69.
2026-03-06 17:00:20 +01:00
GitHub Actions
ad413d2791 Bump version to 3.6.0 2026-03-06 11:37:26 +00:00
542 changed files with 9691 additions and 34626 deletions

View File

@ -1,46 +0,0 @@
# Project Guidelines
## Code Style
- TypeScript + ESM across backend packages (`"type": "module"`): keep explicit `.js` suffix for local imports in TS source (example: `meet-ce/backend/src/middlewares/auth.middleware.ts`).
- Respect strict TS settings and path aliases from package `tsconfig.json` (example: `meet-ce/frontend/tsconfig.json` with `@app/*`, `@environment/*`, and shared-components source mapping).
- In Angular packages, follow existing standalone/signal patterns already documented in `meet-ce/frontend/.github/copilot-instructions.md` for frontend-only edits.
- Keep changes small and package-scoped; avoid cross-package refactors unless required by the task.
## Architecture
- Monorepo is pnpm-workspace based (`pnpm-workspace.yaml`) with CE and PRO packages plus `testapp`.
- CE is the base product: `meet-ce/backend` (Express + Inversify), `meet-ce/frontend` (Angular), `meet-ce/typings` (shared contracts), `meet-ce/frontend/webcomponent`.
- PRO extends CE behavior, especially via route/provider customization (see `meet-ce/frontend/src/app/app.routes.ts` vs `meet-pro/frontend/src/app/app.routes.ts`).
- Shared Angular domain logic is in `meet-ce/frontend/projects/shared-meet-components/src/lib/domains/*`.
## Build and Test
- Runtime baseline: Node.js >= 22 and pnpm workspace usage from repo root.
- Install all workspaces: `pnpm install`
- Preferred orchestrator: `./meet.sh dev`, `./meet.sh build`, `./meet.sh test-unit-backend`, `./meet.sh test-unit-webcomponent`, `./meet.sh test-e2e-webcomponent`
- Root filtered commands: `pnpm --filter @openvidu-meet/backend run start:dev|build|test:unit`
- Frontend CE: `pnpm --filter @openvidu-meet/frontend run dev|build|test:unit|lib:build`
- Typings: `pnpm --filter @openvidu-meet/typings run dev|build`
- Webcomponent: `pnpm --filter openvidu-meet-webcomponent run build|test:unit|test:e2e`
- Backend integration suites are exposed at root (`test:integration-backend-*`) and backend package (`test:integration-*`).
## Project Conventions
- Use `meet.sh` or `pnpm --filter` commands instead of ad-hoc `cd` workflows for routine tasks.
- Backend DI registration order is intentional; keep dependency bind order coherent when adding services (`meet-ce/backend/src/config/dependency-injector.config.ts`).
- Treat `meet-ce/typings` as the source of shared API/domain contracts; update typings first when frontend/backend payloads change.
- For CI/Docker dependency switching of `openvidu-components-angular`, use only:
- `./meet.sh prepare-ci-build --components-angular-version <version>` or
- `./meet.sh prepare-ci-build --components-angular-tarball <path>`
- `./meet.sh restore-dev-config` after build/test.
- Do not manually rewrite workspace dependencies (`workspace:*`) or `pnpm-workspace.yaml`; use scripts above.
## Integration Points
- External sibling repo dependency is `../openvidu/openvidu-components-angular/projects/openvidu-components-angular` (declared in `pnpm-workspace.yaml`).
- Development workspace uses `pnpm-workspace.yaml`; CI/Docker mode is switched via `pnpm-workspace.docker.yaml` through `prepare-ci-build`.
- Frontend integration relies on `@openvidu-meet/shared-components` and `openvidu-components-angular` via workspace links.
- Backend integrations include LiveKit and optional blob providers (S3/ABS/GCS) configured through storage factory and environment (`meet-ce/backend/src/config/dependency-injector.config.ts`).
- Local backend development env is `meet-ce/backend/.env.development` (LiveKit URL/API key/secret expected).
## Security
- Auth is a validator chain with priority (`apiKey > roomMemberToken > accessToken > anonymous`) in `meet-ce/backend/src/middlewares/auth.middleware.ts`.
- Header contract is centralized in `meet-ce/backend/src/config/internal-config.ts` (`authorization`, `x-refresh-token`, `x-room-member-token`, `x-api-key`).
- Request context relies on request-scoped session service (AsyncLocalStorage-backed singleton); avoid bypassing it when adding auth-aware logic.
- Frontend token persistence currently uses localStorage (`meet-ce/frontend/projects/shared-meet-components/src/lib/shared/services/token-storage.service.ts`); preserve existing flows when modifying auth.

View File

@ -0,0 +1,397 @@
# OpenVidu Meet - Copilot Instructions
## Project Overview
**OpenVidu Meet** is a production-ready videoconferencing application built on top of OpenVidu and LiveKit. It provides a complete, customizable solution for video conferencing with both Community Edition (CE) and Pro versions.
### Key Technologies
- **Frontend**: Angular 20.x, TypeScript, Angular Material
- **Backend**: Node.js, Express framework
- **Package Manager**: pnpm (v10.18.3+) with workspaces
- **Build System**: Nx-like monorepo structure
- **Testing**: Playwright (E2E), Jest (Unit)
- **Containerization**: Docker multi-stage builds
---
## Project Structure
```
openvidu-meet/
├── meet-ce/ # Community Edition
│ ├── frontend/ # Angular application
│ │ ├── src/ # Main app source
│ │ ├── webcomponent/ # Web Component build
│ │ └── projects/
│ │ └── shared-meet-components/ # Shared Angular library
│ ├── backend/ # Express backend
│ └── docker/ # Docker configurations
├── meet-pro/ # Pro Edition (extends CE)
├── testapp/ # Testing application for E2E tests
├── meet-demo/ # Demo application for showcasing features
├── scripts/ # Build and automation scripts
└── meet.sh # Main CLI tool
```
---
## Architecture Principles
### 1. **Monorepo with External Dependencies**
- Uses pnpm workspaces for internal packages
- **External dependency**: `openvidu-components-angular` (located outside this repo)
- **Development**: Uses `workspace:*` protocol for local linking
- **CI/Docker**: Uses npm registry or tarball installations
### 2. **Dual Workspace Configuration**
```yaml
# Development (pnpm-workspace.yaml)
packages:
- 'meet-ce/**'
- '../openvidu/openvidu-components-angular/projects/openvidu-components-angular'
# CI/Docker (pnpm-workspace.docker.yaml)
packages:
- 'meet-ce/**' # No external packages
```
### 3. **Library Structure**
- `@openvidu-meet/frontend`: Main Angular application
- `@openvidu-meet/shared-components`: Reusable Angular library
- Has `openvidu-components-angular` as **peerDependency**
- Built as Angular library (ng-packagr)
- Does NOT bundle dependencies
---
## Coding Standards
### TypeScript/Angular
```typescript
// ✅ Good: Use interfaces for data models
export interface Conference {
id: string;
name: string;
participants: Participant[];
}
// ✅ Good: Use Angular dependency injection
@Injectable({ providedIn: 'root' })
export class ConferenceService {
constructor(private http: HttpClient) {}
}
// ✅ Good: Use RxJS operators properly
this.participants$.pipe(
map(participants => participants.filter(p => p.isActive)),
takeUntil(this.destroy$)
).subscribe();
// ❌ Bad: Don't use 'any' type
// ❌ Bad: Don't forget to unsubscribe from observables
```
### Express Backend with TypeScript and InversifyJS
```typescript
// ✅ Good: Use decorators and dependency injection
@injectable()
export class LoggerService {
log(message: string): void {
console.log(message);
}
}
```
---
## Build & Development
### Main CLI Tool: `meet.sh`
```bash
# Development
./meet.sh dev # Start development servers
./meet.sh dev --skip-install # Skip dependency installation
# Building
./meet.sh build # Build all packages
./meet.sh build --skip-install # Build without installing deps
./meet.sh build --base-href=/custom/ # Custom base href
# Docker
./meet.sh build-docker ov-meet # Build Docker image (CE)
./meet.sh build-docker ov-meet --components-angular-version 3.5.0-beta1
# CI Preparation (Important!)
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh prepare-ci-build --components-angular-tarball ./components.tgz
./meet.sh restore-dev-config # Restore development config
```
### CI/Docker Dependency Strategy
**Problem**: External package `openvidu-components-angular` is not in this repo.
**Solution**: Dual workspace configuration
1. **Development**: Uses `workspace:*` (local linking)
2. **CI/Docker**: Replaces `workspace:*` with registry/tarball versions
**Scripts**:
- `scripts/prepare-ci-build.sh`: Prepares workspace for CI/Docker builds
- `scripts/restore-dev-config.sh`: Restores development configuration
**Workflow**:
```bash
# Before CI/Docker build
prepare-ci-build.sh --components-angular-version 3.5.0-beta1
# Changes: pnpm-workspace.yaml → pnpm-workspace.docker.yaml
# .npmrc → .npmrc.docker
# package.json: workspace:* → ^3.5.0-beta1
# After build
restore-dev-config.sh
# Restores all original files
```
---
## Important Conventions
### 1. **Never Manually Edit package.json in CI**
```bash
# ❌ Bad: Manual sed in CI
sed -i 's/workspace:\*/3.5.0/g' package.json
# ✅ Good: Use prepare-ci-build script
./scripts/prepare-ci-build.sh --components-angular-version 3.5.0-beta1
```
### 2. **peerDependencies Guidelines**
- `shared-meet-components` declares `openvidu-components-angular` as **peerDependency**
- ✅ Use semver ranges: `"^3.0.0"`
- ✅ Use workspace protocol in dev: `"workspace:*"`
- ❌ NEVER use `file:` in peerDependencies (invalid)
### 3. **Angular Version Compatibility**
- Current: Angular 20.x
- `openvidu-components-angular` must support same Angular version
- Check peer dependency warnings carefully
### 4. **Docker Best Practices**
```dockerfile
# ✅ Good: Multi-stage build
FROM node:22.19.0 AS builder
# ... build stage ...
FROM node:22.19.0-alpine AS runner
# ... runtime stage ...
# ✅ Good: Use build args
ARG COMPONENTS_VERSION=3.5.0-beta1
ARG BASE_HREF=/
# ✅ Good: Use .dockerignore
# Avoid copying unnecessary files
```
---
## Common Tasks
### Adding a New Feature
1. Create feature in `meet-ce/frontend/src/app/features/`
2. If reusable, consider moving to `shared-meet-components`
3. Add tests in `*.spec.ts` files
4. Update documentation
### Updating openvidu-components-angular
```bash
# Development (local changes)
cd ../openvidu/openvidu-components-angular
npm run lib:build
cd -
pnpm install
# CI/Docker (version update)
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh build
./meet.sh restore-dev-config
```
### Working with Shared Components
```bash
# Build shared library
cd meet-ce/frontend/projects/shared-meet-components
ng build
# Use in main app
import { SomeComponent } from '@openvidu-meet/shared-components';
```
---
## Testing
### E2E Tests (Playwright)
```bash
npm run test:e2e # Run all E2E tests
npm run test:e2e:ui # Run with UI
npm run test:e2e:debug # Debug mode
```
### Unit Tests (Jest)
```bash
npm run test # Run all unit tests
npm run test:watch # Watch mode
npm run test:coverage # With coverage
```
---
## Troubleshooting
### "workspace package not found" Error
**Cause**: Using `workspace:*` in CI/Docker mode
**Solution**:
```bash
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
```
### "Invalid peer dependency" Error
**Cause**: Using `file:` in peerDependencies
**Solution**: Use semver range (`^3.0.0`) in peerDependencies, not `file:` paths
### Angular Version Mismatch Warnings
**Cause**: `openvidu-components-angular` version doesn't support your Angular version
**Solution**: Update to compatible version
```bash
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1 # Supports Angular 20
```
### pnpm-lock.yaml Conflicts
**Solution**: Restore development config first
```bash
./meet.sh restore-dev-config
pnpm install
```
---
## File Naming Conventions
```
✅ Good:
- conference.service.ts (Services)
- conference.component.ts (Components)
- conference.component.spec.ts (Tests)
- conference.model.ts (Models/Interfaces)
- conference.module.ts (Modules)
❌ Bad:
- ConferenceService.ts (PascalCase in filename)
- conference_service.ts (snake_case)
- conferenceService.ts (camelCase)
```
---
## Environment Variables
### Development
```bash
# Frontend
OPENVIDU_SERVER_URL=ws://localhost:4443
OPENVIDU_SECRET=MY_SECRET
# Backend
PORT=3000
OPENVIDU_URL=https://localhost:4443
OPENVIDU_SECRET=MY_SECRET
```
### Docker
Set via `docker-compose.yml` or Dockerfile ARG/ENV
---
## Security Considerations
1. **Never commit secrets** to version control
2. Use environment variables for sensitive data
3. Validate all user inputs (DTOs in backend)
4. Sanitize HTML content in frontend
5. Use Angular's built-in XSS protection
---
## Performance Guidelines
1. **Lazy load modules** when possible
2. **Use OnPush change detection** for performance-critical components
3. **Unsubscribe from observables** (use `takeUntil` or async pipe)
4. **Optimize Docker images** (multi-stage builds, alpine images)
5. **Use pnpm** for faster installs and efficient disk usage
---
## Documentation References
- Full CI/Docker strategy: `docs/ci-docker-dependencies-strategy.md`
- Dependency diagrams: `docs/ci-docker-dependencies-diagrams.md`
- Implementation summary: `docs/IMPLEMENTATION_SUMMARY.md`
- Validation checklist: `docs/VALIDATION_CHECKLIST.md`
---
## When Suggesting Code Changes
1. **Understand the context**: Is this for development or CI/Docker?
2. **Check package.json**: Are dependencies using `workspace:*` or versions?
3. **Consider peerDependencies**: Never use `file:` paths in peerDependencies
4. **Follow conventions**: Use existing patterns in the codebase
5. **Test implications**: Consider impact on both local dev and CI/Docker builds
6. **Use prepare-ci-build**: For any CI/Docker related changes
---
## Quick Reference Commands
```bash
# Development
./meet.sh dev # Start dev servers
./meet.sh build # Build all
# CI/Docker
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh build-docker ov-meet
./meet.sh restore-dev-config
# Testing
npm run test # Unit tests
npm run test:e2e # E2E tests
# Package management
pnpm install # Install deps
pnpm add <package> --filter @openvidu-meet/frontend # Add to specific package
```
---
## Remember
- **Always use scripts** for CI/Docker preparation, never manual edits
- **peerDependencies** are for library compatibility declarations, not installation
- **workspace:*** works only when package is in workspace
- **Test locally** before pushing CI/Docker changes
- **Document breaking changes** and update this file accordingly
---
**Last Updated**: 2025-10-27
**Project Version**: OpenVidu Meet CE/Pro
**Maintained By**: OpenVidu Team

View File

@ -38,7 +38,7 @@ jobs:
fail-fast: false
matrix:
include:
- test-name: 'Room Management API Tests (Rooms, Room Members, Meetings)'
- test-name: 'Room Management API Tests (Rooms, Meetings)'
test-script: 'test:integration-backend-room-management'
- test-name: 'Webhook Tests'
test-script: 'test:integration-backend-webhooks'
@ -53,7 +53,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '24.13.1'
node-version: '22.13'
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
@ -191,7 +191,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '24.13.1'
node-version: '22.13'
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:

View File

@ -12,7 +12,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '24.13.1'
node-version: '22.13'
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:

View File

@ -12,7 +12,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '24.13.1'
node-version: '22.13'
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:

View File

@ -12,7 +12,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '24.13.1'
node-version: '22.13'
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:

View File

@ -1,5 +1,5 @@
{
"jest.jestCommandLine": "../../node_modules/.bin/jest --config jest.integration.config.mjs",
"jest.jestCommandLine": "node --experimental-vm-modules ../../node_modules/.bin/jest --config jest.integration.config.mjs",
"jest.rootPath": "backend",
"jest.nodeEnv": {
"NODE_OPTIONS": "--experimental-vm-modules"

View File

@ -5,8 +5,8 @@ const integrationConfig = {
runInBand: true,
forceExit: true,
detectOpenHandles: true,
testMatch: ['**/tests/integration/**/*.(spec|test).ts']
detectOpenHandles: true,
testMatch: ['**/tests/integration/**/*.(spec|test).ts'],
};
export default integrationConfig;

View File

@ -0,0 +1,6 @@
name: secret
in: path
required: true
description: The secret value from the room URL used to access the room.
schema:
type: string

View File

@ -1,7 +0,0 @@
name: userId
in: path
required: true
description: The unique identifier of the user.
schema:
type: string
example: 'alice_smith'

View File

@ -1,9 +0,0 @@
in: query
name: userId
required: false
description: >
Filter users by userId. The search matches users that contain the specified text in their userId.
For example, 'alice' will match 'alice_smith', 'bob_alice', and 'alice123'.
schema:
type: string
example: 'alice_smith'

View File

@ -1,9 +0,0 @@
name: userIds
in: query
required: true
description: >
Comma-separated list of user IDs to delete.
Each ID should correspond to an existing user.
schema:
type: string
example: 'alice_smith,john_doe'

View File

@ -1,9 +0,0 @@
name: name
in: query
required: false
description: >
Filter users by name. The search is case-insensitive and matches users that contain the specified text in their name.
For example, 'alice' will match 'Alice Smith' and 'Bob Alice'.
schema:
type: string
example: 'Alice'

View File

@ -1,8 +0,0 @@
name: role
in: query
required: false
description: Filter users by their role.
schema:
type: string
enum: [admin, user, room_member]
example: 'admin'

View File

@ -1,9 +0,0 @@
name: sortField
in: query
required: false
description: The user field by which to sort the results.
schema:
type: string
enum:
- name
- registrationDate

View File

@ -2,9 +2,9 @@ name: withMeeting
in: query
description: |
Policy for room deletion when it has an active meeting. Options are:
- `force`: The meeting will be ended, and the room will be deleted without waiting for participants to leave.
- `when_meeting_ends`: The room will be deleted when the meeting ends.
- `fail`: The deletion will fail if there is an active meeting.
- force: The meeting will be ended, and the room will be deleted without waiting for participants to leave.
- when_meeting_ends: The room will be deleted when the meeting ends.
- fail: The deletion will fail if there is an active meeting.
required: false
schema:
type: string

View File

@ -1,11 +0,0 @@
name: sortField
in: query
required: false
description: The recording field by which to sort the results.
schema:
type: string
enum:
- startDate
- roomName
- duration
- size

View File

@ -1,15 +0,0 @@
name: X-Fields
in: header
description: >
Comma-separated list of **Recording** fields to include in the response.
Use this header to request only the data you need, reducing payload size and improving performance.
When combined with the `fields` query parameter, values are merged (union of unique fields).
required: false
schema:
type: string
examples:
basic:
value: 'recordingId,roomId,status'
summary: Only return basic recording information

View File

@ -2,9 +2,9 @@ name: withRecordings
in: query
description: |
Policy for room deletion when it has recordings. Options are:
- `force`: The room and its recordings will be deleted.
- `close`: The room will be closed instead of deleted, maintaining its recordings.
- `fail`: The deletion will fail if the room has recordings.
- force: The room and its recordings will be deleted.
- close: The room will be closed instead of deleted, maintaining its recordings.
- fail: The deletion will fail if the room has recordings.
required: false
schema:
type: string

View File

@ -1,10 +0,0 @@
name: extraFields
in: query
description: >
Comma-separated list of additional fields to include in the response that are excluded by default to reduce payload size.
<br/><br/>
These fields are included even if not listed in `fields` query parameter or `X-Fields` header.
required: false
schema:
type: string
example: 'extrafields=config'

View File

@ -6,4 +6,4 @@ description: >
required: false
schema:
type: string
example: 'fields=roomId,roomName'
example: 'roomId,moderatorUrl'

View File

@ -1,9 +0,0 @@
name: fields
in: query
description: >
Specifies which fields to include in the response for the room member resource.
Provide a comma-separated list of field names.
required: false
schema:
type: string
example: 'accessUrl,baseRole'

View File

@ -1,7 +0,0 @@
name: memberId
in: path
required: true
description: The unique identifier of the room member.
schema:
type: string
example: 'abc123'

View File

@ -1,9 +0,0 @@
name: memberIds
in: query
required: true
description: >
Comma-separated list of room member IDs to delete.
Each ID should correspond to an existing member in the room.
schema:
type: string
example: 'alice_smith,ext:abc123'

View File

@ -1,9 +0,0 @@
name: name
in: query
required: false
description: >
Filter members by name. The search is case-insensitive and matches members whose names contain the specified text.
For example, 'ali' will match 'Alice' and 'Malik'.
schema:
type: string
example: 'Alice'

View File

@ -1,9 +0,0 @@
name: sortField
in: query
required: false
description: The room member field by which to sort the results.
schema:
type: string
enum:
- name
- membershipDate

View File

@ -1,10 +0,0 @@
name: sortField
in: query
required: false
description: The room field by which to sort the results.
schema:
type: string
enum:
- creationDate
- roomName
- autoDeletionDate

View File

@ -1,13 +0,0 @@
name: X-ExtraFields
in: header
description: >
Comma-separated list of extra **Room** fields to include fully in the response.
By default, large or nested properties (e.g., `config`) are excluded to reduce payload size.
These fields are included even if not listed in the `X-Fields` header.
required: false
schema:
type: string
example: config

View File

@ -1,13 +0,0 @@
name: X-Fields
in: header
description: >
Comma-separated list of **Room** fields to include in the response.
Use this header to request only the data you need, reducing payload size and improving performance.
required: false
schema:
type: string
examples:
basic:
value: 'roomId,roomName,status'
summary: Only return basic room information

View File

@ -0,0 +1,6 @@
name: sortField
in: query
required: false
description: The field by which to sort the results.
schema:
type: string

View File

@ -1,68 +0,0 @@
description: Room member addition options
required: true
content:
application/json:
schema:
type: object
properties:
userId:
type: string
example: 'alice_smith'
description: |
The unique identifier for a registered OpenVidu Meet user. This field should be provided when adding a registered Meet user as a member.
If provided:
- The member will be associated with the Meet user account identified by this userId.
- The 'name' field must be left blank or an error will be fired. It will be automatically set based on the Meet user's profile name.
- The memberId will be set to this userId value.
If omitted, the member will be treated as an external user and 'name' must be provided.
Important: You must provide either 'userId' (for registered users) or 'name' (for external users), but NOT both.
If both are provided, a validation error will be returned.
name:
type: string
maxLength: 50
example: 'Alice Smith'
description: |
The display name for the participant when joining the meeting with this member access. It is recommended to be unique for the members of the room to easily identify them in the meeting.
This field is required only when adding an external user. The 'userId' field must be left blank or an error will be fired.
Important: You must provide either 'userId' (for registered users) or 'name' (for external users), but NOT both.
If both are provided, a validation error will be returned.
baseRole:
type: string
enum:
- moderator
- speaker
example: 'speaker'
description: |
The base role that defines the default permissions for this member. Options are:
- moderator: By default, has full permissions to manage the room and meeting.
- speaker: By default, has permissions to publish audio and video streams.
Individual permissions can be overridden through the customPermissions object.
customPermissions:
type: object
additionalProperties:
type: boolean
example:
canShareScreen: false
canRecord: true
description: |
An optional object containing custom permission overrides for the base role.
Only include the permissions you want to override from the base role defaults.
Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value.
For the complete list of all available permissions, see the full permissions schema:
[MeetPermissions](#/schemas/MeetPermissions)
required:
- baseRole
description: |
Request body to add a new member to a room.
Important: You must provide either 'userId' (for registered Meet users) or 'name' (for external users), but NOT both.
- If 'userId' is provided, the member will be linked to a registered user account and 'name' will be set from that account.
- If 'name' is provided, the member will be treated as an external user without a linked account.
- If both 'userId' and 'name' are provided or neither is provided, the request will fail with a validation error.

View File

@ -1,42 +0,0 @@
description: User creation options
required: true
content:
application/json:
schema:
type: object
properties:
userId:
type: string
pattern: '^[a-z0-9_]+$'
example: 'alice_smith'
description: |
The unique identifier for the new user. This must be unique across all users.
Validation: Must contain only lowercase letters, numbers, and underscores.
name:
type: string
maxLength: 50
example: 'Alice Smith'
description: |
The display name (profile name) for the user.
role:
type: string
enum: ['admin', 'user', 'room_member']
example: 'user'
description: |
The role to assign to the user. Available roles:
- admin: Has full control over the entire application (configuration, users, rooms, recordings, etc).
- user: Can create and manage their own created rooms and associated recordings. Can also access rooms they are a member of, but without management permissions.
- room_member: Can only access rooms (and recordings) they are a member of, without ability to create or manage rooms.
password:
type: string
format: password
minLength: 5
example: 'SecureP@ssw0rd'
description: |
The password for the new user account.
required:
- userId
- name
- role
- password

View File

@ -3,16 +3,4 @@ required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
description: The username of the user.
example: 'admin'
password:
type: string
description: The password of the user.
example: 'password123'
required:
- username
- password
$ref: '../../schemas/internal/user-credentials.yaml'

View File

@ -0,0 +1,10 @@
description: Room secret
required: true
content:
application/json:
schema:
type: object
properties:
secret:
type: string
description: The secret value from the room URL used to connect to the room.

View File

@ -1,12 +0,0 @@
description: Reset user password request
required: true
content:
application/json:
schema:
type: object
properties:
newPassword:
type: string
minLength: 5
description: The new temporary password for the user.
example: 'newSecurePassword123'

View File

@ -1,12 +0,0 @@
description: Update user role request
required: true
content:
application/json:
schema:
type: object
properties:
role:
type: string
enum: [admin, user, room_member]
description: The new role to assign to the user.
example: 'user'

View File

@ -1,9 +0,0 @@
description: Room access configuration update options
required: true
content:
application/json:
schema:
type: object
properties:
access:
$ref: '../schemas/meet-room-access-config.yaml'

View File

@ -8,10 +8,10 @@ content:
$ref: '../schemas/meet-room-config.yaml#/MeetRoomConfig'
example:
config:
chat:
enabled: true
recording:
enabled: true
encoding: H264_720P_30
chat:
enabled: true
virtualBackground:
enabled: true

View File

@ -1,33 +0,0 @@
description: Room member update options
required: true
content:
application/json:
schema:
type: object
properties:
baseRole:
type: string
enum:
- moderator
- speaker
example: 'speaker'
description: |
The base role that defines the default permissions for this member. Options are:
- moderator: By default, has full permissions to manage the room and meeting.
- speaker: By default, has permissions to publish audio and video streams.
Individual permissions can be overridden through the 'customPermissions' object.
customPermissions:
type: object
additionalProperties:
type: boolean
example:
canShareScreen: false
canRecord: true
description: |
An optional object containing custom permission overrides for the base role.
Only include the permissions you want to override from the base role defaults.
Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value.
For the complete list of all available permissions, see the full permissions schema:
[MeetPermissions](#/schemas/MeetPermissions)

View File

@ -1,9 +0,0 @@
description: Room roles permissions update options
required: true
content:
application/json:
schema:
type: object
properties:
config:
$ref: '../schemas/meet-room-roles-config.yaml'

View File

@ -1,53 +0,0 @@
description: >
**Mixed results**. Some room members were deleted successfully while others
could not be deleted (e.g., if they do not exist).
content:
application/json:
schema:
type: object
properties:
message:
type: string
deleted:
type: array
items:
type: string
description: List of room members that were deleted successfully.
failed:
type: array
description: List of room members that could not be deleted along with the corresponding error messages.
items:
type: object
properties:
memberId:
type: string
description: The unique identifier of the room member that was not deleted.
example: 'alice_smith'
error:
type: string
description: A message explaining why the deletion failed.
example: 'Room member not found'
examples:
partial_deletion_with_errors:
summary: Some room members were deleted successfully, others failed
value:
message: '2 room member(s) could not be deleted'
deleted:
- 'alice_smith'
- 'ext:abc123'
failed:
- memberId: 'bob_jones'
error: 'Room member not found'
- memberId: 'ext:def456'
error: 'Room member not found'
no_deletion_performed:
summary: No room members were deleted
value:
message: '2 room member(s) could not be deleted'
deleted: []
failed:
- memberId: 'bob_jones'
error: 'Room member not found'
- memberId: 'room-123--EG_ZYX--XX448'
error: 'Room member not found'

View File

@ -1,8 +1,8 @@
description: Recordings not available for ZIP download
description: Recordings not from the same room
content:
application/json:
schema:
$ref: ../schemas/error.yaml
example:
error: 'Recording Error'
message: 'None of the provided recordings are available for ZIP download'
message: 'None of the provided recording IDs belong to room "room123"'

View File

@ -1,4 +1,4 @@
description: Room cannot be updated because it has an active meeting.
description: Room not found
content:
application/json:
schema:

View File

@ -1,16 +0,0 @@
description: Room member conflict error
content:
application/json:
schema:
$ref: '../schemas/error.yaml'
examples:
member_already_exists:
summary: Member already exists
value:
error: 'Room Member Error'
message: 'User "alice_smith" is already a member of room "room_123"'
member_cannot_be_owner_or_admin:
summary: Member cannot be owner or admin
value:
error: 'Room Member Error'
message: 'User "alice_smith" cannot be added as a member of room "room_123" because they are the room owner or an admin'

View File

@ -1,16 +0,0 @@
description: Room member or room not found
content:
application/json:
schema:
$ref: '../schemas/error.yaml'
examples:
member_not_found:
summary: Room member does not exist in the specified room
value:
error: 'Room Member Error'
message: 'Room member "abc123" does not exist in room "room_123"'
room_not_found:
summary: Room does not exist
value:
error: 'Room Error'
message: 'Room "room_123" does not exist'

View File

@ -0,0 +1,8 @@
description: Rooms appearance configuration not defined
content:
application/json:
schema:
$ref: '../../schemas/error.yaml'
example:
error: 'Global Config Error'
message: Rooms appearance configuration not defined

View File

@ -1,53 +0,0 @@
description: >
**Mixed results**. Some users were deleted successfully while others
could not be deleted (e.g., if they do not exist).
content:
application/json:
schema:
type: object
properties:
message:
type: string
deleted:
type: array
items:
type: string
description: List of users that were deleted successfully.
failed:
type: array
description: List of users that could not be deleted along with the corresponding error messages.
items:
type: object
properties:
userId:
type: string
description: The unique identifier of the user that was not deleted.
example: 'john_doe'
error:
type: string
description: A message explaining why the deletion failed.
example: 'User not found'
examples:
partial_deletion_with_errors:
summary: Some users were deleted successfully, others failed
value:
message: '2 user(s) could not be deleted'
deleted:
- 'john_doe'
- 'jane_doe'
failed:
- userId: 'alice_smith'
error: 'User not found'
- userId: 'bob_jones'
error: 'User not found'
no_deletion_performed:
summary: No users were deleted
value:
message: '2 user(s) could not be deleted'
deleted: []
failed:
- userId: 'alice_smith'
error: 'User not found'
- userId: 'bob_jones'
error: 'User not found'

View File

@ -1,8 +0,0 @@
description: User not found
content:
application/json:
schema:
$ref: '../../schemas/error.yaml'
example:
error: 'User Error'
message: 'User "alice_smith" not found'

View File

@ -1,8 +0,0 @@
description: UserId already exists
content:
application/json:
schema:
$ref: '../../schemas/error.yaml'
example:
error: 'User Error'
message: 'User "alice_smith" already exists'

View File

@ -1,18 +0,0 @@
description: All specified users were deleted successfully.
content:
application/json:
schema:
type: object
properties:
message:
type: string
deleted:
type: array
items:
type: string
description: List of users that were deleted successfully.
example:
message: "All users deleted successfully"
deleted:
- 'alice_smith'
- 'john_doe'

View File

@ -7,11 +7,3 @@ content:
message:
type: string
example: Password for user 'admin' changed successfully
accessToken:
type: string
description: >
The access token to authenticate the user in subsequent requests. Only present when password had to be changed.
refreshToken:
type: string
description: >
The refresh token to obtain a new access token when the current one expires. Only present when password had to be changed.

View File

@ -1,12 +0,0 @@
description: User created successfully
content:
application/json:
schema:
$ref: '../../schemas/internal/meet-user.yaml'
headers:
Location:
description: URL of the newly created user
schema:
type: string
format: uri
example: https://your-api.com/internal-api/v1/users/alice_smith

View File

@ -1,10 +0,0 @@
description: User deleted successfully
content:
application/json:
schema:
type: object
properties:
message:
type: string
example:
message: User 'alice_smith' deleted successfully

View File

@ -1,5 +0,0 @@
description: Successfully retrieved authenticated user info
content:
application/json:
schema:
$ref: '../../schemas/internal/meet-user.yaml'

View File

@ -1,4 +1,4 @@
description: User retrieved successfully
description: Successfully retrieved user profile
content:
application/json:
schema:

View File

@ -0,0 +1,5 @@
description: Successfully retrieved the room role and associated permissions
content:
application/json:
schema:
$ref: '../../schemas/internal/room-member-role-permissions.yaml'

View File

@ -0,0 +1,38 @@
description: Successfully retrieved all roles and associated permissions in a room
content:
application/json:
schema:
type: array
items:
$ref: '../../schemas/internal/room-member-role-permissions.yaml'
example:
- role: 'moderator'
permissions:
livekit:
roomJoin: true
room: 'room-123'
canPublish: true
canSubscribe: true
canPublishData: true
canUpdateOwnMetadata: true
openvidu:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canChat: true
canChangeVirtualBackground: true
- role: 'speaker'
permissions:
livekit:
roomJoin: true
room: 'room-123'
canPublish: true
canSubscribe: true
canPublishData: true
canUpdateOwnMetadata: true
openvidu:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canChat: true
canChangeVirtualBackground: true

View File

@ -1,44 +0,0 @@
description: Successfully retrieved the list of users
content:
application/json:
schema:
type: object
properties:
users:
type: array
items:
$ref: '../../schemas/internal/meet-user.yaml'
pagination:
$ref: '../../schemas/meet-pagination.yaml'
examples:
multiple_users:
summary: Response with multiple users
value:
users:
- userId: 'admin'
name: 'Admin'
registrationDate: 1620000000000
role: 'admin'
- userId: 'alice_smith'
name: 'Alice Smith'
registrationDate: 1620050000000
role: 'user'
- userId: 'bob_jones'
name: 'Bob Jones'
registrationDate: 1620100000000
role: 'room_member'
pagination:
nextPageToken: 'eyJvZmZzZXQiOjEwfQ=='
isTruncated: true
maxItems: 3
single_page:
summary: Response with all users in a single page
value:
users:
- userId: 'admin'
name: 'Admin'
registrationDate: 1620000000000
role: 'admin'
pagination:
isTruncated: false
maxItems: 10

View File

@ -1,9 +0,0 @@
description: Successfully changed user password
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: Password for user 'alice_smith' has been reset successfully. User must change password on next login.

View File

@ -1,11 +0,0 @@
description: Successfully updated user role
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: Role for user 'alice_smith' updated successfully to 'admin'
user:
$ref: '../../schemas/internal/meet-user.yaml'

View File

@ -15,8 +15,3 @@ content:
type: string
description: >
The refresh token to obtain a new access token when the current one expires.
mustChangePassword:
type: boolean
example: true
description: >
Indicates whether the user must change their password after login. Only present if password change is required.

View File

@ -1,12 +0,0 @@
description: Room member added successfully
content:
application/json:
schema:
$ref: '../schemas/meet-room-member.yaml'
headers:
Location:
description: URL of the newly added room member
schema:
type: string
format: uri
example: https://your-api.com/api/v1/rooms/room-123/members/abc123

View File

@ -1,18 +0,0 @@
description: All specified room members were deleted successfully.
content:
application/json:
schema:
type: object
properties:
message:
type: string
deleted:
type: array
items:
type: string
description: List of room members that were deleted successfully.
example:
message: "All room members deleted successfully"
deleted:
- 'alice_smith'
- 'ext:abc123'

View File

@ -2,238 +2,40 @@ description: All specified rooms were successfully processed for deletion.
content:
application/json:
schema:
oneOf:
- type: object
properties:
message:
type: string
successful:
type: array
items:
type: object
properties:
successCode:
type: string
enum:
- room_closed
- room_with_active_meeting_scheduled_to_be_deleted
- room_with_active_meeting_closed
- room_with_active_meeting_and_recordings_scheduled_to_be_deleted
- room_with_active_meeting_scheduled_to_be_closed
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
room:
allOf:
- $ref: '../schemas/meet-room.yaml'
- type: object
properties:
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header or `extraFields` query parameter.
items:
type: string
example: config
description: List of rooms that were successfully processed for deletion
- type: object
properties:
message:
type: string
successful:
type: array
items:
type: object
properties:
successCode:
type: string
enum:
- room_deleted
- room_with_active_meeting_deleted
- room_and_recordings_deleted
- room_with_active_meeting_and_recordings_deleted
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
examples:
room_closed:
summary: Room closed successfully
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_closed
message: Room 'room-123' has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: closed
meetingEndAction: none
_extraFields:
- config
room_with_active_meeting_scheduled_to_be_deleted:
summary: Room with active meeting scheduled to be deleted
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_scheduled_to_be_deleted
message: Room 'room-123' with active meeting scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: delete
_extraFields:
- config
room_with_active_meeting_closed:
summary: Room with active meeting closed
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_closed
message: Room 'room-123' with active meeting has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: close
_extraFields:
- config
room_with_active_meeting_and_recordings_scheduled_to_be_deleted:
summary: Room with active meeting and recordings scheduled to be deleted
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_and_recordings_scheduled_to_be_deleted
message: Room 'room-123' with active meeting and its recordings scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: delete
_extraFields:
- config
room_with_active_meeting_scheduled_to_be_closed:
summary: Room with active meeting scheduled to be closed
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_scheduled_to_be_closed
message: Room 'room-123' with active meeting scheduled to be closed when the meeting ends because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: close
_extraFields:
- config
room_deleted:
summary: Room deleted successfully
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_deleted
message: Room 'room-123' deleted successfully
room_with_active_meeting_deleted:
summary: Room with active meeting deleted
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_deleted
message: Room 'room-123' with active meeting deleted successfully
room_and_recordings_deleted:
summary: Room and recordings deleted
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_and_recordings_deleted
message: Room 'room-123' and its recordings deleted successfully
room_with_active_meeting_and_recordings_deleted:
summary: Room with active meeting and recordings deleted
value:
message: 'Bulk deletion request processed successfully'
successful:
- successCode: room_with_active_meeting_and_recordings_deleted
message: Room 'room-123' with active meeting and its recordings deleted successfully
type: object
properties:
message:
type: string
successful:
type: array
items:
type: object
properties:
successCode:
type: string
enum:
- room_deleted
- room_with_active_meeting_deleted
- room_with_active_meeting_scheduled_to_be_deleted
- room_and_recordings_deleted
- room_closed
- room_with_active_meeting_and_recordings_deleted
- room_with_active_meeting_closed
- room_with_active_meeting_and_recordings_scheduled_to_be_deleted
- room_with_active_meeting_scheduled_to_be_closed
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
room:
$ref: '../schemas/meet-room.yaml'
description: List of rooms that were successfully processed for deletion
example:
message: 'All rooms successfully processed for deletion'
successful:
- roomId: room-123
successCode: room_deleted
message: Room 'room-123' deleted successfully
- roomId: room-456
successCode: room_with_active_meeting_deleted
message: Room 'room-456' with active meeting deleted successfully

View File

@ -2,79 +2,7 @@ description: Room created successfully
content:
application/json:
schema:
allOf:
- $ref: '../schemas/meet-room.yaml'
- type: object
properties:
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header.
items:
type: string
example: config
examples:
default_room_created:
summary: Room created successfully without config
value:
roomId: 'room-123'
roomName: 'room'
owner: 'admin'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: open
meetingEndAction: none
_extraFields: ['config']
$ref: '../schemas/meet-room.yaml'
headers:
Location:
description: URL of the newly created room

View File

@ -1,10 +0,0 @@
description: Successfull deletion of the room member
content:
application/json:
schema:
type: object
properties:
message:
type: string
example:
message: Member 'abc123' deleted successfully from room 'room-123'

View File

@ -1,112 +0,0 @@
description: Room was successfully processed for deletion
content:
application/json:
schema:
oneOf:
- type: object
required: [successCode, message, room]
properties:
successCode:
type: string
enum:
- room_closed
- room_with_active_meeting_closed
message:
type: string
room:
allOf:
- $ref: '../schemas/meet-room.yaml'
- type: object
properties:
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header or `extraFields` query parameter.
items:
type: string
example: config
- type: object
required: [successCode, message]
properties:
successCode:
type: string
enum:
- room_deleted
- room_with_active_meeting_deleted
- room_and_recordings_deleted
- room_with_active_meeting_and_recordings_deleted
message:
type: string
examples:
room_deleted:
value:
successCode: room_deleted
message: Room 'room-123' deleted successfully
room_with_active_meeting_deleted:
value:
successCode: room_with_active_meeting_deleted
message: Room 'room-123' with active meeting deleted successfully
room_and_recordings_deleted:
value:
successCode: room_and_recordings_deleted
message: Room 'room-123' and its recordings deleted successfully
room_closed:
value:
successCode: room_closed
message: Room 'room-123' has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: closed
meetingEndAction: none
_extraFields:
- config
room_with_active_meeting_and_recordings_deleted:
value:
successCode: room_with_active_meeting_and_recordings_deleted
message: Room 'room-123' with active meeting and its recordings deleted successfully
room_with_active_meeting_closed:
value:
successCode: room_with_active_meeting_closed
message: Room 'room-123' with active meeting has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: close
_extraFields:
- config

View File

@ -1,110 +0,0 @@
description: Room was successfully scheduled to be deleted or closed
content:
application/json:
schema:
type: object
properties:
successCode:
type: string
enum:
- room_with_active_meeting_scheduled_to_be_deleted
- room_with_active_meeting_and_recordings_scheduled_to_be_deleted
- room_with_active_meeting_scheduled_to_be_closed
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
room:
allOf:
- $ref: '../schemas/meet-room.yaml'
- type: object
properties:
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header or `extraFields` query parameter.
items:
type: string
example: config
examples:
room_with_active_meeting_scheduled_to_be_deleted:
value:
successCode: room_with_active_meeting_scheduled_to_be_deleted
message: Room 'room-123' with active meeting scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: delete
_extraFields:
- config
room_with_active_meeting_and_recordings_scheduled_to_be_deleted:
value:
successCode: room_with_active_meeting_and_recordings_scheduled_to_be_deleted
message: Room 'room-123' with active meeting and its recordings scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: delete
_extraFields:
- config
room_with_active_meeting_scheduled_to_be_closed:
value:
successCode: room_with_active_meeting_scheduled_to_be_closed
message: Room 'room-123' with active meeting scheduled to be closed when the meeting ends because it has recordings
room:
roomId: room-123
roomName: room
owner: 'admin'
creationDate: 1620000000000
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: active_meeting
meetingEndAction: close
_extraFields:
- config

View File

@ -12,7 +12,6 @@ content:
roomName: 'room'
status: 'complete'
layout: 'grid'
encoding: 'H264_720P_30'
filename: 'room-123--XX445.mp4'
startDate: 1600000000000
endDate: 1600000003600
@ -28,6 +27,5 @@ content:
roomName: 'room'
status: 'active'
layout: 'grid'
encoding: 'H264_720P_30'
filename: 'room-456--QR789.mp4'
startDate: 1682500000000

View File

@ -20,7 +20,6 @@ content:
roomName: 'room'
status: 'active'
layout: 'grid'
encoding: 'H264_720P_30'
filename: 'room-123--XX445.mp4'
startDate: 1620000000000
endDate: 1620000003600
@ -32,7 +31,6 @@ content:
roomName: 'room'
status: 'complete'
layout: 'grid'
encoding: 'H264_720P_30'
filename: 'room-456--XX678.mp4'
startDate: 1625000000000
endDate: 1625000007200

View File

@ -1,5 +0,0 @@
description: Success response for retrieving a room member info
content:
application/json:
schema:
$ref: '../schemas/meet-room-member.yaml'

View File

@ -1,78 +0,0 @@
description: Successfully retrieved the list of room members
content:
application/json:
schema:
type: object
properties:
members:
type: array
items:
$ref: '../schemas/meet-room-member.yaml'
pagination:
$ref: '../schemas/meet-pagination.yaml'
examples:
complete_member_details:
summary: Full room member details response with multiple members
value:
members:
- memberId: 'alice_smith'
name: 'Alice Smith'
membershipDate: 1620000000000
accessUrl: 'https://example.com/room/room-123'
baseRole: 'moderator'
customPermissions:
canEndMeeting: false
effectivePermissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
- memberId: 'ext-abc123'
name: 'Bob'
membershipDate: 1620003600000
accessUrl: 'https://example.com/room/room-123?secret=ext-abc123'
baseRole: 'speaker'
customPermissions:
canShareScreen: false
canRecord: true
effectivePermissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: false
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
currentParticipantIdentity: 'bob-5678'
pagination:
isTruncated: false
maxItems: 10
fields=accessUrl,baseRole:
summary: Response with only accessUrl and baseRole for each member
value:
members:
- accessUrl: 'https://example.com/room/room-123'
baseRole: 'moderator'
- accessUrl: 'https://example.com/room/room-123?secret=ext-abc123'
baseRole: 'speaker'
pagination:
isTruncated: false
maxItems: 10

View File

@ -2,80 +2,41 @@ description: Success response for retrieving a room
content:
application/json:
schema:
allOf:
- $ref: '../schemas/meet-room.yaml'
- type: object
properties:
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header or `extraFields` query parameter.
items:
type: string
example: config
$ref: '../schemas/meet-room.yaml'
examples:
default_room_details:
summary: Full room details response without extra fields
complete_room_details:
summary: Full room details response
value:
roomId: 'room-123'
roomName: 'room'
owner: 'admin'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
config:
chat:
enabled: true
recording:
enabled: false
url: 'https://example.com/room/room-123'
layout: grid
encoding: H264_720P_30
allowAccessTo: admin_moderator_speaker
virtualBackground:
enabled: true
e2ee:
enabled: false
captions:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: open
meetingEndAction: none
_extraFields:
- config
fields=roomId:
summary: Response with only the roomId
value:
roomId: 'room-123'
fields=roomId,roomName,creationDate,autoDeletionDate,config:
summary: Room details with roomId, roomName, creationDate, autoDeletionDate, and config
@ -88,109 +49,25 @@ content:
chat:
enabled: true
recording:
enabled: true
enabled: false
layout: grid
encoding: H264_720P_30
encoding:
video:
width: 1920
height: 1080
framerate: 30
codec: H264_MAIN
audio:
codec: OPUS
bitrate: 128
allowAccessTo: admin_moderator_speaker
virtualBackground:
enabled: true
e2ee:
enabled: false
captions:
enabled: true
_extraFields:
- config
extraFields=config:
summary: Room details with expanded config
fields=moderatorUrl,speakerUrl:
summary: Response containing only moderator and speaker URLs
value:
roomId: 'room-123'
roomName: 'room'
owner: 'admin'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
config:
chat:
enabled: true
recording:
enabled: true
layout: grid
encoding: H264_720P_30
virtualBackground:
enabled: true
e2ee:
enabled: false
captions:
enabled: true
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: open
meetingEndAction: none
_extraFields:
- config
fields=access:
summary: Response containing only access configuration
value:
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
_extraFields:
- config
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'

View File

@ -8,234 +8,49 @@ content:
type: array
items:
$ref: '../schemas/meet-room.yaml'
_extraFields:
type: array
description: >
List of extra fields that can be included in the response based on the `X-ExtraFields` header or `extraFields` query parameter.
items:
type: string
example: config
pagination:
$ref: '../schemas/meet-pagination.yaml'
examples:
default_room_details:
summary: Full room details without extra fields for multiple rooms
complete_room_details:
summary: Full room details response with multiple rooms
value:
rooms:
- roomId: 'room-123'
roomName: 'room'
owner: 'admin'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
status: open
meetingEndAction: none
- roomId: 'room-456'
roomName: 'room'
owner: 'alice_smith'
creationDate: 1620001000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: false
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: false
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: false
url: 'https://example.com/room/room-456?secret=789012'
speaker:
enabled: true
url: 'https://example.com/room/room-456?secret=210987'
recording:
enabled: true
url: 'https://example.com/room/room-456/recordings?secret=345678'
registered:
enabled: true
url: 'https://example.com/room/room-456'
status: open
meetingEndAction: none
_extraFields:
- config
pagination:
isTruncated: false
maxItems: 10
fields=roomId:
summary: Response with only roomId for each room
value:
rooms:
- roomId: 'room-123'
- roomId: 'room-456'
_extraFields:
- config
pagination:
isTruncated: false
maxItems: 10
extraFields=config:
summary: Room details with expanded config
value:
rooms:
- roomId: 'room-123'
roomName: 'room'
owner: 'admin'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
config:
chat:
enabled: true
recording:
enabled: false
layout: grid
encoding: H264_720P_30
chat:
enabled: true
allowAccessTo: admin_moderator_speaker
virtualBackground:
enabled: true
e2ee:
enabled: false
captions:
enabled: true
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: true
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: true
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: false
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: true
url: 'https://example.com/room/room-123?secret=123456'
speaker:
enabled: true
url: 'https://example.com/room/room-123?secret=654321'
recording:
enabled: true
url: 'https://example.com/room/room-123/recordings?secret=987654'
registered:
enabled: false
url: 'https://example.com/room/room-123'
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: open
meetingEndAction: none
- roomId: 'room-456'
roomName: 'room'
owner: 'alice_smith'
creationDate: 1620001000000
autoDeletionDate: 1900000000000
autoDeletionPolicy:
withMeeting: when_meeting_ends
withRecordings: close
config:
chat:
enabled: false
recording:
enabled: true
layout: grid
@ -245,106 +60,74 @@ content:
height: 720
framerate: 60
codec: H264_HIGH
bitrate: 2500
keyFrameInterval: 2
depth: 2
audio:
codec: AAC
bitrate: 192
frequency: 48000
chat:
enabled: false
allowAccessTo: admin_moderator_speaker
virtualBackground:
enabled: false
e2ee:
enabled: false
roles:
moderator:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: true
canMakeModerator: false
canKickParticipants: true
canEndMeeting: true
canPublishVideo: true
canPublishAudio: true
canShareScreen: true
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
speaker:
permissions:
canRecord: true
canRetrieveRecordings: true
canDeleteRecordings: false
canJoinMeeting: true
canShareAccessLinks: false
canMakeModerator: false
canKickParticipants: false
canEndMeeting: false
canPublishVideo: true
canPublishAudio: true
canShareScreen: false
canReadChat: true
canWriteChat: true
canChangeVirtualBackground: true
access:
anonymous:
moderator:
enabled: false
url: 'https://example.com/room/room-456?secret=789012'
speaker:
enabled: true
url: 'https://example.com/room/room-456?secret=210987'
recording:
enabled: true
url: 'https://example.com/room/room-456/recordings?secret=345678'
registered:
enabled: true
url: 'https://example.com/room/room-456'
moderatorUrl: 'http://localhost:6080/room/room-456?secret=789012'
speakerUrl: 'http://localhost:6080/room/room-456?secret=210987'
status: open
meetingEndAction: none
_extraFields:
- config
pagination:
isTruncated: false
maxItems: 10
fields=roomId;extraFields=config:
summary: Room details including config
fields=roomId:
summary: Response with only roomId for each room
value:
rooms:
- roomId: 'room-123'
config:
recording:
enabled: false
layout: grid
encoding: H264_720P_30
chat:
enabled: true
virtualBackground:
enabled: true
e2ee:
enabled: false
captions:
enabled: true
- roomId: 'room-456'
pagination:
isTruncated: false
maxItems: 10
fields=roomId,roomName,creationDate,autoDeletionDate,config:
summary: Room details including config but no URLs
value:
rooms:
- roomId: 'room-123'
roomName: 'room'
creationDate: 1620000000000
autoDeletionDate: 1900000000000
config:
recording:
chat:
enabled: true
layout: grid
encoding: H264_720P_30
recording:
enabled: false
virtualBackground:
enabled: true
e2ee:
enabled: false
- roomId: 'room-456'
roomName: 'room'
creationDate: 1620001000000
autoDeletionDate: 1900000000000
config:
chat:
enabled: false
recording:
enabled: true
virtualBackground:
enabled: false
e2ee:
enabled: false
_extraFields:
- config
pagination:
isTruncated: true
nextPageToken: 'abc123'
maxItems: 10
fields=moderatorUrl,speakerUrl:
summary: Response containing only moderator and speaker URLs
value:
rooms:
- moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
- moderatorUrl: 'http://localhost:6080/room/room-456?secret=789012'
speakerUrl: 'http://localhost:6080/room/room-456?secret=210987'
pagination:
isTruncated: false
maxItems: 10

View File

@ -0,0 +1,76 @@
description: Room was successfully processed for deletion
content:
application/json:
schema:
type: object
properties:
successCode:
type: string
enum:
- room_deleted
- room_with_active_meeting_deleted
- room_and_recordings_deleted
- room_closed
- room_with_active_meeting_and_recordings_deleted
- room_with_active_meeting_closed
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
room:
$ref: '../schemas/meet-room.yaml'
examples:
room_deleted:
value:
successCode: room_deleted
message: Room 'room-123' deleted successfully
room_with_active_meeting_deleted:
value:
successCode: room_with_active_meeting_deleted
message: Room 'room-123' with active meeting deleted successfully
room_and_recordings_deleted:
value:
successCode: room_and_recordings_deleted
message: Room 'room-123' and its recordings deleted successfully
room_closed:
value:
successCode: room_closed
message: Room 'room-123' has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
creationDate: 1620000000000
config:
chat:
enabled: true
recording:
enabled: false
virtualBackground:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: closed
meetingEndAction: none
room_with_active_meeting_and_recordings_deleted:
value:
successCode: room_with_active_meeting_and_recordings_deleted
message: Room 'room-123' with active meeting and its recordings deleted successfully
room_with_active_meeting_closed:
value:
successCode: room_with_active_meeting_closed
message: Room 'room-123' with active meeting has been closed instead of deleted because it has recordings
room:
roomId: room-123
roomName: room
creationDate: 1620000000000
config:
chat:
enabled: true
recording:
enabled: false
virtualBackground:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: active_meeting
meetingEndAction: close

View File

@ -0,0 +1,76 @@
description: Room was successfully scheduled to be deleted or closed
content:
application/json:
schema:
type: object
properties:
successCode:
type: string
enum:
- room_with_active_meeting_scheduled_to_be_deleted
- room_with_active_meeting_and_recordings_scheduled_to_be_deleted
- room_with_active_meeting_scheduled_to_be_closed
description: A code representing the success scenario
message:
type: string
description: A message providing additional context about the success
room:
$ref: '../schemas/meet-room.yaml'
examples:
room_with_active_meeting_scheduled_to_be_deleted:
value:
successCode: room_with_active_meeting_scheduled_to_be_deleted
message: Room 'room-123' with active meeting scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
creationDate: 1620000000000
config:
chat:
enabled: true
recording:
enabled: false
virtualBackground:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: active_meeting
meetingEndAction: delete
room_with_active_meeting_and_recordings_scheduled_to_be_deleted:
value:
successCode: room_with_active_meeting_and_recordings_scheduled_to_be_deleted
message: Room 'room-123' with active meeting and its recordings scheduled to be deleted when the meeting ends
room:
roomId: room-123
roomName: room
creationDate: 1620000000000
config:
chat:
enabled: true
recording:
enabled: false
virtualBackground:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: active_meeting
meetingEndAction: delete
room_with_active_meeting_scheduled_to_be_closed:
value:
successCode: room_with_active_meeting_scheduled_to_be_closed
message: Room 'room-123' with active meeting scheduled to be closed when the meeting ends because it has recordings
room:
roomId: room-123
roomName: room
creationDate: 1620000000000
config:
chat:
enabled: true
recording:
enabled: false
virtualBackground:
enabled: true
moderatorUrl: 'http://localhost:6080/room/room-123?secret=123456'
speakerUrl: 'http://localhost:6080/room/room-123?secret=654321'
status: active_meeting
meetingEndAction: close

View File

@ -9,7 +9,6 @@ content:
roomName: 'room'
status: 'active'
layout: 'speaker'
encoding: 'H264_720P_30'
filename: 'room-123--XX445.mp4'
startDate: 1600000000000
headers:

View File

@ -15,7 +15,6 @@ content:
roomName: 'room'
status: 'ending'
layout: 'speaker'
encoding: 'H264_720P_30'
filename: 'room-123--XX445.mp4'
startDate: 1600000000000
details: 'End reason: StopEgress API'

View File

@ -1,10 +0,0 @@
description: Success response for updating room access configuration
content:
application/json:
schema:
type: object
properties:
message:
type: string
example:
message: Access config for room 'room-123' updated successfully

View File

@ -1,5 +0,0 @@
description: Room member updated successfully
content:
application/json:
schema:
$ref: '../schemas/meet-room-member.yaml'

View File

@ -1,10 +0,0 @@
description: Success response for updating room roles configuration
content:
application/json:
schema:
type: object
properties:
message:
type: string
example:
message: Roles permissions for room 'room-123' updated successfully

View File

@ -7,35 +7,28 @@ properties:
AuthenticationConfig:
type: object
properties:
allowUserCreation:
type: boolean
description: Allow admins to create new user accounts.
example: true
oauthProviders:
type: array
description: Optional list of allowed OAuth providers for user registration.
items:
$ref: '#/OAuthProviderConfig'
OAuthProviderConfig:
type: object
properties:
provider:
authMethod:
type: object
properties:
type:
type: string
enum:
- single_user
default: single_user
example: single_user
description: |
Specifies the authentication method used to access the application.
- `single_user`: Only one user account exists, which has administrative privileges and is used for all access.
authModeToAccessRoom:
type: string
enum:
- google
- github
description: Supported OAuth provider.
example: google
clientId:
type: string
description: OAuth client ID.
example: your-client-id.apps.googleusercontent.com
clientSecret:
type: string
description: OAuth client secret.
example: your-client-secret
redirectUri:
type: string
description: OAuth redirect URI.
example: https://your-domain.com/auth/callback
- none
- moderators_only
- all_users
default: none
example: none
description: |
Specifies who is required to authenticate before accessing a room:
- `none`: No authentication required.
- `moderators_only`: Only moderators need to authenticate.
- `all_users`: All users must authenticate.

View File

@ -1,26 +1,13 @@
type: object
properties:
userId:
username:
type: string
example: 'alice_smith'
description: |
The unique identifier of the user.
name:
type: string
example: 'Alice Smith'
description: |
The display name (profile name) of the user.
registrationDate:
type: number
example: 1620000000000
description: |
The registration date of the user in milliseconds since the Unix epoch.
role:
type: string
enum: ['admin', 'user', 'room_member']
example: 'user'
description: |
The role assigned to the user. Available roles:
- admin: Has full control over the entire application (configuration, users, rooms, recordings, etc).
- user: Can create and manage their own created rooms and associated recordings. Can also access rooms they are a member of, but without management permissions.
- room_member: Can only access rooms (and recordings) they are a member of, without ability to create or manage rooms.
example: 'admin'
description: The username of the authenticated user.
roles:
type: array
items:
type: string
enum: ['admin', 'user']
example: ['admin', 'user']
description: A list of roles assigned to the authenticated user.

View File

@ -0,0 +1,74 @@
type: object
properties:
role:
type: string
enum: ['moderator', 'speaker']
description: |
A role that a user can have as a member of a room.
The role determines the permissions of the user in the room.
- `moderator`: Can manage the room resources and meeting participants.
- `speaker`: Can publish media streams to the meeting.
example: 'moderator'
permissions:
type: object
properties:
livekit:
type: object
properties:
roomJoin:
type: boolean
description: >
Indicates whether the participant can join a room.
example: true
room:
type: string
description: >
Unique identifier of the room to which the participant is assigned.
canPublish:
type: boolean
description: >
Indicates whether the participant can publish media streams to the room.
example: true
canSubscribe:
type: boolean
description: >
Indicates whether the participant can subscribe to media streams in the room.
example: true
canPublishData:
type: boolean
description: >
Indicates whether the participant can publish data messages to the room.
example: true
canUpdateOwnMetadata:
type: boolean
description: >
Indicates whether the participant can update their own metadata.
example: true
openvidu:
type: object
properties:
canRecord:
type: boolean
description: >
Indicates whether the user can record a meeting in the room.
example: true
canRetrieveRecordings:
type: boolean
description: >
Indicates whether the user can retrieve and play recordings of meetings in the room.
example: true
canDeleteRecordings:
type: boolean
description: >
Indicates whether the user can delete recordings of meetings in the room.
example: true
canChat:
type: boolean
description: >
Indicates whether the user can send and receive chat messages in the room.
example: true
canChangeVirtualBackground:
type: boolean
description: >
Indicates whether the user can change their own virtual background.
example: true

View File

@ -4,23 +4,17 @@ required:
properties:
secret:
type: string
description: |
A secret key for room access.
Supported secret types:
- Moderator anonymous access secret
- Speaker anonymous access secret
- Recording anonymous access secret (generates a token with read-only recording permissions)
description: A secret key for room access. Determines the member's role.
example: 'abc123456'
joinMeeting:
grantJoinMeetingPermission:
type: boolean
description: Whether the token is intended for joining a meeting. If true, participantName must be provided.
description: Whether to grant permission to join the meeting. If true, participantName must be provided.
example: true
participantName:
type: string
description: The name of the participant when joining the meeting. Required if `joinMeeting` is true.
description: The name of the participant when joining the meeting. Required if `grantJoinMeetingPermission` is true and this is a new token (not a refresh).
example: 'Alice'
participantIdentity:
type: string
description: The identity of the participant in the meeting. Required when refreshing an existing token used for joining a meeting.
description: The identity of the participant in the meeting. Required when refreshing an existing token with meeting permissions.
example: 'Alice'

View File

@ -0,0 +1,13 @@
type: object
required:
- username
- password
properties:
username:
type: string
description: The username of the user.
example: 'admin'
password:
type: string
description: The password of the user.
example: 'password123'

View File

@ -1,2 +0,0 @@
type: string
description: Extra field that can be included in the response if specified in the `X-ExtraFields` header or `extraFields` query parameter.

View File

@ -1,58 +0,0 @@
type: object
properties:
canRecord:
type: boolean
example: true
description: Can start/stop recording the meeting.
canRetrieveRecordings:
type: boolean
example: true
description: Can list and play recordings.
canDeleteRecordings:
type: boolean
example: false
description: Can delete recordings.
canJoinMeeting:
type: boolean
example: true
description: Can join the meeting.
canShareAccessLinks:
type: boolean
example: false
description: Can share access links to invite others.
canMakeModerator:
type: boolean
example: false
description: Can promote other participants to moderator role.
canKickParticipants:
type: boolean
example: false
description: Can remove other participants from the meeting.
canEndMeeting:
type: boolean
example: false
description: Can end the meeting for all participants.
canPublishVideo:
type: boolean
example: true
description: Can publish video in the meeting.
canPublishAudio:
type: boolean
example: true
description: Can publish audio in the meeting.
canShareScreen:
type: boolean
example: false
description: Can share screen in the meeting.
canReadChat:
type: boolean
example: true
description: Can read chat messages in the meeting.
canWriteChat:
type: boolean
example: true
description: Can send chat messages in the meeting.
canChangeVirtualBackground:
type: boolean
example: true
description: Can change the virtual background.

View File

@ -24,7 +24,6 @@ properties:
description: The status of the recording.
layout:
type: string
enum: ['grid', 'speaker', 'single-speaker']
example: 'grid'
description: The layout of the recording.
encoding:

View File

@ -1,46 +0,0 @@
type: object
properties:
anonymous:
type: object
properties:
moderator:
type: object
properties:
enabled:
type: boolean
default: true
example: true
description: |
Enables or disables anonymous access for the moderator role.
speaker:
type: object
properties:
enabled:
type: boolean
default: true
example: true
description: |
Enables or disables anonymous access for the speaker role.
recording:
type: object
properties:
enabled:
type: boolean
default: true
example: true
description: |
Enables or disables anonymous access for recordings in the room. This also controls whether individual anonymous recording URLs can be generated.
registered:
type: object
properties:
enabled:
type: boolean
default: true
example: true
description: |
Enables or disables access for registered users.
**Note**: admins, owner and members of the room will always have access regardless of this setting.
description: |
Configuration for room access.
All fields are optional. If not specified, current configuration will be maintained.

View File

@ -55,6 +55,19 @@ MeetRecordingConfig:
oneOf:
- $ref: '#/MeetRecordingEncodingPreset'
- $ref: '#/MeetRecordingEncodingOptions'
allowAccessTo:
type: string
enum:
- admin
- admin_moderator
- admin_moderator_speaker
default: admin_moderator_speaker
example: admin_moderator_speaker
description: |
Defines who can access the recording. Options are:
- `admin`: Only administrators can access the recording.
- `admin_moderator`: Administrators and moderators can access the recording.
- `admin_moderator_speaker`: Administrators, moderators and speakers can access the recording.
MeetVirtualBackgroundConfig:
type: object
properties:
@ -175,7 +188,7 @@ MeetRecordingVideoEncodingOptions:
example: 4500
description: |
Video bitrate in kbps
keyFrameInterval:
keyframeInterval:
type: number
minimum: 0
example: 4
@ -240,7 +253,6 @@ MeetRecordingEncodingOptions:
codec: H264_MAIN
bitrate: 3000
keyFrameInterval: 4
depth: 24
audio:
codec: OPUS
bitrate: 128

View File

@ -1,64 +0,0 @@
type: object
properties:
memberId:
type: string
example: 'alice_smith'
description: |
The unique identifier of the room member.
- For registered Meet users: This is set to the userId of the linked Meet user account.
- For external users: This is an automatically generated unique identifier starting from 'ext-'.
name:
type: string
example: 'Alice Smith'
description: |
The display name for the participant when joining the meeting with this member access.
- For registered Meet users, this is their profile name.
- For external users, this is the assigned name.
membershipDate:
type: number
example: 1620000000000
description: >
The timestamp (in milliseconds since Unix epoch) when this member was added to the room.
accessUrl:
type: string
format: uri
example: 'http://localhost:6080/room/room-123'
description: >
The unique URL for this member to access the room. This URL is different from the moderator and speaker URLs
and provides access with the specific permissions assigned to this member.
baseRole:
type: string
enum:
- moderator
- speaker
example: 'speaker'
description: |
The base role that defines the default permissions for this member. Options are:
- moderator: By default, has full permissions to manage the room and meeting.
- speaker: By default, has permissions to publish audio and video streams.
Individual permissions can be overridden through the customPermissions object.
customPermissions:
type: object
additionalProperties:
type: boolean
example:
canShareScreen: false
canRecord: true
description: |
Custom permission overrides for this member. This object contains only the permissions that differ from the base role defaults.
Each property is a permission name with a boolean value indicating whether the permission is granted or denied.
effectivePermissions:
$ref: meet-permissions.yaml
description: >
The complete set of effective permissions for this member. This object is calculated by applying the customPermissions
overrides to the base role defaults, resulting in the final permissions that will be enforced.
currentParticipantIdentity:
type: string
example: 'alice_smith-1234'
description: |
The identity of the currently connected participant in the meeting associated with this room member.
This value is undefined if the member is not currently connected.

View File

@ -58,25 +58,3 @@ properties:
$ref: './meet-room-config.yaml#/MeetRoomConfig'
description: >
The config for the room. These config will be used to configure the room's settings.
roles:
$ref: meet-room-roles-config.yaml
description: |
Configuration for role permissions.
By default (if not specified), default permissions will be used for both moderator and speaker roles:
- Moderator: Full permissions to manage the room and meeting.
- Speaker: Permissions to publish audio and video streams.
You can customize this by providing partial permissions for each role (only specify the permissions you want to override).
access:
$ref: meet-room-access-config.yaml
description: |
Configuration for room access.
By default (if not specified), anonymous access is enabled for both moderator and speaker roles, and for recording access.
However, registered access is disabled by default.
You can customize this behavior by disabling access for specific scopes and roles
(`registered`, `anonymous.moderator`, `anonymous.speaker`, `anonymous.recording`) using `enabled: false`.
Permissions for anonymous users are determined by the room's role permissions. For registered users (who are not admins or members of the room),
permissions will be the same as the speaker role.

View File

@ -1,40 +0,0 @@
type: object
properties:
moderator:
type: object
properties:
permissions:
type: object
additionalProperties:
type: boolean
example:
canRecord: false
canKickParticipants: false
description: |
Partial permissions object for the moderator role.
Only specify the permissions you want to override from the default or previously configured moderator permissions.
Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value.
For the complete list of all available permissions, see the full permissions schema:
[MeetPermissions](#/schemas/MeetPermissions)
speaker:
type: object
properties:
permissions:
type: object
additionalProperties:
type: boolean
example:
canShareScreen: false
description: |
Partial permissions object for the speaker role.
Only specify the permissions you want to override from the default or previously configured speaker permissions.
Each property should be a permission name (e.g., 'canRecord', 'canShareScreen') with a boolean value.
For the complete list of all available permissions, see the full permissions schema:
[MeetPermissions](#/schemas/MeetPermissions)
description: |
Configuration for role permissions.
Both moderator and speaker fields are optional. If not specified, current permissions will be maintained.
For permissions, only specify the ones you want to change.

View File

@ -6,18 +6,14 @@ properties:
description: >
The unique identifier of the room. This ID is generated by combining the room name with a unique identifier.
roomName:
type: string
type: [string, 'null']
maxLength: 50
example: 'room'
default: 'Room'
description: |
The display name of the room, used to identify it in a user-friendly way. This value does not need to be unique.
owner:
type: string
example: 'alice_smith'
description: |
The userId of the registered Meet user who owns this room.
If the room was created by a registered Meet user, this will be their userId.
If the room was created via the REST API using an API key, this will be the userId of the global admin (root user).
Maximum length: 50 characters. If not provided, the default value "Room" will be used.
creationDate:
type: number
example: 1620000000000
@ -30,15 +26,15 @@ properties:
The timestamp (in milliseconds since the Unix epoch) specifying when the room will be automatically deleted.
This must be at least one hour in the future.
After this time, the room is closed to new participants and scheduled for deletion.
After this time, the room is closed to new participants and scheduled for deletion.
It will be removed after the last participant leaves (graceful deletion).
If not set, the room remains active until manually deleted.
autoDeletionPolicy:
type: object
description: >
Policy for automatic deletion of the room and its contents. This includes
settings for how the room should be handled when certain conditions are met.
type: object
properties:
withMeeting:
type: string
@ -63,105 +59,26 @@ properties:
- force: The room and its recordings will be deleted.
- close: The room will be closed instead of deleted, maintaining its recordings.
config:
description: |
Room configuration (chat, recording, virtual background, e2ee, captions).
<br/><br/>
**Excluded from responses by default to reduce payload size.**
To include it in the response:
- **POST requests:** use the `X-ExtraFields: config` header
- **Other requests:** use either the `extraFields=config` query parameter or the `X-ExtraFields: config` header
$ref: meet-room-config.yaml#/MeetRoomConfig
description: The config 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.
roles:
moderatorUrl:
type: string
example: 'http://localhost:6080/room/room-123?secret=123456'
description: >
Roles for the room. Defines the complete permissions for moderator and speaker roles.
type: object
properties:
moderator:
type: object
properties:
permissions:
$ref: meet-permissions.yaml
description: >
The complete set of permissions for the moderator role. These define what moderators can do in the meeting.
speaker:
type: object
properties:
permissions:
$ref: meet-permissions.yaml
description: >
The complete set of permissions for the speaker role. These define what speakers can do in the meeting.
access:
The URL for moderator room members to access the room. The moderator role has special permissions to manage the
room resources and meeting participants.
speakerUrl:
type: string
example: 'http://localhost:6080/room/room-123?secret=654321'
description: >
Access configuration and generated access URLs for the room.
type: object
properties:
anonymous:
type: object
properties:
moderator:
type: object
properties:
enabled:
type: boolean
example: true
description: >
Whether anonymous access for the moderator role is enabled.
url:
type: string
format: uri
example: 'http://localhost:6080/room/room-123?secret=123456'
description: >
The URL for anonymous moderators to access the room.
speaker:
type: object
properties:
enabled:
type: boolean
example: true
description: >
Whether anonymous access for the speaker role is enabled.
url:
type: string
format: uri
example: 'http://localhost:6080/room/room-123?secret=654321'
description: >
The URL for anonymous speakers to access the room.
recording:
type: object
properties:
enabled:
type: boolean
example: true
description: >
Whether anonymous access for recordings in the room is enabled.
url:
type: string
format: uri
example: 'http://localhost:6080/room/room-123?secret=987654'
description: >
The URL for anonymous access to the room's recordings.
registered:
type: object
properties:
enabled:
type: boolean
example: true
description: >
Whether access for registered users is enabled.
**Note**: admins, owner and members of the room will always have access regardless of this setting.
url:
type: string
format: uri
example: 'http://localhost:6080/room/room-123'
description: >
The URL for registered users to access the room.
The URL for speaker room members to access the room. The speaker role has permissions to publish audio and
video streams to the meeting.
status:
type: string
enum:
@ -171,9 +88,9 @@ properties:
example: open
description: |
The current status of the room. Options are:
- `open`: The room is open and available to host a meeting.
- `active_meeting`: There is an active meeting in progress in the room.
- `closed`: The room is closed to hosting new meetings.
- open: The room is open and available to host a meeting.
- active_meeting: There is an active meeting in progress in the room.
- closed: The room is closed to hosting new meetings.
meetingEndAction:
type: string
enum:
@ -183,6 +100,6 @@ properties:
example: none
description: |
The action to take when the meeting ends. Options are:
- `none`: No action will be taken.
- `close`: The room will be closed.
- `delete`: The room (and its recordings if any) will be deleted.
- none: No action will be taken.
- close: The room will be closed.
- delete: The room (and its recordings if any) will be deleted.

View File

@ -22,9 +22,9 @@ properties:
status:
type: string
description: The status of the recording.
example: active
layout:
type: string
enum: ['grid', 'speaker', 'single-speaker']
description: The layout of the recording.
example: grid
filename:

View File

@ -2,7 +2,7 @@ openapi: 3.1.0
info:
$ref: './info/info.yaml'
servers:
- url: meet/api/v1
- url: /api/v1
description: OpenVidu Meet API
tags:
$ref: './tags/tags.yaml'
@ -15,16 +15,8 @@ paths:
$ref: './paths/rooms.yaml#/~1rooms~1{roomId}'
/rooms/{roomId}/config:
$ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1config'
/rooms/{roomId}/roles:
$ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1roles'
/rooms/{roomId}/access:
$ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1access'
/rooms/{roomId}/status:
$ref: './paths/rooms.yaml#/~1rooms~1{roomId}~1status'
/rooms/{roomId}/members:
$ref: './paths/room-members.yaml#/~1rooms~1{roomId}~1members'
/rooms/{roomId}/members/{memberId}:
$ref: './paths/room-members.yaml#/~1rooms~1{roomId}~1members~1{memberId}'
/recordings:
$ref: './paths/recordings.yaml#/~1recordings'
/recordings/download:
@ -43,12 +35,10 @@ components:
schemas:
MeetRoom:
$ref: components/schemas/meet-room.yaml
MeetRoomOptions:
$ref: components/schemas/meet-room-options.yaml
MeetRoomConfig:
$ref: './components/schemas/meet-room-config.yaml#/MeetRoomConfig'
MeetRoomMember:
$ref: components/schemas/meet-room-member.yaml
MeetPermissions:
$ref: components/schemas/meet-permissions.yaml
MeetRecording:
$ref: components/schemas/meet-recording.yaml
MeetWebhookEvent:

View File

@ -16,18 +16,10 @@ paths:
$ref: './paths/internal/auth.yaml#/~1auth~1refresh'
/api-keys:
$ref: './paths/internal/api-keys.yaml#/~1auth~1api-keys'
/users:
$ref: './paths/internal/users.yaml#/~1users'
/users/me:
$ref: './paths/internal/users.yaml#/~1users~1me'
/users/profile:
$ref: './paths/internal/users.yaml#/~1users~1profile'
/users/change-password:
$ref: './paths/internal/users.yaml#/~1users~1change-password'
/users/{userId}:
$ref: './paths/internal/users.yaml#/~1users~1{userId}'
/users/{userId}/password:
$ref: './paths/internal/users.yaml#/~1users~1{userId}~1password'
/users/{userId}/role:
$ref: './paths/internal/users.yaml#/~1users~1{userId}~1role'
/config/webhooks:
$ref: './paths/internal/meet-global-config.yaml#/~1config~1webhooks'
/config/webhooks/test:
@ -38,8 +30,12 @@ paths:
$ref: './paths/internal/meet-global-config.yaml#/~1config~1rooms~1appearance'
/config/captions:
$ref: './paths/internal/meet-global-config.yaml#/~1config~1captions'
/rooms/{roomId}/members/token:
$ref: './paths/internal/room-members.yaml#/~1rooms~1{roomId}~1members~1token'
/rooms/{roomId}/token:
$ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1token'
/rooms/{roomId}/roles:
$ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1roles'
/rooms/{roomId}/roles/{secret}:
$ref: './paths/internal/rooms.yaml#/~1rooms~1{roomId}~1roles~1{secret}'
/meetings/{roomId}:
$ref: './paths/internal/meetings.yaml#/~1meetings~1{roomId}'
/meetings/{roomId}/participants/{participantIdentity}:
@ -65,12 +61,18 @@ components:
$ref: components/schemas/internal/webhooks-config.yaml
SecurityConfig:
$ref: components/schemas/internal/global-security-config.yaml
RoomsAppearanceConfig:
$ref: components/schemas/internal/rooms-appearance-config.yaml
MeetRoom:
$ref: components/schemas/meet-room.yaml
MeetRoomOptions:
$ref: components/schemas/meet-room-options.yaml
MeetRoomConfig:
$ref: components/schemas/meet-room-config.yaml#/MeetRoomConfig
MeetRoomMemberRoleAndPermissions:
$ref: components/schemas/internal/room-member-role-permissions.yaml
MeetAnalytics:
$ref: components/schemas/internal/meet-analytics.yaml
MeetRecording:
$ref: components/schemas/meet-recording.yaml
AiAssistantCreateRequest:
$ref: components/schemas/internal/ai-assistant-create-request.yaml
AiAssistantCreateResponse:

View File

@ -50,8 +50,6 @@
description: AI assistant canceled successfully.
'401':
$ref: '../../components/responses/unauthorized-error.yaml'
'403':
$ref: '../../components/responses/forbidden-error.yaml'
'422':
$ref: '../../components/responses/validation-error.yaml'
'500':

Some files were not shown because too many files have changed in this diff Show More