> ## 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.

# Announce the Bot on Arrival

> Have the bot introduce itself the moment it joins -- spoken, posted to chat, or both.

A bot that appears in a meeting without explaining itself is the thing attendees complain about. Two create parameters let it introduce itself as it is admitted: `speak_on_enter` says a line out loud, `chat_on_enter` posts one to the meeting chat. Both are set when you create the session -- neither is an action, and neither can be changed once the bot is on its way.

They are independent and can be used together.

## Post to Chat on Arrival

Set `chat_on_enter` -- typically a recording disclosure. It takes 1-4000 characters:

```bash theme={null}
curl -X POST https://api.telnyx.com/v2/meeting_sessions \
  -H "Authorization: Bearer $TELNYX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_url": "https://meet.google.com/abc-defg-hij",
    "chat_on_enter": "Hello, I am Oliver'"'"'s meeting bot assistant. I am recording this session."
  }'
```

* **Delivered at most once.** Duplicate provider callbacks and service restarts can never repost it.
* **Independent of `speak_on_enter`.** Both can be set on one session, and the chat message posts first: it does not wait for text-to-speech or avatar startup.
* **Works with an assistant attached.** An assistant owns the voice, not the chat.
* Echoed back as `config.chat_on_enter`, `null` when unset.
* Appends a `bot.chat_on_enter_delivered` event to the session's [event history](/docs/meeting/events) and the WebSocket stream. There is no new webhook event type.

<Note>
  On a platform with no meeting chat -- Webex, or a URL the service does not recognise -- **create is rejected up front with `422 unsupported_capability`** rather than accepting a message that could never be posted. You find out when you ask for it, not by discovering later that nothing was said.
</Note>

## Speak on Arrival

Set `speak_on_enter` to the text the bot should say as soon as it is admitted, with no [speak](/docs/meeting/control/speak) call of your own. It sits alongside `voice`, `barge_in` and `summarize_on_end`, and applies to every session.

```bash theme={null}
curl -X POST https://api.telnyx.com/v2/meeting_sessions \
  -H "Authorization: Bearer $TELNYX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_url": "https://meet.google.com/abc-defg-hij",
    "speak_on_enter": "Hi, I am taking notes for this call."
  }'
```

<Note>
  With an attached [Telnyx AI Assistant](/docs/meeting/ai-assistants), `speak_on_enter` is delivered through the assistant's output page rather than the bot mic, and only once the assistant reaches `connected` -- so the greeting waits for assistant startup instead of landing the instant the bot is admitted. It is still delivered at most once. `chat_on_enter`, by contrast, posts immediately and does not wait on the assistant.
</Note>

## Where These Live on the Session

`speak_on_enter` is sent **flat on the create request** and read back **nested under `config`** on the session object, along with `voice`, `barge_in` and `summarize_on_end`. Sending them wrapped in `config` is rejected with `400 invalid_request: body: Unrecognized key(s) in object: 'config'`. `chat_on_enter` follows the same rule.

## Related

* [Join a Meeting](/docs/meeting/join-meeting) -- the rest of the create request
* [Chat](/docs/meeting/control/chat) -- post to chat during the meeting
* [Speak](/docs/meeting/control/speak) -- speak during the meeting
* [Telnyx AI Assistants](/docs/meeting/ai-assistants) -- what an attached assistant takes over
* [Session Events](/docs/meeting/events) -- `bot.chat_on_enter_delivered`
