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.
| Action | Route | Use it for |
|---|---|---|
| Hold | POST /voice/calls/{roomName}/hold | Put the caller on hold, or resume. |
| Mode | POST /voice/calls/{roomName}/mode | Switch the supervisor listening mode. |
| Hangup | POST /voice/calls/{roomName}/hangup | End the call and seal its session. |
| Lock | POST /voice/calls/{roomName}/lock | Stop further participants joining. |
| Kick | DELETE /voice/calls/{roomName}/participants/{identity} | Remove one participant. |
| Force close | POST /voice/calls/{uuid}/force-close | Seal 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.
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"}'{ "status": "ok", "held": true }Send "muted": false on the same route to resume.
| Field | Type | Notes |
|---|---|---|
muted | bool | true holds, false resumes. |
participant_identity | string | Optional. Narrows the hold to one participant. |
track_sid | string | Optional. Narrows the hold to one track. |
holder_identity | string | Optional. Recorded in the call log. |
Supervisor mode
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"}'{ "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.
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
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)