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

# Live monitoring

> Listen in on an in-progress call, read-only.

Live monitoring lets you listen to a conversation while it is still happening. Open the detail page of an active conversation and a live snoop panel attaches automatically, streaming the call's audio and live transcription to your browser. It is strictly listen-only: you are hidden from the room, so the agent and the caller cannot see or hear you.

<Note>
  Live monitoring is for observation only. There is no whisper, no barge-in, and no way to take over the call from this panel. To bring a human into a live call, use the agent's warm-transfer action — see [Call transfers and conference](/agents/transfers) and [Agent assist](/agent-assist/overview).
</Note>

## In-app snoop panel

When you open a conversation that is still active, the page requests a listener token in the background. If one is granted, the snoop panel appears with a red **LIVE** badge and the message "Listening in. The agent and caller can't see you or hear you."

The panel starts muted. Use the controls to listen and to leave:

| Control          | Action                                                                                                            |
| ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Listen**       | Unmutes the call audio so you can hear it. Browsers require this click as the user gesture before audio can play. |
| **Mute**         | Re-mutes the audio. Transcription keeps streaming either way.                                                     |
| **Stop** (the X) | Disconnects you from the room and closes the panel.                                                               |

The badge reflects connection state: **Connecting…** while joining, **LIVE** once connected, and **Ended** once the call finishes. The panel detects the call ending when the agent leaves the room, and it tears down automatically when the conversation reaches a terminal status.

## Listener-token endpoint

The panel is backed by a single endpoint that mints a subscribe-only LiveKit token for an active conversation. SDK consumers building their own monitoring tools can call it directly.

```
POST https://api.anyreach.ai/core/conversations/{conversation_id}/listener-token
Authorization: Bearer <token>
X-Anyreach-Org: <organization_id>   # required for user PATs (pat_)
```

The token grants `room_join` and `can_subscribe` only — `can_publish` and `can_publish_data` are both false and the participant is `hidden`, so an observer can hear audio and receive data frames such as live transcription, but cannot publish anything or be seen by other participants.

### Response

```json theme={null}
{
  "url": "wss://...",
  "token": "<listener JWT>",
  "room_name": "<livekit room>",
  "expires_at": "2026-06-18T12:15:00Z"
}
```

| Field        | Type         | Description                                         |
| ------------ | ------------ | --------------------------------------------------- |
| `url`        | string       | LiveKit server URL to connect to.                   |
| `token`      | string       | Listener JWT: subscribe-only, hidden, audio + data. |
| `room_name`  | string       | The LiveKit room the conversation is in.            |
| `expires_at` | string (UTC) | When the listener token expires.                    |

The token has a 15-minute TTL. For calls that run longer, re-mint it before it expires by calling the endpoint again and reconnecting with the new token — the in-app panel does this automatically.

### Errors

| Status | When                                                                                                                                                |
| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `404`  | The conversation does not exist, or it is active but has no LiveKit room associated with it.                                                        |
| `409`  | The conversation is not active. Listener tokens are only available for in-progress conversations (status `triggered`, `ringing`, or `in_progress`). |

## Permissions

The listener-token endpoint requires `conversations:read_sensitive` or `conversations:manage`. This is stricter than reading the conversation list or transcript: a token that can only read conversations cannot mint a listener token.

<Info>
  Live audio is sensitive, so the gate is intentionally tighter than read access. If your monitoring tool gets a permission error, check that its scopes include `conversations:read_sensitive` or `conversations:manage`.
</Info>

## Related

<CardGroup cols={2}>
  <Card title="Agent assist" icon="headset" href="/agent-assist/overview">
    Live human-in-the-loop monitoring and handoff.
  </Card>

  <Card title="Call transfers and conference" icon="phone-arrow-right" href="/agents/transfers">
    Warm transfer is the path to actually take over a live call.
  </Card>
</CardGroup>
