Skip to main content
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:
  • 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 and the WebSocket stream. There is no new webhook event type.
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.

Speak on Arrival

Set speak_on_enter to the text the bot should say as soon as it is admitted, with no speak call of your own. It sits alongside voice, barge_in and summarize_on_end, and applies to every session.
With an attached Telnyx AI Assistant, 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.

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.