Terminate an active call
Requests termination of an in-progress call via the PBX. The browser SDK dials directly over WebRTC; this server-side endpoint is the control-plane hangup used to force-end a live call.
Workspace isolation: call_id must belong to the active workspace,
otherwise this endpoint returns 404 (cross-tenant existence is not
leaked).
Idempotent: if the PBX reports the call already ended, the
request still succeeds. Addressable by either the Sautikit call row
UUID (the call_id from POST /v1/calls / the id from
GET /v1/calls) or the PBX session id (HD_…) the same call
carries on the wire — the server resolves the stored PBX session
itself either way.
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
The call's Sautikit UUID, or the PBX session id the same call
carries on the wire (HD_…, returned as session_id on
POST /v1/calls and on every webhook). Either form addresses
the same call.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/calls/string/hangup"{ "call_id": "9d2b1f53-8c0e-4f1d-9a6b-5d3a8c47e9f0", "status": "hung_up"}{ "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": "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" }}Check whether a destination is available before dialling GET
Says whether a call from one of your numbers to a destination would be accepted, rate-wise, before you place it. A dialler uses this to show "Calls to this destination are not available on your account" up front instead of letting the call ring into a refusal. It asks the same rate check the real dial does, so the answer matches. It is advisory: the check is repeated when the call is placed, and an unrated outbound call is refused immediately (the caller hears the message above, then the line is dropped), never connected. `from` must be an active number on the workspace.
Get the call's active supervision GET
`supervision` is `null` when no supervisor is on the call. **Who can call this:** a signed-in workspace owner or admin, or a member holding the Supervisor licence — or an API key or OAuth token with the `calls.read` scope. Seeing who is listening in on a call is itself treated as supervisory access.