Skip to main content
Your systems can connect to a conversation while it happens. A WebSocket streams what the customer and the agent say, the tools the agent runs, and when the conversation ends. The same connection takes control commands. Use it for quality assurance, live dashboards, supervising calls, or stepping in when a conversation needs a person. Monitoring works on phone and website calls and on website, mobile SDK and API chats. WhatsApp, Messenger, Instagram, Slack, email and SMS conversations cannot be monitored yet. Monitoring is available on every plan.
Monitoring shows customers’ words to whoever holds the key. Tell your customers where the law requires it, the same way you would for call recording or quality review.

Turn it on

  1. Open the agent, then Settings → Advanced.
  2. In the Monitoring card, turn on Monitoring.
  3. Under Events, choose what a monitor receives.
  4. Choose Save.
Monitoring card in Advanced settings with the Monitoring switch on and the selected events shown as tags

The Monitoring card with its selected events.

The setting belongs to the agent, so every branch shares it, and you change it on Main. It needs no publish. It applies to calls that start after you save and to chats from their next message, and turning it off closes open connections within 15 seconds.

Connect

To connect you need three things: Browsers cannot set headers on a WebSocket, so connect from your server. Keep API keys out of browser code.
Everything that can refuse a connection answers as ordinary HTTP, before the socket opens. To check a key and a conversation, send the same URL with curl over https://. If nothing stands in the way, it answers 426.

Find a conversation

A conversation must be in progress before you can connect. List the ones you can monitor with the conversations endpoint:
Each result’s id is the conversation_id. A call counts until it ends. A text conversation counts until it ends, or for a day after its last message.

Events

When you connect you receive the conversation’s last 100 or so events, then new ones as they happen. Every event has these fields, plus the body shown below:
event_id counts up within a conversation. It is how you tell events apart after a reconnect. Events reach you about a second after they happen, and a call’s final words can take a few seconds to arrive on a Realtime voice. You choose among these on the agent: New monitors start with everything except agent_tool_response_full_payload and agent_chat_response_part. A tool’s result can hold anything the tool returned, so select it only when your client can be trusted with it. A workflow can only mask a sensitive value once it has read and stored it, so a conversation with sensitive variables or a keypad step works in two ways:
  • On a step that can take a sensitive value, you get the events but not the words: user_transcript, agent_response, corrections and full tool results read •••, and tool arguments are empty. This covers every Collect step, a keypad step, and a step whose way out stores a sensitive value, for as long as the conversation is on that step. The conversation’s stored transcript keeps its usual text.
  • Every other step is sent as usual, with stored values masked wherever they appear. In a chat, the customer’s message reaches you with the agent’s reply, and a turn that stores a value shows ••• for that turn.
agent_chat_response_part is not sent for a conversation that can hold a sensitive value, because a value could fall across two parts. Masking finds a value in its digits or its exact text. If a customer gives a value on a step that does not take it, or says it in another form such as a date in words, it can reach you unmasked. Replays mask what the workflow has stored by then. Audio, voice activity scores, turn probability and pings cannot be monitored. These always arrive, whatever you select:

Control commands

Send one JSON message per command. Add an optional command_id of your own, and it comes back on the result.

End the conversation

A call hangs up at once. A chat closes, and the customer’s next message is told the conversation has ended. While another ticket is open on a chat during a takeover, the command is refused until that one closes.

Transfer to a phone number

The agent stops talking and the caller moves to the number. Turn on the Transfer to number tool for the agent first. A number bought through Centillion can transfer only within its own country, and never to premium-rate numbers. If the carrier refuses the transfer, the agent stays on the line and the result says transfer_failed.

Add context

The agent uses it in its replies from then on. It does not interrupt or trigger a reply, the customer never sees it, and it stays out of the transcript. Up to 4,000 characters. A chat keeps the latest 20 updates. A call takes 40,000 characters of updates in all, and fails the rest with context_full.

Take over a chat

The AI stops answering and a live chat ticket opens in the Helpdesk, so your team can see it and join. Turn on Helpdesk for the agent first. API conversations cannot be taken over, because nothing shows them a person’s reply. To reach a person on a call, use transfer_to_number. While you hold the conversation, the customer’s messages keep arriving as user_transcript.

Send a message as a person

The customer sees it from Support. Up to 4,000 characters.

Give the chat back to the AI

The ticket closes and the AI answers the next message, whatever your Helpdesk close setting says. If another ticket is open on the same conversation, the command is refused until that one closes.

Results

A command that ran is reported to every monitor of the conversation:
status is applied or failed. A failed command has a code: transfer_failed, room_not_closed, agent_unavailable, call_ended, context_full, not_a_phone_call, timed_out or internal_error. A command that never ran is answered only to the monitor that sent it, with status: "refused" and no event_id:

Staying connected

A connection lasts about 13 minutes, then closes with code 1012. Reconnect with the last event_id you saw, and you receive only what came after it:

Limits

  • About the last 100 events of a conversation are available. Earlier ones are gone for a monitor, though the stored conversation keeps its messages.
  • Each conversation takes 10 connections, and each key 50.
  • Each connection takes 20 commands in 10 seconds, and connecting counts toward the key’s rate limit.
  • A conversation must already be in progress on an agent with monitoring on. You cannot connect before it starts or after it ends.
  • Events carry text and metadata, never audio.
Last modified on November 2, 2026