Channels
A channel is a room in the chat space. It is open (any member can read and post) or private (only the members added to it). A DM is a private channel between a few members.
There are two ways a channel comes to exist, and they are signed by different keys:
| Kind | Created by | Signed by | Tracked by the platform |
|---|---|---|---|
| Org channel | A person in your organization, from the console or the API | The space owner key, which owns the channel | Yes. It appears in data.buzz.channel.list |
| Member channel | An end user on the chat page | That person's own chat key, so they own the channel | Only when the platform recorded it. The relay decides what the person may do |
Org channels
| Want | Workflow | Inputs |
|---|---|---|
| Create | buzz.channel.create | space_uuid, name, visibility (open or private), channel_type (stream or forum), about, member_uuids, app_organization_uuid (only for channel_scope: workspace spaces) |
| Add or remove a member | buzz.channel.set-member | space_uuid, channel_id, member_uuid, present (default true), role (member, admin, guest; actors always join as bot) |
| Archive or unarchive | buzz.channel.archive | space_uuid, channel_id, archived (default true) |
| List | data.buzz.channel.list | space_uuid or identity_app_uuid, include_archived |
| One member's channels | data.buzz.member.channels | space_uuid, member_uuid |
start_workflow("buzz.channel.create", {
"space_uuid": "<space uuid>",
"name": "support",
"visibility": "open",
"about": "Questions about your orders"
})
data.buzz.channel.list is also what the chat page reads for an end user: the channels of their app, open channels, in their workspace. It returns the relay URL and the relay public key the page verifies channel metadata with.
data.buzz.member.channels reads the relay's own signed member lists. It never lists DMs, and it cannot see a private channel the owner key is not in, such as one a member created on the chat page.
Adding an actor to a channel with buzz.channel.set-member makes it a listener there: it answers mentions and DMs in that channel. To make it answer every message of a channel, list the channel in its triggers. See Actors in chat.
Channels your members run
When the space allows it, end users manage channels themselves from the chat page. Each action is an entry point on your identity app that wraps one workflow, and each is signed with the person's own chat key.
| Action on the chat page | Workflow | Theme flag (default) |
|---|---|---|
| Create a channel | buzz.channel.create-as-member: name, visibility, channel_type, about, member_uuids (up to 20) | member_channel_create (off) |
| Rename, describe, set the topic, archive | buzz.channel.update-as-member: channel_id, name, about, topic, archived | member_channel_create (off) |
| Add or remove someone | buzz.channel.invite-member: channel_id, member_uuid, role (member or guest), present | member_channel_create (off) |
| Join an open channel | buzz.channel.join: channel_id | member_channel_join (on) |
| Leave | buzz.channel.leave: channel_id | member_channel_join (on) |
To let members create channels, set features.member_channel_create to true in the theme and publish it. See Theme and customization.
The relay applies its own channel rules, and a refusal comes back as channel_command_refused: <relay code>:
- only a channel's owner and admins can rename it, describe it or archive it; any member can set the topic;
- private channels cannot be joined, only added to;
- the last owner cannot leave.
On top of that, the platform refuses a member who tries to give someone an elevated channel role.
Private channels
A private channel starts with its members. An organization creates one with buzz.channel.create, visibility: "private" and member_uuids. A member creates one on the chat page and picks the people to add; that runs buzz.channel.create-as-member with the same two inputs. After that, people are added with buzz.channel.set-member (organization) or the invite action (member).
media.allow_in_private_channels to false in the theme. See Limits.Relay owners and admins are not automatically members of a private channel. If your organization needs to read one, add a member to it rather than expecting admin access.
Ask your AI assistant
List the channels of my chat space with data.buzz.channel.list, including archived ones.
Create an open channel called "announcements" in my chat space. Show me the buzz.channel.create inputs and wait for my confirmation.
Which channels is the member "<name>" in? Use data.buzz.member.list to find them, then data.buzz.member.channels.
Let my end users create their own channels: update the theme so member_channel_create is true, save it as a draft and publish after I confirm.
For AI agents
| Rule | Detail |
|---|---|
| Channel ids | Take channel_id from data.buzz.channel.list. Channel ids are uuids |
| Org vs member verbs | buzz.channel.create, set-member and archive are for people in the organization. The *-as-member, join, leave and invite-member verbs are end-user entry points; an organization caller cannot use them on someone's behalf |
| Relay decides | A channel_command_refused is the relay's permission rule. Do not retry with other inputs; explain it |
| Flags are not walls | Turning member_channel_create off stops the platform path, not a member using their own relay client |
Members and moderation
Invite people into a chat space, set roles and display names, and moderate with suspend, timeout, ban, remove, key rotation and reconcile
Using the chat
What people get on the hosted chat page. DMs, threads, mentions, reactions, edit and delete, history, search, pinned messages, unread counts, attachments, missed-message email and the mobile layout
