# Get one call (/docs/api/voice-agents/calls/getCall)

> For the complete documentation index, see [llms.txt](https://docs.tandemcx.ai/llms.txt). Any page on this site can be fetched as Markdown by appending `.md` to its URL.

`GET /v1/agent-media/calls/{conversationId}`

Get one call

## Request

**Base URL:** `https://api.tandemcx.ai`

**Authentication:** `Authorization: Bearer <token>` — A Tandem bearer token. Requests are scoped to the organization the token belongs to; no organization header is required.

### Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `conversationId` | string | Yes | The call's conversation ID. |

## Responses

### 200 — The call.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `call` | object | No | A completed native-agent call and its post-call analysis. Storage keys are not part of the contract and are never returned. |
| `call.conversationId` | string | No | — |
| `call.agentId` | string | No | — |
| `call.ani` | string | No | The caller's number, in E.164. |
| `call.contactId` | string | No | The contact this caller was recognized as. Absent when the agent has contacts turned off, when the caller withheld their number, or when no contact matched. |
| `call.startedAt` | string (date-time) | No | — |
| `call.endedAt` | string (date-time) | No | — |
| `call.disposition` | string | No | What the agent classified the call as, when it concluded it. Absent when it did not, including on a call a supervisor took over. |
| `call.supervisorDisposition` | object | No | How the supervisor who took the call over closed it out. Beside `disposition`, never in place of it; absent when nobody did. |
| `call.supervisorDisposition.disposition` | string | Yes | One of the agent's configured dispositions, by name. |
| `call.supervisorDisposition.note` | string | No | Why, in the supervisor's words. Absent when they gave none. |
| `call.supervisorDisposition.reasons` | array of enum: `agent_stuck` \| `wrong_information` \| `asked_for_person` \| `complaint` \| `compliance` \| `other` | No | Why the supervisor stepped in, from a fixed list. Absent when they gave none. |
| `call.supervisorDisposition.dispositionedBy` | string | Yes | The id of the user who closed it out. |
| `call.supervisorDisposition.dispositionedAt` | string (date-time) | Yes | — |
| `call.supervisorIntervention` | object | No | That a supervisor took the call over from the agent. Returned by the single-call read only, and absent when nobody did. What was said after it is on the call's transcript, as `supervised`. |
| `call.supervisorIntervention.takenOverBy` | string | Yes | The id of the user who took it over. |
| `call.supervisorIntervention.takenOverByName` | string | No | Their display name. Absent when it could not be resolved. |
| `call.supervisorIntervention.takenOverAt` | string (date-time) | Yes | — |
| `call.hasTranscript` | boolean | No | Whether a transcript is stored for this call. False when none was ever stored: the agent had neither transcript retention nor analysis switched on, or the call ended before a turn was streamed. |
| `call.transcriptTruncated` | boolean | No | — |
| `call.analysis` | object | No | The result of the post-call analysis pass. `pending` means the call has not been analyzed yet; a call whose analysis job was never accepted, or never ran to completion, stays pending indefinitely, so Tandem shows a pending call as stale once 15 minutes have passed since it ended. `skipped` means it never will be analyzed, either because the agent has analysis off — the call is still recorded, and still has a transcript if retention is on — or because there was nothing to analyze. |
| `call.analysis.status` | enum: `pending` \| `complete` \| `partial` \| `skipped` \| `failed` | No | — |
| `call.analysis.values` | object | No | The extracted values, keyed by field name. Includes the enabled built-ins under their own names — `sentiment` (`positive`, `neutral`, `negative`, or `unknown`), `outcome` (`success`, `failure`, or `unknown`), and `summary` — alongside the operator-defined fields. |
| `call.analysis.fieldErrors` | object | No | Present only when `status` is `partial`: the fields the model could not produce a valid value for, keyed by field name. |
| `call.analysis.error` | string | No | Why the analysis was skipped or failed. |
| `call.analysis.model` | string | No | — |
| `call.analysis.completedAt` | string (date-time) | No | — |
| `call.wrapUp` | object | No | What the agent's wrap-up tools did for this call. Present only when the agent had at least one wrap-up tool. `pending` means the post-call pass has not finished, `skipped` means it will not run, and `done` means every wrap-up tool the pass considered has an entry in `tools`. |
| `call.wrapUp.status` | enum: `pending` \| `skipped` \| `done` | No | — |
| `call.wrapUp.skipReason` | enum: `flag_off` \| `no_transcript` \| `settled_live` \| `transcript_unavailable` \| `no_caller_speech` \| `handed_off` | No | Present when `status` is `skipped`. `flag_off`: the call ended while wrap-up tools were still behind a rollout flag. `no_transcript`: no transcript was stored for the call. `settled_live`: every wrap-up tool was already called during the call and succeeded, or may have. `transcript_unavailable`: the stored transcript expired or was erased before the post-call pass read it. `no_caller_speech`: the caller never spoke, so no wrap-up tool was considered. `handed_off`: the agent handed the call to a workflow, and no agent took it back before the call ended. When an agent does take it back, that agent's session decides the wrap-up for the whole call. |
| `call.wrapUp.live` | object | No | The outcome of each wrap-up tool the agent called during the call, keyed by tool name. A tool the agent did not call is absent. `unknown` means the request may have reached the integration. |
| `call.wrapUp.tools` | object | No | The post-call outcome of each wrap-up tool, keyed by tool name. |

### 400 — The request was malformed. `error` names the reason, such as `invalid_agentId`, `invalid_version`, `invalid_slot`, or `invalid_prompt`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string | No | A stable machine-readable code. |
| `message` | string | No | A human-readable explanation, safe to show to an end user. Present on errors an operator can act on; browser clients display this field in preference to a generic fallback. |
| `limit` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the bound itself. |
| `length` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the measured size of the rejected value. |
| `reason` | string | No | Present on some errors (e.g. `invalid_avatar_image`) that have more than one cause: which one applied. |

### 401 — Missing, malformed, or expired bearer token.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string | No | A stable machine-readable code. |
| `message` | string | No | A human-readable explanation, safe to show to an end user. Present on errors an operator can act on; browser clients display this field in preference to a generic fallback. |
| `limit` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the bound itself. |
| `length` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the measured size of the rejected value. |
| `reason` | string | No | Present on some errors (e.g. `invalid_avatar_image`) that have more than one cause: which one applied. |

### 404 — The resource does not exist.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string | No | A stable machine-readable code. |
| `message` | string | No | A human-readable explanation, safe to show to an end user. Present on errors an operator can act on; browser clients display this field in preference to a generic fallback. |
| `limit` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the bound itself. |
| `length` | integer | No | Present on some errors (e.g. `prompt_too_long`) that reject a value against a fixed bound: the measured size of the rejected value. |
| `reason` | string | No | Present on some errors (e.g. `invalid_avatar_image`) that have more than one cause: which one applied. |
