Message broadcast

Last updated Oct 19, 2026 The broadcast APIs allow a user to send custom messages to all other users in a meeting.

WebMobile

ReactWeb ComponentsAngular

Broadcasting a Message

The Participants module on the meeting object allows you to broadcast messages to all other users in a meeting (or to other meetings in case of connected meetings) over the signaling channel.

Param Type Description Required
type Exclude<string, 'spotlight'> Message type identifier used to distinguish different kinds of broadcasts. Yes
payload BroadcastMessagePayload Data sent with the message. Keys map to boolean, number, string, Date, or ActiveTab. Yes
target BroadcastMessageTarget Optional target filter for which participants or meetings receive the message. No
  • If target is omitted, the message is broadcast to all participants in the current meeting, including the local participant.
  • If target.participantIds is provided, the message is sent only to those participants in the current meeting.
  • If target.presetNames is provided, the message is sent to all participants whose preset name is in the list.
  • If target.meetingIds is provided, the message is broadcast to all specified meetings (multi‑meeting broadcast).
const participants = useRealtimeKitSelector((m) => m.participants);
participants.broadcastMessage(
  type: Exclude<string, 'spotlight'>,
  payload: BroadcastMessagePayload,
  target?: BroadcastMessageTarget,
): Promise<void>
type BroadcastMessagePayload = {
    [key: string]: boolean | number | string | Date | ActiveTab;
};

type BroadcastMessageTarget =
    | { participantIds: string[] }
    | { presetNames: string[] }
    | { meetingIds: string[] };
Param Type Description Required
type Exclude<string, 'spotlight'> Message type identifier used to distinguish different kinds of broadcasts. Yes
payload BroadcastMessagePayload Data sent with the message. Keys map to boolean, number, string, Date, or ActiveTab. Yes
target BroadcastMessageTarget Optional target filter for which participants or meetings receive the message. No
  • If target is omitted, the message is broadcast to all participants in the current meeting, including the local participant.
  • If target.participantIds is provided, the message is sent only to those participants in the current meeting.
  • If target.presetNames is provided, the message is sent to all participants whose preset name is in the list.
  • If target.meetingIds is provided, the message is broadcast to all specified meetings (multi‑meeting broadcast).
meeting.participants.broadcastMessage(
  type: Exclude<string, 'spotlight'>,
  payload: BroadcastMessagePayload,
  target?: BroadcastMessageTarget,
): Promise<void>
type BroadcastMessagePayload = {
    [key: string]: boolean | number | string | Date | ActiveTab;
};

type BroadcastMessageTarget =
    | { participantIds: string[] }
    | { presetNames: string[] }
    | { meetingIds: string[] };
Param Type Description Required
type Exclude<string, 'spotlight'> Message type identifier used to distinguish different kinds of broadcasts. Yes
payload BroadcastMessagePayload Data sent with the message. Keys map to boolean, number, string, Date, or ActiveTab. Yes
target BroadcastMessageTarget Optional target filter for which participants or meetings receive the message. No
  • If target is omitted, the message is broadcast to all participants in the current meeting, including the local participant.
  • If target.participantIds is provided, the message is sent only to those participants in the current meeting.
  • If target.presetNames is provided, the message is sent to all participants whose preset name is in the list.
  • If target.meetingIds is provided, the message is broadcast to all specified meetings (multi‑meeting broadcast).
meeting.participants.broadcastMessage(
  type: Exclude<string, 'spotlight'>,
  payload: BroadcastMessagePayload,
  target?: BroadcastMessageTarget,
): Promise<void>
type BroadcastMessagePayload = {
    [key: string]: boolean | number | string | Date | ActiveTab;
};

type BroadcastMessageTarget =
    | { participantIds: string[] }
    | { presetNames: string[] }
    | { meetingIds: string[] };

Subscribe to Messages

Use the broadcastedMessage event to listen for messages sent via broadcastMessage and handle them in your application.

const participants = useRealtimeKitSelector((m) => m.participants);
participants.on("broadcastedMessage", ({ type, payload, timestamp }) => {
    // handle message
});
meeting.participants.on(
    "broadcastedMessage",
    ({ type, payload, timestamp }) => {
        // handle message
    },
);
meeting.participants.on(
    "broadcastedMessage",
    ({ type, payload, timestamp }) => {
        // handle message
    },
);

Rate Limiting & Constraints

  • The method is rate‑limited (server‑side + client‑side) to prevent abuse.
  • Default client‑side config in the deprecated module: maxInvocations = 5 per period = 1s.
  • The Participants module exposes a rateLimitConfig and updateRateLimits(maxInvocations, period) for tuning on the client, but server‑side limits may still apply.
  • The event type cannot be spotlight. This is reserved for internal use by the SDK.

Examples

Broadcast to everyone in the meeting

const participants = useRealtimeKitSelector((m) => m.participants);
await participants.broadcastMessage("HAND_RAISE", {
    raised: true,
    userId: meeting.self.userId,
    sentAt: new Date(),
});

participants.on(
"broadcastedMessage",
({ type, payload, timestamp }) => {
if (type === "HAND_RAISE") {
// payload.raised, payload.userId, payload.sentAt
}
},
);
await meeting.participants.broadcastMessage("HAND_RAISE", {
    raised: true,
    userId: meeting.self.userId,
    sentAt: new Date(),
});

meeting.participants.on(
"broadcastedMessage",
({ type, payload, timestamp }) => {
if (type === "HAND_RAISE") {
// payload.raised, payload.userId, payload.sentAt
}
},
);
await meeting.participants.broadcastMessage("HAND_RAISE", {
    raised: true,
    userId: meeting.self.userId,
    sentAt: new Date(),
});

meeting.participants.on(
"broadcastedMessage",
({ type, payload, timestamp }) => {
if (type === "HAND_RAISE") {
// payload.raised, payload.userId, payload.sentAt
}
},
);

Broadcast to a specific set of participants.

Only the participants with those participantIds receive the message.

const participants = useRealtimeKitSelector((m) => m.participants);
await participants.broadcastMessage(
    "PRIVATE_NOTE",
    { message: "You are on stage in 30 seconds" },
    {
        participantIds: ["peer-id-1", "peer-id-2"],
    },
);
await meeting.participants.broadcastMessage(
    "PRIVATE_NOTE",
    { message: "You are on stage in 30 seconds" },
    {
        participantIds: ["peer-id-1", "peer-id-2"],
    },
);
await meeting.participants.broadcastMessage(
    "PRIVATE_NOTE",
    { message: "You are on stage in 30 seconds" },
    {
        participantIds: ["peer-id-1", "peer-id-2"],
    },
);

Broadcast to a preset

All participants whose preset name is speaker receive the message.

const participants = useRealtimeKitSelector((m) => m.participants);
await participants.broadcastMessage(
    "STAGE_INSTRUCTION",
    { text: "Prepare for Q&A" },
    {
        presetNames: ["speaker"],
    },
);
await meeting.participants.broadcastMessage(
    "STAGE_INSTRUCTION",
    { text: "Prepare for Q&A" },
    {
        presetNames: ["speaker"],
    },
);
await meeting.participants.broadcastMessage(
    "STAGE_INSTRUCTION",
    { text: "Prepare for Q&A" },
    {
        presetNames: ["speaker"],
    },
);

Broadcast across multiple meetings

All participants in the specified meetings receive the message.

const participants = useRealtimeKitSelector((m) => m.participants);
await participants.broadcastMessage(
    "GLOBAL_ANNOUNCEMENT",
    { text: "The event will end in 5 minutes." },
    {
        meetingIds: ["meeting-1", "meeting-2"],
    },
);
await meeting.participants.broadcastMessage(
    "GLOBAL_ANNOUNCEMENT",
    { text: "The event will end in 5 minutes." },
    {
        meetingIds: ["meeting-1", "meeting-2"],
    },
);
await meeting.participants.broadcastMessage(
    "GLOBAL_ANNOUNCEMENT",
    { text: "The event will end in 5 minutes." },
    {
        meetingIds: ["meeting-1", "meeting-2"],
    },
);

Was this helpful?

YesNo

On this page

Message broadcast - 图1Docs

{"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/realtime/realtimekit/collaboration/message-broadcast/#page","headline":"Message broadcast","description":"Send custom broadcast messages to all participants in a RealtimeKit meeting.","url":"https://developers.cloudflare.com/realtime/realtimekit/collaboration/message-broadcast/","inLanguage":"en","image":"https://developers.cloudflare.com/realtime/realtimekit/collaboration/message-broadcast/og.png?v=f55262cc4bd037d0","dateModified":"2026-10-19","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}


description: Core concepts and terminology for RealtimeKit including apps, meetings, participants, and presets. title: Concepts image: https://developers.cloudflare.com/realtime/realtimekit/concepts/og.png?v=597dcee3ad916a41


Skip to content

Documentation Index
Fetch the complete documentation index at: https://developers.cloudflare.com/realtime/llms.txt
Use this file to discover all available pages before exploring further.