Call Lens

Request somewhere to upload a recording

Returns a short-lived presigned `PUT` URL and an opaque `ticket`. Send the audio bytes straight to `upload.url` — they never pass through Call Lens — then submit the call with `POST /calls`, `mode: "upload"` and the ticket. The `upload.headers` map must be applied to the `PUT` verbatim; it is empty against some storage backends and required by others, so a client that ignores it will fail with a signature mismatch in production only.

POST
/uploads

Returns a short-lived presigned PUT URL and an opaque ticket. Send the audio bytes straight to upload.url — they never pass through Call Lens — then submit the call with POST /calls, mode: "upload" and the ticket. The upload.headers map must be applied to the PUT verbatim; it is empty against some storage backends and required by others, so a client that ignores it will fail with a signature mismatch in production only.

Authorization

ApiKey ingest
AuthorizationBearer <token>

Authorization: Bearer clk_{tenant_id}_{secret}. The header X-Api-Key carrying the same value is also accepted, for integration platforms that cannot set an Authorization header. Keys are minted in the Call Lens dashboard.

In: header

Scope: ingest

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

application/json

application/json

curl -X POST "https://example.com/uploads" \  -H "Content-Type: application/json" \  -d '{    "content_type": "audio/mpeg",    "bytes": 1  }'
{  "success": true,  "message": "Upload authorised.",  "data": {    "upload": {      "method": "PUT",      "url": "http://example.com",      "headers": {        "property1": "string",        "property2": "string"      },      "expires_at": "2019-08-24T14:15:22Z"    },    "ticket": "string",    "allowance": {      "limit": 0,      "used": 0,      "remaining": 0,      "resets_at": "2019-08-24T14:15:22Z"    }  }}