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. Keys on the Sautikit call row UUID (the
call_id from POST /v1/calls / the id from GET /v1/calls),
never the PBX session id — the server resolves the stored PBX
session itself.
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
UUID of the Sautikit call row.
uuidResponse Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/calls/497f6eca-6276-4993-bfeb-53cbbbba6f08/hangup"{ "call_id": "9d2b1f53-8c0e-4f1d-9a6b-5d3a8c47e9f0", "status": "hung_up"}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}Live Server-Sent Events stream of a call's lifecycle GET
Opens a `text/event-stream` (SSE) connection that pushes call lifecycle transitions (ringing, answered, completed, failed, …) as they happen. Intended for the in-app dialer's live call view. Past lifecycle events are also embedded inline on the Call resource (`Call.events`) — this endpoint is only for the live tail; there is no separate read endpoint for historical events. The connection stays open until the call reaches a terminal state or the client disconnects. Workspace isolation: the call must belong to the active workspace, otherwise this endpoint returns 404.
Long-poll for live call-control events (MCP live call control) GET
Long-poll mailbox read for a call placed with `control: "mcp"` on `POST /v1/calls`. Returns as soon as at least one event with `seq > after_seq` exists, or after `timeout_seconds` with an empty `events` array and `timed_out: true`. Only calls under `control_mode = "mcp"` are readable here — any other call 404s exactly like a missing call (`calls.control_not_enabled` vs `calls.not_found`; both 404).