These are the endpoints behind every video call. Your backend calls
them with the project API key, usually through @livqeno/server or
swalvo (Python).
When you'd call them in a real app:
- Create a room when a meeting is scheduled, or the first time someone
opens it (
getOrCreatemakes this safe when two users arrive at once). - Make a token each time a user clicks "Join". One per participant, per join.
- List participants if your backend needs to know who is in the call right now.
- Close the room when the meeting is over, to remove everyone.
Your users' apps never call these. They only use the token your backend hands them to join.
SDK side: Rooms & Participants.
Endpoints
| Method | Path | Credential |
|---|---|---|
| GET | /v1/rooms | Project API key |
| POST | /v1/rooms | Project API key |
| DELETE | /v1/rooms/{id} | Project API key |
| GET | /v1/rooms/{id} | Project API key |
| GET | /v1/rooms/{id}/participants | Project API key |
| POST | /v1/rooms/{roomId}/data | Project API key |
| PATCH | /v1/rooms/{roomId}/participants/{identity} | Project API key |
| POST | /v1/rooms/{roomId}/participants/{identity}/mute | Project API key |
| PATCH | /v1/rooms/{roomId}/participants/{identity}/permissions | Project API key |
| POST | /v1/rooms/{roomId}/participants/{identity}/remove | Project API key |
| GET | /v1/rooms/{roomId}/recordings | Project API key |
| POST | /v1/rooms/{roomId}/recordings | Project API key |
| POST | /v1/rooms/{roomId}/rtc-tokens | Project API key |
| DELETE | /v1/rooms/{roomId}/rtc-tokens/{tokenId} | Project API key |
GET/v1/rooms
List the API key's project's active rooms
Credential Project API key
No parameters.
POST/v1/rooms
Create a room in the API key's project
Credential Project API key · Idempotent send Idempotency-Key to replay safely
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
name | body | string | Yes | 1–128 chars, pattern-checked — Unique within the project (not globally). Letters, numbers, "-", "_", "." only. |
getOrCreate | body | boolean | No | When true, a name collision returns the existing room instead of a 409 — including when two |
e2ee | body | boolean | No | End-to-end encrypted media (insertable streams, AES-GCM; keys never reach Livqeno). Set at create and |
DELETE/v1/rooms/{id}
Close a room
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
id | path | string | Yes |
GET/v1/rooms/{id}
Get a single room
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
id | path | string | Yes |
GET/v1/rooms/{id}/participants
List live participants in a room, from the SFU (Phase 10 server SDK)
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
id | path | string | Yes |
POST/v1/rooms/{roomId}/data
Send a data message to a room from the server
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
payload | body | string | Yes | The message bytes, base64. At most 64 KiB decoded when reliable, 1,200 bytes when not. |
topic | body | string | No | Up to 255 bytes. Recipients see it as the message topic. |
destinationIdentities | body | string[] | No | 1–∞ chars, array — Only these identities receive it (at most 64). Omit or leave empty to send to everyone. |
reliable | body | boolean | No | true: the reliable, ordered channel. false: the lossy channel (latest value wins). |
PATCH/v1/rooms/{roomId}/participants/{identity}
Change a connected participant's metadata or attributes
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
identity | path | string | Yes | |
metadata | body | string | No | Replaces the participant's metadata. An opaque string, at most 4 KiB. |
attributes | body | Record<string, string | null> | No | Merged into the participant's attributes: a string sets the key, null deletes it, keys not named are kept. |
POST/v1/rooms/{roomId}/participants/{identity}/mute
Mute or unmute a participant's track, or all their tracks of one kind
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
identity | path | string | Yes | |
trackId | body | string | No | 1–256 chars — Mute exactly this track. One of trackId or kind is required. |
kind | body | 'audio' | 'video' | No | audio · video — Mute every track of this kind the participant is publishing. One of trackId or kind is required. |
muted | body | boolean | Yes | true mutes, false unmutes. |
PATCH/v1/rooms/{roomId}/participants/{identity}/permissions
Change a connected participant's permissions in place
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
identity | path | string | Yes | |
subscribe | body | boolean | No | Losing it drops every track the participant is receiving. |
publish | body | boolean | No | Turning publish on with neither publishAudio, publishVideo nor publishScreen named, for a |
publishAudio | body | boolean | No | Has no effect without publish. |
publishVideo | body | boolean | No | Camera video. Has no effect without publish. Independent of publishScreen. |
publishScreen | body | boolean | No | Screen-share. Has no effect without publish. Independent of publishVideo. |
publishData | body | boolean | No | Data-channel messages. |
updateOwnMetadata | body | boolean | No | May change its own metadata and attributes from the client (participant.update). |
POST/v1/rooms/{roomId}/participants/{identity}/remove
Remove a participant from a live room
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
identity | path | string | Yes |
GET/v1/rooms/{roomId}/recordings
A room's recordings, newest first
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes |
POST/v1/rooms/{roomId}/recordings
Start recording a room (composite grid; HLS and/or MP4)
Credential Project API key
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
mode | body | 'COMPOSITE' | 'TRACK' | No | COMPOSITE · TRACK |
layout | body | 'grid' | No | grid |
outputs | body | RecordingOutputsDto | No | Both outputs are on by default (hls and mp4). |
storage | body | 'livqeno' | 'custom' | No | livqeno · custom — Defaults to custom when a recording bucket is configured. |
POST/v1/rooms/{roomId}/rtc-tokens
Mint a short-lived RTC access token for a participant to join this room
Credential Project API key · Rate limit 60 per window (details) · Idempotent send Idempotency-Key to replay safely
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
roomId | path | string | Yes | |
participantIdentity | body | string | Yes | 1–128 chars, pattern-checked — Unique within the room. Letters, numbers, "-", "_", "." only. |
permissions | body | RtcTokenPermissionsDto | No | |
ttlSeconds | body | number | No | 30–21600 — Token lifetime in seconds. Defaults to RTC_TOKEN_DEFAULT_TTL_SECONDS. There is no way to request a non-expiring token — every RTC token is short-lived by design. |
region | body | string | No | 0–64 chars, pattern-checked — The participant's region, if your backend knows it. Must be one of the deployment's regions. Puts the |
metadata | body | string | No | 0–4096 chars — The participant's initial metadata: an opaque string, at most 4 KiB (UTF-8 bytes). Signed into the token |
attributes | body | Record<string, string> | No | The participant's initial attributes: string keys to string values, at most 32 keys, keys up to 64 |
DELETE/v1/rooms/{roomId}/rtc-tokens/{tokenId}
Revoke a minted RTC token before it expires
Credential Project API key · Rate limit 60 per window (details)
| Parameter | In | Type | Required | Notes |
|---|---|---|---|---|
tokenId | path | string | Yes | |
roomId | path | string | Yes |
Nested objects
RecordingOutputsDto
| Field | Type | Required | Notes |
|---|---|---|---|
hls | boolean | No | |
mp4 | boolean | No |
RtcTokenPermissionsDto
| Field | Type | Required | Notes |
|---|---|---|---|
join | boolean | No | Allowed to join the room at all Default true. |
subscribe | boolean | No | Allowed to subscribe to other participants' tracks Default true. |
publish | boolean | No | Allowed to publish any track at all Default false. |
publishAudio | boolean | No | Restricts publish to audio (microphone) — only meaningful when publish=true Default false. |
publishVideo | boolean | No | Restricts publish to video (camera) — only meaningful when publish=true Default false. |
publishScreen | boolean | No | Restricts publish to screen-share — only meaningful when publish=true. Independent of Default false. |
publishData | boolean | No | Allowed to send/receive WebRTC data channel messages Default false. |
updateOwnMetadata | boolean | No | Allowed to change its own metadata and attributes from the client (participant.update). Default false. |
Next steps
- Conventions: base URL, errors, request ids, pagination.
- Errors: every error code and how to fix it.
- All endpoints: every endpoint on one page.