API Reference
Uploads

Upload a greeting audio file (mp3/wav) for voicemail playback

POST
/v1/uploads/audio

Streams the uploaded file to Sautikit's object storage and returns a signed storage.sautikit.com playback URL — the same branded-CDN mechanism GET /v1/calls/{call_id}/recording uses for captured call recordings. Intended for the dashboard's voicemail "Play a recording" upload; the returned url is what you pass as voicemail.greeting_play_url on PUT /v1/numbers/{id}/routing.

Accepts multipart/form-data with a single file field. Only audio/mpeg (mp3) and audio/wav (audio/wav, audio/wave, audio/x-wav) are accepted — anything else is rejected with uploads.unsupported_media. Max size 10 MiB (uploads.too_large above that).

The returned URL is presigned for 7 days (SigV4's maximum) — re-POST the same file to mint a fresh URL once it expires.

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

Request Body

multipart/form-data

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/uploads/audio" \  -F file="string"
{  "url": "http://example.com",  "mime_type": "audio/mpeg",  "size_bytes": 0}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ]  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ]  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ]  }}