Skip to content

API overview

The API lets your systems do what a person does today when they upload calls: send each recording to Caller as soon as the call ends. The result of the analysis comes back to your systems through a webhook.

It has two parts and nothing more:

Address Purpose
You call Caller POST https://api.caller.ee/v1/calls Send a recording with its data.
Caller calls you A POST to the address you set up Deliver the result of each analyzed call.

There are no requests to read calls, list results or manage templates. If you need the results in another system, use the webhook. For a one-off download, export a CSV from the app.

  1. Your telephony system sends the recording with an API key. Caller responds right away with the ID of the call:

    { "id": "k57e2xq9m4hc8w1t6b0z5y2e97c4n1ad", "status": "queued" }
  2. Caller transcribes and analyzes it with the template that applies to it. This usually takes a few minutes.

  3. Caller sends the result to your webhook: score, criteria, topic, summary and a link to the call.

  • Base address: https://api.caller.ee/v1
  • Authentication: a key in the Authorization: Bearer ck_… header.
  • Request: multipart/form-data, like a form with a file.
  • Response: JSON in UTF-8, whether the request succeeds or not.
  • Connection: always HTTPS.

Create a key in Integrations → API → Create a key, store it in an environment variable and send a recording:

export CALLER_API_KEY="ck_…" # the key you created
curl https://api.caller.ee/v1/calls \
-H "Authorization: Bearer $CALLER_API_KEY" \
-F "file=@AG1143_Lucia_Romero_2026-10-09_10-42-11_611284.mp3"

The call appears right away in Calls, in the In progress view.

Three things that prevent surprises on the first day:

  • Have at least one template. Without a template, calls are transcribed but not analyzed, and the webhook is only sent once a call has been analyzed.
  • Add your agents with their codes in Team. That way each recording is filed under its agent, whether you send the code in agent_code or it is in the file name.
  • Always send external_id. That is what lets you retry a request without duplicating the call.

The version is part of the address (/v1). Within a version, new fields can be added to the responses and to the webhook body, but existing fields are not renamed or removed. Write your integration so that it ignores fields it does not recognize.