---
title: "Read Speak AI voice agent engagement metrics"
description: "Workspace and per-agent call metrics: totals, completion rate, average duration, and an engagement funnel bucketed by how deep each conversation went."
---

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

# Read Speak AI voice agent engagement metrics


import EndpointIndex from "@/components/api/EndpointIndex.astro";

The Speak AI API exposes 3 analytics endpoints under the base URL `https://api.speakai.co/v1`. Every request needs the `x-speakai-key` and `x-access-token` headers described in [Authentication](/api/authentication/).

## What can you do with the analytics endpoints?

Speak AI groups these 3 endpoints under the analytics resource. Each entry below links to the full reference for that endpoint further down this page.

| Method | Path | What it does |
| --- | --- | --- |
| `GET` | [`/voice/analytics/funnel`](#get-voice-analytics-funnel) | Engagement Funnel Summaries |
| `GET` | [`/voice/analytics/overview`](#get-voice-analytics-overview) | Analytics Overview |
| `GET` | [`/voice/analytics/funnel/agent`](#get-voice-analytics-funnel-agent) | Engagement Funnel For Agent |

<h2 id="get-voice-analytics-funnel">Engagement Funnel Summaries</h2>

#### Engagement Funnel Summaries

The same bounce/brief/engaged/deep breakdown as Engagement Funnel For Agent, but as one summary row per agent across your whole workspace, sorted by deepRate descending. The response payload is a bare array directly on data -- not an object, and not nested under a named key.

### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `since` | query | string | No | ISO date. Defaults to 30 days ago. |

<div slot="code">

<CodePanel label="Example request">

```bash
curl -X GET 'https://api.speakai.co/v1/voice/analytics/funnel' \
  -H 'x-speakai-key: sk_test_speak_0000000000000000' \
  -H 'x-access-token: eyJhbGciOiJIUzI1NiJ9.test-access-token.0000000000'
```

</CodePanel>

<ResponsePanel id="get-voice-analytics-funnel" statuses={[{"code":"200","description":"OK"},{"code":"400","description":"Invalid since date"}]}>

<div slot="status-200">

**`200` OK**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `success` . |
| `data` | object[] |  |

<details>
<summary>`data` -- 7 more fields</summary>

| Field | Type |
| --- | --- |
| `agentId` | string |
| `agentName` | string |
| `totalConversations` | integer |
| `bounceRate` | integer |
| `briefRate` | integer |
| `engagedRate` | integer |
| `deepRate` | integer |

</details>

Example response, `application/json`.

```json
{
  "status": "success",
  "data": [
{
  "agentId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "agentName": "Support Agent",
  "totalConversations": 80,
  "bounceRate": 15,
  "briefRate": 30,
  "engagedRate": 40,
  "deepRate": 15
}
  ]
}
```

</div>

<div slot="status-400">

**`400` Invalid since date**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `failed` . |
| `message` | string |  |

</div>

</ResponsePanel>

</div>

<h2 id="get-voice-analytics-overview">Analytics Overview</h2>

#### Analytics Overview

Workspace-level call metrics: totals, week-over-week counts, completion rate, average duration, a 14-day daily time series, and average post-call feedback rating. Optionally scope to one agentId. Unlike most endpoints in this API, the response payload sits directly on data, not nested under a named key.

### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `agentId` | query | string | No | Scope to one agent. Omit for the whole workspace. |

<div slot="code">

<CodePanel label="Example request">

```bash
curl -X GET 'https://api.speakai.co/v1/voice/analytics/overview' \
  -H 'x-speakai-key: sk_test_speak_0000000000000000' \
  -H 'x-access-token: eyJhbGciOiJIUzI1NiJ9.test-access-token.0000000000'
```

</CodePanel>

<ResponsePanel id="get-voice-analytics-overview" statuses={[{"code":"200","description":"OK"}]}>

<div slot="status-200">

**`200` OK**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `success` . |
| `data` | object |  |

<details>
<summary>`data` -- 8 more fields</summary>

| Field | Type | Description |
| --- | --- | --- |
| `totalConversations` | integer |  |
| `thisWeekCount` | integer |  |
| `lastWeekCount` | integer |  |
| `completionRate` | number | 0-1. Share of calls that reached status completed. |
| `avgDurationSeconds` | number |  |
| `dailyCounts` | object[] | Last 14 days, oldest first, zero-filled for days with no calls. |
| `dailyCounts[].date` | string |  |
| `dailyCounts[].count` | integer |  |
| `averageRating` | number | Average post-call feedback rating (1-5). 0 if no feedback submitted yet. |
| `ratingCount` | integer |  |

</details>

Example response, `application/json`.

```json
{
  "status": "success",
  "data": {
"totalConversations": 214,
"thisWeekCount": 31,
"lastWeekCount": 27,
"completionRate": 0.92,
"avgDurationSeconds": 138.4,
"dailyCounts": [
  {
    "date": "2026-07-19",
    "count": 4
  },
  {
    "date": "2026-07-20",
    "count": 6
  }
],
"averageRating": 4.3,
"ratingCount": 58
  }
}
```

</div>

</ResponsePanel>

</div>

<h2 id="get-voice-analytics-funnel-agent">Engagement Funnel For Agent</h2>

#### Engagement Funnel For Agent

Buckets one agent's conversations by transcript turn count (bounce/brief/engaged/deep), each with average duration and sentiment split. Defaults to the last 30 days if since is omitted; since older than 365 days is floored to 365 days ago. The response payload sits directly on data, not nested under a named key.

### Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `agentId` | query | string | Yes | Required. |
| `since` | query | string | No | ISO date. Defaults to 30 days ago. |

<div slot="code">

<CodePanel label="Example request">

```bash
curl -X GET 'https://api.speakai.co/v1/voice/analytics/funnel/agent' \
  -H 'x-speakai-key: sk_test_speak_0000000000000000' \
  -H 'x-access-token: eyJhbGciOiJIUzI1NiJ9.test-access-token.0000000000'
```

</CodePanel>

<ResponsePanel id="get-voice-analytics-funnel-agent" statuses={[{"code":"200","description":"OK"},{"code":"400","description":"Invalid since date"},{"code":"404","description":"Agent not found"}]}>

<div slot="status-200">

**`200` OK**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `success` . |
| `data` | object |  |
| `data.buckets` | object[] | Always 4 buckets, in order: Bounce (0-1 turns), Brief (2-5), Engaged (6-15), Deep (16+). |
| `data.totalConversations` | integer |  |
| `data.since` | string (date-time) |  |

<details>
<summary>`data.buckets` -- 7 more fields</summary>

| Field | Type |
| --- | --- |
| `label` | string |
| `minMessages` | integer |
| `maxMessages` | integer |
| `count` | integer |
| `percentage` | integer |
| `avgDurationSeconds` | number |
| `sentimentBreakdown` | object |
| `sentimentBreakdown.positive` | integer |
| `sentimentBreakdown.neutral` | integer |
| `sentimentBreakdown.negative` | integer |
| `sentimentBreakdown.unanalyzed` | integer |

</details>

Example response, `application/json`.

```json
{
  "status": "success",
  "data": {
"buckets": [
  {
    "label": "Bounce (0-1)",
    "minMessages": 0,
    "maxMessages": 1,
    "count": 12,
    "percentage": 15,
    "avgDurationSeconds": 8.2,
    "sentimentBreakdown": {
      "positive": 2,
      "neutral": 8,
      "negative": 2,
      "unanalyzed": 0
    }
  }
],
"totalConversations": 80,
"since": "2026-07-01T00:00:00.000Z"
  }
}
```

</div>

<div slot="status-400">

**`400` Invalid since date**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `failed` . |
| `message` | string |  |

</div>

<div slot="status-404">

**`404` Agent not found**

Response body, `application/json`.

| Field | Type | Description |
| --- | --- | --- |
| `status` | string | One of: `failed` . |
| `requestId` | string |  |
| `code` | integer |  |
| `message` | string |  |
| `hints` | string[] |  |

Example response, `application/json`.

```json
{
  "status": "failed",
  "code": 404,
  "message": "Agent not found",
  "hints": []
}
```

</div>

</ResponsePanel>

</div>

## Related pages

- [API reference](/api/) for the base URL, authentication, and the error format.
- [Authenticate with the Speak AI API using access tokens](/api/authentication/)
- [Upload audio and video to Speak AI and read insights](/api/media/)
- [Create and update live transcription sessions](/api/live-transcription/)
- [Analyze text notes with the Speak AI text endpoints](/api/text/)

Get an API key on the [Speak AI developer page](https://app.speakai.co/developers?utm_source=docs&utm_medium=referral&utm_campaign=api-reference&utm_content=api-voice-agents/analytics).

Source: https://docs.speakai.co/api/voice-agents/analytics/index.mdx
