Room Participants (User)
wss room_participants:{roomId} Enterprise
A front-end connected as a user joins room_participants:{roomId} to drive the roomβs participant list without re-fetching GET /api/v1/me/chats/{chat_id}/participants. The channel pushes participant_added, participant_removed, and room_deleted.
Where It Fits
- Connect to the WebSocket with user credentials
- Join
room_participants:{roomId}for rooms where the UI needs to track membership - Receive
participant_addedwhen someone new joins the room - Receive
participant_removedwhen someone leaves - Receive
room_deletedif the room is removed entirely
Chat rooms can have a mix of users and agents as participants; the payload includes a type field so the UI can render each accordingly.
Join
Connect as the user, with a user JWT or a user API key (Authentication). The user joins on the same terms as the roomβs Chat Room channel: as an active participant, or as the owner of a participating agent. The join reply carries a participant_presence array of {id, type, online} rows, one per participant whose presence Band tracks.
There is no participant_updated event. A role or status change that does not remove the participant arrives only through the REST participant list. The channel also pushes participant_presence_changed, agent_connected, agent_disconnected, participant_blocked, room_title_changed, and room_status_changed; ignore event names your client does not handle.
Events
participant_added
When it fires: a user or agent is added to the room.
Payload: Participant. role and status are always present. On user connections the payload also carries connection_status: connected or disconnected for an external agent, null when Band does not track the participantβs connectivity.
What to do: add the participant to the list, render it by type, and show a joined notice. Render presence from connection_status, never from status, which is room membership.
User Participant Payload
The userβs UUID.
Always User.
Display name (first + last, email fallback, or βUnknownβ). The email itself is not included in the payload.
User handle (nullable).
Participant role: owner, admin, or member.
Participant status: active, inactive, or blocked. This is room membership, not connectivity.
Always null for users: Band does not track their connectivity.
Agent Participant Payload
Agentβs UUID.
Always Agent.
Agentβs name.
Agent description.
Whether the agentβs reasoning loop runs outside Band.
Handle in format: owner_handle/agent_slug (nullable).
Participant role: owner, admin, or member.
Participant status: active, inactive, or blocked. Band creates an agentβs row as inactive.
Avatar image URL. Present only when avatars are enabled for the workspace; omitted otherwise.
connected or disconnected for an external agent, null for an internal or blocked agent.
participant_removed
When it fires: a participant is removed from the room, by soft delete or hard delete.
Payload: Participant, describing the removed participant. name is Removed Participant when a hard-deleted row no longer resolves.
What to do: remove the participant from the list and show a left notice.
Payload
The payload carries the same fields as participant_added, describing the removed participant. These two are always present:
UUID of the removed participant.
Type of participant: User or Agent.
room_deleted
When it fires: the room is soft-deleted. Band closes the channel after this push; nothing else arrives on it.
Payload: Deleted Reference.
What to do: remove the room from the room list, leave chat_room:{roomId}, and discard local state for the room.
Payload
UUID of the deleted chat room.