On this page
Live Control API
These calls act on a room while people are in it. A control call answers {"object": "room_command", "status": "acked", "result": {...}} once the call
engine has done it. Meet waits up to 5 seconds for the engine.
Specific errors: 409 room_not_live when nobody is in the room (nothing waits for a later session), 404 participant_not_found,
503 engine_unavailable and 504 command_timeout. A room of another project or the other mode is 404 room_not_found.
In presence, id is the call engine's participant id and user_id is the user_id from the meeting token. If the engine does not
answer within 2 seconds the answer falls back to the database ("source": "database") and audio, video, screen and user_id are
null.
Who is in the room now#
GET /api/v1/rooms/{name}/presence
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Response
200 The live people. source is engine, or database when the engine did not answer (then audio, video and screen are null).
| Field | Type | Description |
|---|---|---|
object | "presence" | |
room | string | |
count | integer | |
source | string | One of engine, database |
participants | array of Participant | |
participants[].id | string | |
participants[].user_id | string or null | From the meeting token; live presence only |
participants[].name | string | |
participants[].role | string | |
participants[].admitted | boolean | |
participants[].in_call | boolean | |
participants[].joined_at | string | |
participants[].audio | boolean or null | |
participants[].video | boolean or null | |
participants[].screen | boolean or null |
{
"object": "presence",
"room": "order-1042",
"count": 3,
"source": "engine",
"participants": [
{
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"user_id": "u-77",
"name": "order-1042",
"role": "role",
"admitted": false,
"in_call": false,
"joined_at": "2026-11-02T09:31:12Z",
"audio": false,
"video": false,
"screen": false
}
]
}Errors
| Status | Meaning |
|---|---|
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 429 | rate_limited; wait Retry-After seconds |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/presence" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
const now = await meet.rooms.presence("order-1042");
console.log(now.count, now.participants.map((p) => p.name));
End the meeting for everyone#
POST /api/v1/rooms/{name}/end
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/end" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.end("order-1042");
Remove one person (peer id or user id)#
POST /api/v1/rooms/{name}/participants/{pid}/eject
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string | |
pid required | path | string | The engine's participant (peer) id from presence or a session, or the user id given in the meeting token |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/participants/u-77/eject" \
-H "Authorization: Bearer $MEET_API_KEY"import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.eject("order-1042", "u-77");
Turn off audio, video or screen for one person#
POST /api/v1/rooms/{name}/participants/{pid}/mute
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string | |
pid required | path | string | The engine's participant (peer) id from presence or a session, or the user id given in the meeting token |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Body (JSON)
Set at least one to true: what to turn off. Cameras and screens can only be turned off.
| Field | Type | Description |
|---|---|---|
audio | boolean | |
video | boolean | |
screen | boolean |
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/participants/u-77/mute" \
-H "Authorization: Bearer $MEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":true}'import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.mute("order-1042", "u-77", {"audio":true});
Turn off audio, video or screen for everyone except hosts#
POST /api/v1/rooms/{name}/mute-all
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Body (JSON)
Set at least one to true: what to turn off. Cameras and screens can only be turned off.
| Field | Type | Description |
|---|---|---|
audio | boolean | |
video | boolean | |
screen | boolean |
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/mute-all" \
-H "Authorization: Bearer $MEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":true}'import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.muteAll("order-1042", {"audio":true});
Send a system message into the room chat#
POST /api/v1/rooms/{name}/message
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Body (JSON)
| Field | Type | Description |
|---|---|---|
text required | string | Up to 1000 characters |
from | string | Default "System". Up to 80 characters |
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/message" \
-H "Authorization: Bearer $MEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"We start in one minute.","from":"Host desk"}'import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.message("order-1042", "We start in one minute.", "Host desk");
Change lock or knocking while the room runs#
POST /api/v1/rooms/{name}/update
Parameters
| Name | In | Type | Description |
|---|---|---|---|
name required | path | string |
Send an Idempotency-Key header to repeat this call safely. The same key with the same body returns the first answer for 24 hours.
Body (JSON)
| Field | Type | Description |
|---|---|---|
lock | boolean | |
knocking | boolean |
Response
200 The engine's answer
| Field | Type | Description |
|---|---|---|
object | "room_command" | |
id | string | |
command | string | |
room | string | |
status | string | One of acked |
result | object | |
livemode | boolean |
{
"object": "room_command",
"id": "6f1c2b7e-3a54-4d0e-9c1b-2f7a8e5d4c10",
"command": "end",
"room": "order-1042",
"status": "acked",
"livemode": false
}Errors
| Status | Meaning |
|---|---|
| 400 | invalid_parameter, unknown_parameter or invalid_json; param names the field |
| 401 | invalid_api_key or revoked_api_key |
| 404 | room_not_found, session_not_found or participant_not_found |
| 409 | room_exists, idempotency_key_reused, room_not_live |
| 429 | rate_limited; wait Retry-After seconds |
| 503 | engine_unavailable; the call engine did not pick up the command in 5 seconds, try again |
Every error has the shape {"error": {"code", "message", "param"?}}. See Errors.
Examples
curl "https://meet.respiresoft.com/api/v1/rooms/order-1042/update" \
-H "Authorization: Bearer $MEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"lock":true}'import { Meet } from "@respiresoft/meet";
const meet = new Meet({ apiKey: process.env.MEET_API_KEY });
await meet.rooms.updateLive("order-1042", {"lock":true});