Skip to content

Live Call Control ​

These endpoints act on a call that is already in progress. They are addressed by LiveKit room name — not by session id — because the room is what exists while people are still talking.

ActionRouteUse it for
HoldPOST /voice/calls/{roomName}/holdPut the caller on hold, or resume.
ModePOST /voice/calls/{roomName}/modeSwitch the supervisor listening mode.
HangupPOST /voice/calls/{roomName}/hangupEnd the call and seal its session.
LockPOST /voice/calls/{roomName}/lockStop further participants joining.
KickDELETE /voice/calls/{roomName}/participants/{identity}Remove one participant.
Force closePOST /voice/calls/{uuid}/force-closeSeal a session whose room is already gone.

An API key can control live calls

A key carries its owner's permissions on these routes. Anyone holding it can hang up or take over a call in progress, so treat it like a password: keep it server-side and rotate it if it leaks.

Hold and resume ​

Hold does two things: it mutes both legs and plays hold music. The mute half applies even when no hold clip is configured — so a held caller never hears the agent's room.

bash
curl -X POST "$ME_BASE/voice/calls/$ROOM/hold" \
  -H "API-Key: $ME_API_KEY" \
  -H "X-TenantID: $ME_TENANT" \
  -H "Content-Type: application/json" \
  -d '{"muted": true, "holder_identity": "agent-42"}'
json
{ "status": "ok", "held": true }

Send "muted": false on the same route to resume.

FieldTypeNotes
mutedbooltrue holds, false resumes.
participant_identitystringOptional. Narrows the hold to one participant.
track_sidstringOptional. Narrows the hold to one track.
holder_identitystringOptional. Recorded in the call log.

Supervisor mode ​

bash
curl -X POST "$ME_BASE/voice/calls/$ROOM/mode" \
  -H "API-Key: $ME_API_KEY" \
  -H "X-TenantID: $ME_TENANT" \
  -H "Content-Type: application/json" \
  -d '{"mode": "whisper", "identity": "supervisor-7"}'
json
{ "mode": "whisper" }

Pass exclude_identities to leave specific participants untouched.

Hangup vs force close ​

hangup ends a live call: it deletes the room and seals the session. Use it while people are connected.

force-close seals a session by its uuid and exists for the case where the room is already gone but the session never closed. It is a recovery path, not the normal way to end a call.

bash
curl -X POST "$ME_BASE/voice/calls/$ROOM/hangup" \
  -H "API-Key: $ME_API_KEY" \
  -H "X-TenantID: $ME_TENANT" \
  -H "Content-Type: application/json" -d '{}'

Go SDK ​

go
out, err := c.Calls.Hold(ctx, roomName, &sdk.HoldRequest{Muted: true})
_, err = c.Calls.SetMode(ctx, roomName, &sdk.ModeRequest{Mode: "whisper"})
_, err = c.Calls.Hangup(ctx, roomName, nil)