Send a control command to a conference room on the PBX
Dispatches one of the allowlisted PBX conference commands to the named room. The room must belong to the active workspace. Unknown commands are rejected with 400.
| Command | Effect |
|---|---|
mute / unmute | Stop or restore what the room hears from a participant. |
tmute | Toggle a participant's mute state. |
deaf / undeaf | Stop or restore what a participant hears from the room. |
play | Play an audio file into the room. |
say | Speak text into the room. |
moh | Start or stop hold music in the room. |
dtmf | Send DTMF digits into the room. |
relate | Set the audio relationship between two participants. |
list | List the participants currently in the room. |
exit | Remove a participant without ending their call. |
kill | End the conference and hang up every participant. |
exit is how a caller leaves a room and carries on: the leg does not
hang up, it requests a new set of voice actions from callback_url,
which is required for this command. That is what allows a queued caller
to be taken out of a waiting room, offered to an agent, and returned to
the room if the agent does not answer. Ending the call instead is what
kill is for.
Authorization
bearerAuth Long-lived ES256 JWT minted from the dashboard (https://app.sautikit.com/developers/api-keys). Signed by the
platform keyring. Carries workspace_id and scopes claims;
revoked via the platform deny-list.
In: header
Path Parameters
Conference room name as registered with the PBX.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/conferences/string/commands" \ -H "Content-Type: application/json" \ -d '{ "command": "mute", "participant": "p-a1b2c3d4-e5f6-7890-abcd-ef1234567890" }'{ "status": "ok"}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "calls.forbidden", "message": "conference room does not belong to this workspace", "request_id": "req-b2c3d4e5" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}Mint a short-lived WebRTC PBX token for the browser softphone POST
Requests a workspace-scoped WebRTC bearer token from the PBX. The token is returned as-is from the PBX; the caller passes it to the in-browser softphone SDK to register. Short-lived (typically 60–300 s); renew before expiry. Optional body fields (`client_name`, `role`) are forwarded to the PBX and reflected in token claims; both may be omitted. Every body field is optional, but the request body itself must be valid JSON — send at least `{}` (an empty body is rejected 400 `validation.bad_request`). To bind the token to one of your DIDs (so the WebRTC session routes through that number), pass **either** `tenant_number_id` (the internal number id) **or** `phone_number` (the DID in E.164). The backend resolves the number's PBX sip-profile and embeds it as the token's `sip.id` claim. Omit both to mint a non-DID-bound token, in which case the PBX assigns `sip.id` `"default"`. When both are supplied, `tenant_number_id` wins.
List webhook subscriptions for the active workspace GET
Next Page