Live rooms

Embed
Preview of the card
<a href="https://forumulate.com/guides/live-rooms"><img src="https://forumulate.com/guides/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/36aa4df0-1e95-4cef-8ae9-795169441345/pages/25c633b5-e8be-43b7-b122-5a0543a5a102/social-card.svg?v=3e7ae33eec8b" alt="Live rooms" width="600" height="315"></a>

Forumulate has two places where people meet live:

  • An event's live room — on the event page of an Events space, for the people who are going: chat, emoji reactions, and stage, breakout and backstage rooms.

  • Forum rooms — scheduled voice, video and stage rooms in a Community space, which members join in the browser.

Both use one media setup per organization: a TURN relay for small rooms that connect browser to browser, and a LiveKit server for rooms bigger than that. What you configure, and what Forumulate provides, is in What you need to set up.

The event live room

An event's live room is off until the event turns its parts on. live on the event (POST …/events, PATCH …/events/{id}; in the event form under Live, insights and cover → Live room) holds five switches, each off by default:

Part

What it adds

chat

A chat for the event.

reactions

Emoji reactions: clap, heart, laugh, wow, fire, thumbs.

directory

The attendee directory, with each person's card.

networking

1:1 meeting requests between attendees.

gamification

Points and a leaderboard.

The Rooms tab is always there once the event has rooms. The page draws the room as a panel with a tab per part (Chat, Rooms, People, Meetings, Points); page.sections places it (liveRoom) among the parts under the description.

Who gets in. Everything inside is for people who are going (or checked in) and for the event's hosts. Anybody else is shown "The live room is for people who are going — RSVP to join in", and the API answers 403. A part the event did not switch on answers 404, so nothing a reader can post appears on a page whose owner never chose to show it.

curl -X PATCH https://forumulate.com/api/orgs/$ORG/spaces/$SPACE/events/$EVENT \
  -H "Authorization: Bearer $FORUMULATE_TOKEN" -H "Content-Type: application/json" \
  -d '{ "live": { "chat": true, "reactions": true } }'

Chat

A message is up to 2,000 characters. One person can send at most five messages in ten seconds ("Slow down a little"), and thirty a minute. Hosts carry a badge, can pin and unpin messages (pinned ones stay at the top) and remove anyone's; everybody can remove their own. The page shows the last 200 messages and checks for new ones every ten seconds while the tab is visible. With points on, chatting earns its author the space's points.chat, at most once a minute.

Reactions

A press records one reaction (up to sixty a minute per person). While the event is on, the buttons count the last minute's burst; afterwards, the total. GET /public/orgs/{orgId}/spaces/{spaceId}/events/{handle}/reactions answers both, so the recap can show them.

Stage, breakout and backstage rooms

A room is one of three kinds, and opens through one of two providers:

Key

Values (default)

What it does

name

1–100 characters

What the room is called.

kind

stage, breakout, backstage (breakout)

A backstage room is listed to hosts only.

provider

link, livekit (link)

link: any meeting tool's address. livekit: a room on your LiveKit server.

joinUrl

an address

Required for a link room.

capacity

none

Shown with the room.

position

0

The order in the list.

Hosts add rooms in the event form under Stage and breakout rooms, or over the API:

curl -X POST https://forumulate.com/api/orgs/$ORG/spaces/$SPACE/events/$EVENT/rooms \
  -H "Authorization: Bearer $FORUMULATE_TOKEN" -H "Content-Type: application/json" \
  -d '{ "name": "Main stage", "kind": "stage", "provider": "livekit" }'

A link room's address is handed only to people who may join. Joining a livekit room (POST …/events/{handle}/rooms/{roomId}/join) mints that person a short-lived LiveKit access token for that room and opens it in a new tab. On a stage only hosts may speak and share; in a breakout everybody may. The media flows through your LiveKit server, never through Forumulate.

The event live room's calls

All under /orgs/{orgId}/spaces/{spaceId}/events/{handle}:

Call

Who

What it does

GET …/chat?after=

going, hosts

Messages since a point.

POST …/chat

going, hosts

Send { "body": "…" }.

PUT …/chat/{messageId}/pin (or unpin)

hosts

Pin a message.

DELETE …/chat/{messageId}

the author, hosts

Remove a message.

POST …/reactions

signed in

{ "emoji": "clap" }.

GET …/rooms

anyone who can read

The rooms; join addresses only for those who may join.

POST, PUT …/rooms/{roomId}, DELETE

hosts

Manage rooms.

POST …/rooms/{roomId}/join

going, hosts

A link, or a LiveKit address and token.

The directory, meetings and points are described in Events spaces → The network.

Forum rooms

A Community space can hold scheduled live rooms. Turn them on with the behaviour key liveRooms (Live audio and video rooms under Behaviour, off by default), and schedule them in the studio under Live rooms, or with forum.moderate:

curl -X POST https://forumulate.com/api/orgs/$ORG/spaces/$SPACE/live-rooms \
  -H "Authorization: Bearer $FORUMULATE_TOKEN" -H "Content-Type: application/json" \
  -d '{ "title": "Office hours", "kind": "voice", "startsAt": "2026-11-05T17:00:00Z", "capacity": 12 }'

Key

Default

What it does

title

required

Up to 200 characters.

description

""

Up to 2,000 characters.

kind

required

voice, video or stage.

startsAt, endsAt

endsAt none

When it is scheduled. A room must end after it starts.

capacity

8, or the kind's limit if lower

Capped at the kind's limit (below).

categoryId

none

A room in a restricted category is invisible to readers who cannot see that category.

eventId

none

Ties the room to an event.

speakerIds

[]

On a stage, up to 20 members who join as speakers rather than listeners.

PATCH …/live-rooms/{roomId} changes one, POST …/start and …/end open and close it, and DELETE removes it.

For readers, the rooms are at /f/{orgId}/{spaceId}/rooms: what is live, what is coming, and what ended in the last week, each with how many people are in it. Joining needs a member's sign-in. A scheduled room opens when a host walks in; until then a member is told it has not started. A member takes one seat however many tabs they open, and a full room says so (hosts always get in). On a stage, the host and the named speakers talk and everyone else listens; a listener can raise a hand, and the host brings them up or sends a speaker back. In a voice or video room everybody may speak.

How a forum room carries media

Path

Room sizes

When it is used

Browser to browser (a WebRTC mesh)

12 voices, 8 cameras, or a 40-person stage with up to 6 speakers

A TURN relay is configured and the room fits the mesh.

A LiveKit server (an SFU)

500 voices, 100 cameras, or a 1,000-person stage

A LiveKit server is configured and the room is bigger than the mesh holds, or there is no TURN relay.

In a mesh every speaker sends to every other participant; Forumulate relays only the handshake. A direct connection fails behind most corporate firewalls, so every join is handed a TURN credential minted for that person, which expires on its own; the relay's shared secret never leaves the server. STUN servers, when configured, are offered to the browser alongside the relay; they are never enough on their own, and a room is not shown without a relay or a LiveKit server. A LiveKit join gets an access token valid for ten minutes.

What you need to set up

Both features need a media path before readers see them:

Feature

Works without setup

Needs

Event chat, reactions, directory, meetings, points

Yes

Nothing: switch the parts on.

Event link rooms

Yes

The meeting tool of your choice.

Event livekit rooms

No

A LiveKit server (yours or Forumulate's).

Forum rooms

No

liveRooms on, plus a TURN relay or a LiveKit server (yours or Forumulate's).

Until then, a Community space shows no rooms at all: its rooms page and every room answer 404, and the list reports available: false, so a forum never shows a "Join" that cannot connect. The studio's Live rooms panel says which of the two is missing. Without a LiveKit server, forum rooms are held to the mesh sizes above. An event's livekit room cannot be joined until a LiveKit server is available; link rooms are unaffected.

Your organization's media settings

One setting covers the organization, for forum rooms and event rooms alike. In the studio of a Community space it is Live rooms → Media relay (TURN) and Media server (LiveKit) for large rooms; over the API it is GET/PUT /orgs/{orgId}/live-rooms/media, which needs the org.manage_integrations capability.

curl -X PUT https://forumulate.com/api/orgs/$ORG/live-rooms/media \
  -H "Authorization: Bearer $FORUMULATE_TOKEN" -H "Content-Type: application/json" \
  -d '{ "stunUrls": "stun:turn.example.com:3478",
        "turnUrls": "turn:turn.example.com:3478, turns:turn.example.com:5349",
        "turnSecret": "<coturn static-auth-secret>",
        "sfuUrl": "wss://livekit.example.com",
        "sfuApiKey": "<api key>",
        "sfuApiSecret": "<api secret>" }'

Key

What it is

turnUrls

Your coturn server's addresses, comma-separated, each starting turn: or turns:.

turnSecret

coturn's static-auth-secret (use-auth-secret mode). Write-only.

stunUrls

Optional STUN addresses (stun: or stuns:), offered beside the relay.

sfuUrl

Your LiveKit server, self-hosted or LiveKit Cloud. Must start wss://.

sfuApiKey, sfuApiSecret

The LiveKit API key and secret. The secret is write-only.

A secret sent blank keeps the stored one; clearing an address clears its secret with it. turnUrls that are not turn: or turns: addresses are a 422, and so is an sfuUrl that is not wss://. The read answers turnSecretSet, sfuSecretSet, whether Forumulate's own relay and server are available (platformConfigured, platformSfu), and whether rooms can connect now (ready, sfuReady). Your own relay or server, once set, is used instead of Forumulate's.

On Forumulate's side

Forumulate can provide a TURN relay and a LiveKit server for every organization. Whether it does is shown in the same panel: "The platform's relay is in use" and "The platform's media server is in use". When it does, rooms work with no settings of yours; when it does not, the panel says so and your own server is what makes rooms appear. How long a per-join TURN credential lives (four hours) is also set on Forumulate's side.

In the API

Every operation below is also reachable from the other surfaces without a dedicated command. forumulate api <Operation> calls it from the CLI, the JavaScript SDK has a typed method for each one (the last column names it; the Python and Go clients are generated from the same spec), and an agent reaches the organization-scoped ones through the MCP call_api tool. Where a CLI command or MCP tool exists too, the last column names it. Operation names link to the API reference.

Events Network Public

Operation

Request

What it does

Shortcuts

EventsNetworkPublic_beacon

POST /public/orgs/{orgId}/spaces/{spaceId}/events/{handle}/insights/view

Create the view in a space (events insights)

client.events.publicSNetwork.beacon()

EventsNetworkPublic_reactions

GET /public/orgs/{orgId}/spaces/{spaceId}/events/{handle}/reactions

List reactions in a space (events)

client.events.publicSNetwork.reactions()

EventsNetworkPublic_chapters

GET /public/orgs/{orgId}/event-chapters

List event chapters in an organization

client.events.publicSNetwork.chapters()

EventsNetworkPublic_discover

GET /public/discover/events

List events

client.events.publicSNetwork.discover()

Live Rooms Media

Operation

Request

What it does

Shortcuts

LiveRoomsMedia_get

GET /orgs/{orgId}/live-rooms/media

Get the media in an organization

client.liveRoomsMedia.get()

LiveRoomsMedia_set

PUT /orgs/{orgId}/live-rooms/media

Replace the media in an organization

client.liveRoomsMedia.set()

The Forumulate teamUpdated