> ## Documentation Index
> Fetch the complete documentation index at: https://docs.talkover.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get call insight

> Return the conversation result of one call: analysis status, collected data, summary and transcript

# Get call insight

Returns what the agent captured in one conversation: whether a person answered, the result, the data the agent was configured to collect, a summary and the full transcript.

This is the same information the `event_call_report` webhook delivers, available on demand. Use it to reconcile a call without depending on the webhook, or to read the summary and transcript, which are not included in [List calls](/en/api-reference/endpoints/list-calls) because of their size.

## Endpoint

```
GET /api/v1/calls/{call_id}/insight
```

## Path parameters

<ParamField path="call_id" type="string" required>
  The call's `id`, as returned by [List calls](/en/api-reference/endpoints/list-calls) or [Make a call](/en/api-reference/endpoints/make-call).
</ParamField>

## Request headers

<ParamField header="Authorization" type="string" required>
  Bearer token. Format: `Bearer talq_your_environment_token_here`
</ParamField>

## Example request

<RequestExample>
  ```bash theme={null}
  curl -X GET "https://app.talkover.ai/api/v1/calls/01a0c5a5-390e-710a-a3aa-cab502215d09/insight" \
    -H "Authorization: Bearer talq_your_environment_token_here"
  ```

  ```javascript theme={null}
  const response = await fetch(
    'https://app.talkover.ai/api/v1/calls/01a0c5a5-390e-710a-a3aa-cab502215d09/insight',
    { headers: { Authorization: 'Bearer talq_your_environment_token_here' } }
  );

  const { data } = await response.json();

  if (data.analysis_status === 'pending') {
    // The analysis runs after the call ends. Query again later.
  }
  ```
</RequestExample>

## Response

### Success response (200 OK)

<ResponseExample>
  ```json theme={null}
  {
    "success": true,
    "data": {
      "call_id": "01a0c5a5-390e-710a-a3aa-cab502215d09",
      "analysis_status": "completed",
      "duration": 64,
      "human_detected": true,
      "objective_achieved": false,
      "call_result": "partial_contact",
      "collected_data": {
        "intent": null,
        "agreed_amount": null,
        "agreed_date": null,
        "whatsapp_confirmed": null
      },
      "campaign_id": "019ea766-4f99-731a-ad31-d99ac48d4812",
      "summary": "The agent tried to start a conversation with Mark, but the call was interrupted twice. Mark confirmed his identity; no agreement was reached.",
      "transcript": [
        {
          "role": "assistant",
          "content": "Hi, am I speaking with Mark?",
          "timestamp": "2026-09-21T20:25:46.000000Z"
        },
        {
          "role": "user",
          "content": "Hello?",
          "timestamp": "2026-09-21T20:26:13.000000Z"
        },
        {
          "role": "assistant",
          "content": "Hello Mark, this is Ana from the partner office handling your financing.",
          "timestamp": "2026-09-21T20:26:13.000000Z"
        }
      ]
    }
  }
  ```
</ResponseExample>

### Response fields

<ResponseField name="success" type="boolean" required>
  Whether the request succeeded.
</ResponseField>

<ResponseField name="data" type="object" required>
  <Expandable title="Insight object">
    <ResponseField name="call_id" type="string" required>
      The call's `id`.
    </ResponseField>

    <ResponseField name="analysis_status" type="string" required>
      State of the post-call analysis. Options: `completed`, `pending`, `unavailable`. See [Reading `analysis_status`](#reading-analysis_status).
    </ResponseField>

    <ResponseField name="duration" type="integer | null" required>
      Call duration in seconds. Comes from the call itself, not from the analysis, so it is present in every state. `null` when no talk time was measured (see notes).
    </ResponseField>

    <ResponseField name="human_detected" type="boolean | null" required>
      A person answered the call.
    </ResponseField>

    <ResponseField name="objective_achieved" type="boolean | null" required>
      The objective configured on the agent was reached.
    </ResponseField>

    <ResponseField name="call_result" type="string | null" required>
      Options: `success`, `partial_contact`, `unsuccessful`.
    </ResponseField>

    <ResponseField name="collected_data" type="object | null" required>
      The fields the agent is configured to collect ("fields to collect"), with the values extracted from the conversation. The keys are the ones defined on **your** agent. `{}` when nothing was collected.
    </ResponseField>

    <ResponseField name="campaign_id" type="string | null" required>
      Campaign that originated the dial. `null` for calls outside a campaign. Each retry is its own call, and all of them point to the same campaign.
    </ResponseField>

    <ResponseField name="summary" type="string | null" required>
      Summary of the conversation produced by the analysis.
    </ResponseField>

    <ResponseField name="transcript" type="array" required>
      Turns of the conversation in chronological order. Empty when there was no conversation. May already be filled while `analysis_status` is `pending`: the transcript is stored before the analysis runs.

      <Expandable title="Turn object">
        <ResponseField name="role" type="string" required>
          Who spoke. Options: `assistant` (the agent), `user` (the person).
        </ResponseField>

        <ResponseField name="content" type="string | null" required>
          What was said.
        </ResponseField>

        <ResponseField name="timestamp" type="string | null" required>
          ISO 8601 timestamp of the turn.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

`human_detected`, `objective_achieved`, `call_result`, `collected_data` and `summary` are `null` whenever `analysis_status` is not `completed`. A `false` in those fields is a real result of the analysis, never its absence.

## Reading `analysis_status`

The analysis runs **after** the call ends, usually within a minute. A call queried right after it ends has no result yet.

| Value         | Meaning                                                                                                                                                                                   | What to do                               |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| `completed`   | The analysis finished. The fields are reliable.                                                                                                                                           | Use them.                                |
| `pending`     | The call is still in progress, or ended less than 30 minutes ago and the analysis may still arrive.                                                                                       | Query again later. This is not a result. |
| `unavailable` | There is no analysis and there will be none: nobody answered (`no-answer`, `busy`, `failed`, `canceled`), the conversation was empty, or the analysis did not complete within the window. | Treat as "no result".                    |

A call never goes from `unavailable` back to `completed`. Once you see `unavailable`, stop querying.

`voicemail` calls follow the normal flow (`pending`, then `completed` or `unavailable`), because the agent may have talked before the voicemail was detected.

## Error responses

### 404 Not found

The call does not exist or belongs to another environment.

<ResponseExample>
  ```json theme={null}
  {
    "success": false,
    "message": "Not found",
    "error": "Not found"
  }
  ```
</ResponseExample>

### 401 Unauthorized

<ResponseExample>
  ```json theme={null}
  {
    "message": "Unauthenticated."
  }
  ```
</ResponseExample>

## Notes

<Info>
  **`duration: null`** on `voicemail`, `no-answer`, `failed` and `busy` calls means no talk time was measured. It is not zero.
</Info>

<Info>
  **Batch reconciliation.** To reconcile a day, use [List calls](/en/api-reference/endpoints/list-calls) with `include=insight`, at least 30 minutes after the last call ended. `pending` disappears and you get one request per page instead of one per call.
</Info>

<Info>
  **Deliberately excluded.** The provider's call SID, internal routing flags and the remaining analysis fields (sentiment, objections, script completion) are not part of this response.
</Info>

## Related endpoints

* **List calls**: `GET /api/v1/calls?include=insight` — the same block, without `summary` and `transcript`, for a whole page of calls.
* **Get agent calls**: `GET /api/v1/agents/{agent_id}/calls?include=insight`
* **Get recording URL**: `GET /api/v1/calls/{call_id}/recording-url`
