API Reference
Calls

Fetch the recording resource for a call (redirect or status)

GET
/v1/calls/{call_id}/recording

Returns the recording asset for the given call in one of three ways depending on the recording's lifecycle state:

  • 302 — recording is ready; Location header carries a 15-minute presigned Sautikit CDN URL. The response body is empty. The client can pass Location directly to <audio src=...> — audio bytes do NOT flow through the API process. The Sautikit URL is the only URL ever surfaced; the raw PBX URL is never exposed.

  • 202 — recording capture is still in progress (status: pending). The client should wait retry_after_seconds before re-polling (also reflected in the Retry-After response header). Error code: recording_not_ready.

  • 410 — the asset has been pruned per the workspace's storage-tier retention policy and is permanently unavailable. Error code: recording_unavailable.

  • 404 — the call does not exist, belongs to a different workspace, or was never configured for recording. Cross-tenant existence is not leaked. Error code: recording_not_found.

Workspace isolation: call_id must belong to the active workspace; otherwise the endpoint returns 404.

Authorization

bearerAuth
AuthorizationBearer <token>

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

call_id*string

UUID of the Sautikit call row.

Formatuuid

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/calls/497f6eca-6276-4993-bfeb-53cbbbba6f08/recording"
{  "status": "pending",  "retry_after_seconds": 10}
Empty
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string"  }}
{  "error": {    "code": "recording_not_found",    "message": "call recording not found",    "request_id": "req-a1b2c3d4"  }}
{  "code": "recording_unavailable",  "reason": "recording pruned after 30-day retention window"}