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

# Control the meeting bot: speak, chat, and automate

> The three ways to drive the bot in a live meeting: speak, chat, and running an assistant.

While the meeting is `active`, the bot does three things, and you choose how each is driven:

* [**Speak**](https://developers.telnyx.com/docs/meeting/control/speak.md) -- say text out loud, and stop mid-utterance.
* [**Chat**](https://developers.telnyx.com/docs/meeting/control/chat.md) -- post to the meeting's native chat.
* [**Automate**](https://developers.telnyx.com/docs/meeting/ai-assistants.md) -- hand the *speaking* to a Telnyx AI Assistant, which listens and answers on its own.

The first two are manual: every word is a call you make. The third is designed to own the *speaking* -- an attached assistant holds the conversation -- while `send_chat` keeps working exactly as it does without one. `speak` is **not** refused with an assistant attached: the bot becomes a webpage-output bot and speak audio routes through the assistant's output page instead of the bot mic (see [Speak](https://developers.telnyx.com/docs/meeting/control/speak.md)). The assistant is still meant to do the talking, so pick between speaking modes before the meeting rather than discovering the difference during it; [Telnyx AI Assistants](https://developers.telnyx.com/docs/meeting/ai-assistants.md) sets out what the assistant takes over.

All manual actions return `202 Accepted` and complete asynchronously.

## Same Commands over WebSocket

The same actions can be sent as frames on the [live transcript stream](https://developers.telnyx.com/docs/meeting/live-transcript.md) instead of over REST:

```json theme={null}
{ "action": "speak", "text": "Let's recap what we agreed on.", "interrupt": false }
```

```json theme={null}
{ "action": "send_chat", "text": "Noted. I will send the summary after the call." }
```

The stream is convenient for low-latency bots, but it allows at most 8 commands in flight or queued and gives no per-command acknowledgement. Prefer REST actions when you need a durable, acknowledged response.

The socket's own limits -- frame size, close codes, and cursor resumption on reconnect -- are covered in [Live Transcript](https://developers.telnyx.com/docs/meeting/live-transcript.md#connect-to-the-websocket-stream).

## Errors

Action requests fail with a non-2xx status and an error envelope, for example when the session is not `active`:

```json theme={null}
{
  "error": {
    "code": "invalid_state",
    "message": "session must be active to perform this action (current status: ended)"
  }
}
```

> [!NOTE]
>
> Not every failure carries a body. A `502` from [`speak`](https://developers.telnyx.com/docs/meeting/control/speak) — for instance when the audio cannot be handed to an [assistant](https://developers.telnyx.com/docs/meeting/ai-assistants.md) output page — can come back with no JSON, so branch on the status code before parsing the body.

Every code the Meeting API returns is listed in [Meeting API Errors](https://developers.telnyx.com/docs/meeting/errors.md).

## Related

* [Speak](https://developers.telnyx.com/docs/meeting/control/speak.md) -- make the bot say something, and stop it
* [Chat](https://developers.telnyx.com/docs/meeting/control/chat.md) -- post to the meeting chat and read replies
* [Telnyx AI Assistants](https://developers.telnyx.com/docs/meeting/ai-assistants.md) -- let an assistant hold the conversation
* [Live Transcript](https://developers.telnyx.com/docs/meeting/live-transcript.md) -- follow the transcript stream in real time
