This article explains how to create a chat bot for a Bevy virtual event, generate its credentials, and connect an external app so it can listen to — and optionally post in — event chat.
Event chat bots let your team or a partner app join selected chat channels as a Stream user. Common uses include listen-only graphics (polls, leaderboards, featured messages), moderation helpers, and automated chat replies. This guide covers chat only. It does not cover call audio, closed captions, or Daily transcription.
When you finish this article, you have a bot on your event, a one-time token package, and a clear path to connect an external app.
Before you begin
You need:
- Permission to edit the event (the same permission used to change event settings)
- The Chat bots feature enabled for your community
- A virtual or hybrid event that has chat channels (for example Bevy Virtual Meetup, or a Bevy Virtual Conference with Main stage / session / room chat)
If you do not see a Chat bots tab when you open an event, contact your Bevy Customer Success Manager. The feature may not be enabled yet.
Open Chat bots for an event
- Open the Chapter Dashboard.
- Open Events, then open the event you want the bot to join.
- Across the top of the event (with tabs such as Overview, Details, and Registrations), select Chat bots.
Chat bots sits between Recordings and Tracking. Scroll the tab row if you do not see it at first.
URL pattern (for bookmarks):
/dashboard/<chapter-slug>/events/<event-id>/chat_botsIf you do not have permission, Bevy shows: You do not have permission to manage chat bots for this event.
Create a bot
- On the Chat bots page, select New bot.
- In the New bot dialog, enter a Name (up to 60 characters). Use a clear name your team recognizes, such as
Trivia graphicsorEvent chat summariser. - Choose which chat channels the bot can join.
- On a simple virtual event with one chat channel, Bevy shows that channel automatically (for example Weekly Team Meeting) and you only set the Role.
- On a conference, select each channel you need (for example Main stage, a session, or a room) and set a Role per channel.
- For each selected channel, set Role:
- Member - the bot can read and send messages like a normal chat member
- Moderator - the bot has moderator capabilities on that channel
- Select Save.
What success looks like: the bot appears in the Chat bots list with its name and channel count (for example 1 channel).
Notes:
- Bot names must be unique on that event.
- Breakout-room chats are not listed for grants. Set the bot up for Main stage, sessions, rooms, or stages that appear in the picker before the event.
- If you later edit a bot and some of its old channels no longer exist (for example after an agenda rebuild), Bevy warns that saving removes those grants.
Generate a token
Creating the bot does not hand out credentials yet. After the bot is saved:
- Find the bot in the list.
- Select Generate token.
- In the Token for <bot name> dialog, copy the credentials before you close the dialog.
The dialog includes:
| Field | What it is |
|---|---|
| Token (blue text at the top) | One-time JWT for this bot. Use Copy token if you only need the token. |
| API key | Public Stream API key for your Bevy community. |
| Bot user id | Stream user id for this bot (for example bevyhq-bot-1101-event-chat-summariser). |
| Channel type | Always boe for Bevy event chat. |
| Channels | Comma-separated channel ids the bot is granted on. |
| Expiry line | When this token stops working (for example Expires Dec 13, 2026 - 5:16 PM (GMT+2)). |
Copy this token now. You see it only once. A new token does not revoke this one.
Copy all details (recommended)
Select Copy all details to copy a ready-to-paste block in this shape:
api_key=YOUR_API_KEY
user_id=YOUR_BOT_USER_ID
channel_type=boe
channel_ids=CHANNEL_ID_1,CHANNEL_ID_2
token=YOUR_JWTPaste that block into your bot app, secrets manager, or vendor config. Prefer Copy all details over Copy token alone. A token without the API key, bot user id, channel type, and channel ids cannot connect.
Then select Close.
What success looks like: you have the paste block stored somewhere secure, and the bot still appears in the Chat bots list.
Connect your own chat bot app
Bevy event chat uses Stream Chat. Your app connects as the bot user with the credentials from Copy all details.
This section is for developers building or configuring a chat integration (listen, post, or both). It is not for Daily call / companion transcription.
What your app needs
| Credential | Source in Bevy |
|---|---|
| Stream API key | API key |
| Bot user id | Bot user id |
| JWT | Token |
| Channel type | Channel type (boe) |
| Channel ids | Channels |
Connect and watch chat (JavaScript example)
Use the Stream Chat client library your stack supports. Example with the official JavaScript SDK:
import { StreamChat } from 'stream-chat';
const apiKey = process.env.STREAM_API_KEY; // from api_key=
const userId = process.env.BOT_USER_ID; // from user_id=
const token = process.env.BOT_TOKEN; // from token=
const channelType = 'boe'; // from channel_type=
const channelIds = process.env.CHANNEL_IDS.split(','); // from channel_ids=
const client = new StreamChat(apiKey, { allowServerSideConnect: true });
// Connect as the bot. Send only { id }. Bevy already owns the bot display name.
await client.connectUser({ id: userId }, token);
// Prefer watching membership, then fall back to the pasted channel ids.
const membershipChannels = await client.queryChannels(
{ type: channelType, members: { $in: [userId] } },
{ last_message_at: -1 },
{ watch: false, state: true, limit: 30 }
);
for (const channel of membershipChannels) {
await channel.watch();
channel.on('message.new', (event) => {
// Handle a new chat message (listen-only bots stop here)
console.log(event.message?.text);
});
}
for (const channelId of channelIds) {
const channel = client.channel(channelType, channelId);
await channel.watch();
}Tips:
- Channel type must stay
boe. - Do not invent a bot display name in
connectUser. Bevy sets the profile when you create the bot. - Server-side connections need
allowServerSideConnect: true(or the equivalent in your SDK). - Store the JWT like a secret. Anyone with the paste block can act as that bot until the token expires or you delete the bot.
Optional: post a message as the bot
If the bot role is Member or Moderator on a channel, your app can send messages:
const channel = client.channel('boe', channelIds[0]);
await channel.watch();
await channel.sendMessage({
text: 'Hello from the event bot.',
});Listen-only partners can skip send and only handle message.new (and related) events.
Token lifetime
- Bevy mints the JWT when you select Generate token.
- Tokens usually last until about one day after the event end date, and never longer than 90 days from mint time.
- If the event has already ended, a new token still gets a short usable window so you can finish post-event chat work.
- Generating a new token does not revoke older tokens. Treat old paste blocks as live until they expire, or delete the bot to revoke access.
- When Connect fails with an expired token, generate a new token on Chat bots, copy the details again, and update your app.
Edit a bot
- On Chat bots, select Edit for the bot.
- Change the Name, channel selection, or Role values.
- Select Save.
Editing channels updates Stream membership. If you change grants after a vendor already connected, they may need to reconnect and watch the updated channel list. Generate a new token if you need a fresh credential package with the updated Channels list.
Delete a bot
- On Chat bots, select Delete.
- Confirm Delete bot in the dialog.
Deleting a bot revokes its chat tokens and removes it from granted channels. If delete fails partway, wait a moment and try again. The product may tell you whether tokens are still live or the bot is still attached to a channel.
Troubleshooting
| What you see | What to try |
|---|---|
| No Chat bots tab | Confirm the feature is on for your community with Bevy Support / CSM. |
| You do not have permission to manage chat bots for this event. | Ask an HQ or chapter admin who can edit the event to grant you access, or have them create the bot. |
| This event has no chat channels to grant. A bot saved now holds none. | The event has no grantable chat yet. Finish virtual venue / agenda setup, then reopen Chat bots. |
| Bot connects but sees no messages | Confirm the channel is selected on the bot, the token’s Channels list matches, and channel_type is boe. |
| Token / Connect errors after the event ends | Select Generate token again, use Copy all details, and replace the old JWT in your app. |
| Vendor still has access after you intended to cut them off | Delete the bot (revokes tokens). Generating a new token alone does not revoke the previous one. |