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

# Retrieve Call Analysis — GET /calls/{identifier}/analysis

> Retrieve AI-generated call analysis including rating, coaching feedback, summary, disposition, objections, action items, and speaker labels.

After you submit a call via `POST /calls`, Shilo processes it asynchronously — transcribing the audio, resolving speaker identities, and running AI coaching models. This endpoint exposes the results of that analysis. Because processing takes time, the response includes a `progress` field (0–100) that you should poll until it reaches `100` before reading analysis results. Individual analysis fields will be `null` until their respective model runs complete.

## Endpoint

```text theme={null}
GET https://api.shilo.ai/api/v1/calls/{identifier}/analysis
```

## Path Parameter

<ParamField path="identifier" type="string" required>
  Identifies the call whose analysis you want to retrieve. The same three formats accepted by `GET /calls/{identifier}` are supported here:

  | Format                           | Example                                              |
  | -------------------------------- | ---------------------------------------------------- |
  | `{uuid}`                         | `ee6f2136-b94a-4438-9335-3acf5b2a0d31`               |
  | `call_event_id:{uuid}`           | `call_event_id:ee6f2136-b94a-4438-9335-3acf5b2a0d31` |
  | `external_recording_id:{string}` | `external_recording_id:rec-20300924-001`             |
</ParamField>

## Response

A successful request returns HTTP `200` with a `RecordingAnalysis` object. Check `progress` before reading analysis fields.

<Note>
  Analysis fields (`action_items`, `coaching`, `disposition`, `objections`, `rating`, `speakers`, `summary`) may be `null` while `progress` is less than `100`. Always poll this endpoint until `progress === 100` before consuming these fields in your application.
</Note>

<ResponseField name="id" type="string">
  Shilo's unique UUID for this analysis record.
</ResponseField>

<ResponseField name="recording_id" type="string">
  The Shilo Call UUID this analysis belongs to.
</ResponseField>

<ResponseField name="created_at" type="string">
  ISO-8601 timestamp of when this analysis record was created.
</ResponseField>

<ResponseField name="progress" type="number">
  Integer from `0` to `100` representing overall analysis completion. Poll until this value equals `100` before reading results. A value of `100` guarantees all AI models have finished.
</ResponseField>

<ResponseField name="action_items" type="object">
  Follow-up actions the AI identified from the call. `null` until analysis is complete.

  <Expandable title="action_items fields">
    <ResponseField name="id" type="string">
      Unique identifier for this action items result.
    </ResponseField>

    <ResponseField name="primary" type="string[]">
      Array of the most important follow-up actions the agent should take after this call.
    </ResponseField>

    <ResponseField name="secondary" type="string[]">
      Array of additional, lower-priority follow-up actions surfaced by the AI.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="coaching" type="object">
  AI-generated coaching feedback for the agent. `null` until analysis is complete.

  <Expandable title="coaching fields">
    <ResponseField name="id" type="string">
      Unique identifier for this coaching result.
    </ResponseField>

    <ResponseField name="possible_improvements" type="string[]">
      Array of coaching suggestions — specific behaviors or techniques the agent could improve on the next call.
    </ResponseField>

    <ResponseField name="top_moments" type="string[]">
      Array of highlights identifying moments in the call where the agent performed particularly well.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="disposition" type="object">
  AI-determined outcome of the call. `null` until analysis is complete.

  <Expandable title="disposition fields">
    <ResponseField name="id" type="string">
      Unique identifier for this disposition result.
    </ResponseField>

    <ResponseField name="outcomes" type="string[]">
      Array of disposition labels assigned to this call (e.g. `"Appointment Set"`, `"Not Interested"`).
    </ResponseField>

    <ResponseField name="reasoning" type="string">
      The AI's explanation for why it assigned these disposition outcomes.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="objections" type="object">
  Objections raised by the contact during the call. `null` until analysis is complete.

  <Expandable title="objections fields">
    <ResponseField name="id" type="string">
      Unique identifier for this objections result.
    </ResponseField>

    <ResponseField name="outcomes" type="string[]">
      Array of objection strings identified in the conversation (e.g. `"Not the right time"`, `"Already working with an agent"`).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="rating" type="object">
  AI-generated numeric rating of the call. `null` until analysis is complete.

  <Expandable title="rating fields">
    <ResponseField name="id" type="string">
      Unique identifier for this rating result.
    </ResponseField>

    <ResponseField name="outcome" type="number">
      Numeric score for the call based on your organization's AI coaching rubric.
    </ResponseField>

    <ResponseField name="reasoning" type="string">
      The AI's explanation of the factors that drove this rating.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="speakers" type="object">
  Resolved speaker identity mapping for the transcript. `null` until analysis is complete.

  <Expandable title="speakers fields">
    <ResponseField name="id" type="string">
      Unique identifier for this speakers result.
    </ResponseField>

    <ResponseField name="user_name" type="string">
      The agent's display name as resolved by Shilo's speaker identification model.
    </ResponseField>

    <ResponseField name="client_name" type="string">
      The contact's display name as resolved by Shilo's speaker identification model.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="summary" type="object">
  AI-generated summary of the call. `null` until analysis is complete.

  <Expandable title="summary fields">
    <ResponseField name="id" type="string">
      Unique identifier for this summary result.
    </ResponseField>

    <ResponseField name="outcome" type="object">
      Object containing the summary content. The structure of this object may vary by AI model configuration — it typically contains one or more text fields with the generated summary.
    </ResponseField>
  </Expandable>
</ResponseField>

## Example Request

```bash theme={null}
curl --request GET \
  --url "https://api.shilo.ai/api/v1/calls/call_event_id:ee6f2136-b94a-4438-9335-3acf5b2a0d31/analysis" \
  --header "x-api-key: YOUR_API_KEY"
```

### Example Response

```json theme={null}
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "recording_id": "ee6f2136-b94a-4438-9335-3acf5b2a0d31",
  "created_at": "2030-09-24T12:35:00Z",
  "progress": 100,
  "action_items": {
    "id": "act-001",
    "primary": [
      "Send the client a follow-up email with the property details discussed",
      "Schedule a showing for next Tuesday"
    ],
    "secondary": [
      "Add client to the monthly newsletter"
    ]
  },
  "coaching": {
    "id": "coa-001",
    "possible_improvements": [
      "Ask more open-ended discovery questions before presenting listings",
      "Confirm the client's timeline earlier in the conversation"
    ],
    "top_moments": [
      "Handled the pricing objection effectively at 2:14",
      "Strong rapport-building in the opening 30 seconds"
    ]
  },
  "disposition": {
    "id": "dis-001",
    "outcomes": ["Appointment Set"],
    "reasoning": "The agent and contact agreed on a showing for next Tuesday at 10am."
  },
  "objections": {
    "id": "obj-001",
    "outcomes": [
      "Price is too high",
      "Need to talk to spouse first"
    ]
  },
  "rating": {
    "id": "rat-001",
    "outcome": 82,
    "reasoning": "Strong opener and close; opportunity to improve mid-call discovery."
  },
  "speakers": {
    "id": "spk-001",
    "user_name": "Jordan Smith",
    "client_name": "Alex Johnson"
  },
  "summary": {
    "id": "sum-001",
    "outcome": {
      "text": "Jordan spoke with Alex about available listings in the Eastside neighborhood. Alex expressed interest in a 3-bedroom home under $650k. They agreed on a Tuesday showing and Jordan will send a curated list of properties beforehand."
    }
  }
}
```

## Error Responses

**400 Bad Request** — The identifier format is invalid.

```json theme={null}
{
  "statusCode": 400,
  "message": "Invalid identifier format"
}
```

**404 Not Found** — No call matching the provided identifier exists in your organization.

```json theme={null}
{
  "statusCode": 404,
  "message": "Call not found"
}
```
