VoltKit RTC
Free account requiredIn-app chat for live apps, included with VoltKit RTC
Chat is counted in your usage and not charged; people who only read along connect to chat without being metered as participants. Every room has a chat channel the moment it exists, on the connection people already hold, so a host needs no second client.
It carries the conversation of a live room: text, emoji, stickers and gift events, with direct messages, typing, history and moderation.
Your first project starts with 2,500 free participant-minutes, once per account, and every room comes with its chat.
- Included with RTC
- Chat-only connections
- Moderation over the socket and REST
- chat.message webhook
What it is for
Text, emoji, stickers and gift events, beside a live room
Chat is included with your live usage. It carries the conversation beside a room. It is not a messaging service, a file transfer or a place to store data, and a few rules keep it that way.
- Files are refusedA message whose text or metadata holds a long run of base64, hex or similar characters with no spaces (512 bytes or more), or that is mostly made of such runs, is refused. Emoji-heavy text, links, lists of ids and the JSON of a gift all pass; a base64 image chunk, a hex dump or a file cut into pieces does not.
- A daily allowance that grows with live usageYour project may send 20,000 messages a day (UTC), plus 200 more for every participant-minute of live rooms it used that day: a show with 100 people watching for an hour earns 1,200,000. Past the allowance, sending answers
rate-limiteduntil the next day or more live minutes. - Emoji storms are fineThe rates only stop machines flooding a room: 20 messages a second per user across their devices and 1,000 a second per channel. If your app needs more, write to us: the allowance can be raised for a project.
The rules in full: what chat is for.
Two ways in
In the room, or reading along
A channel shares its name with the room of the same name, so the people in a room and the people who only read along are in one conversation.
People in a room
- Already have chat: it runs over the connection they hold for video and voice
- No second connection and no second token
- The same methods and events as a chat client, on the room client
People who only read along
- Get a chat token from your backend (POST /v1/chat/{channel}/tokens) and open a chat-only connection
- It carries messages and nothing else, and is not metered as a participant
- A chat token cannot join a room, so admitting someone to chat never admits them to video
Rooms and roles: Rooms. Every request and realtime method: API reference.
Code
A chat client in the browser and in Flutter, and your backend
Render message text as text, never as HTML: it is delivered exactly as it was sent.
$ npm install @voltkit-rtc/clientimport { ChatClient } from "@voltkit-rtc/client";
const chat = new ChatClient(wsUrl, token);
chat.on("message", (m) => appendToList(m)); // includes your own
chat.on("messageDeleted", ({ id }) => removeFromList(id));
chat.on("chatMuted", ({ identity, muted }) => lockComposer(identity, muted));
chat.on("typing", ({ identity, typing }) => showTyping(identity, typing));
const { messages, members } = await chat.connect(); // recent history comes with the join
renderAll(messages);
await chat.sendMessage("hello");$ flutter pub add voltkit_rtcfinal chat = ChatClient(wsUrl: wsUrl, token: token); // from POST /v1/chat/{channel}/tokens
chat.onMessage.listen(addMessage);
chat.onReconnected.listen((_) async => addMessages(await chat.getMessages(limit: 50))); // fill the gap
chat.onClosed.listen(handleClosed);
final joined = await chat.connect(); // joined.messages: recent history
await chat.sendMessage('first!');$ npm install @voltkit-rtc/server// Admit someone to a channel's chat with no media rights (role defaults to viewer).
const chat = await rtc.createChatToken({ channel: "show-42", identity: "user-99" });
// -> { token, wsUrl, role, identity, channel, expiresAt }
// Take part without holding a connection.
await rtc.sendMessage({ channel: "show-42", text: "The show starts in 5 minutes", type: "system" });
await rtc.sendMessage({ channel: "show-42", type: "gift", from: "user-7", metadata: { gift: "rose", count: 5 } });
await rtc.sendMessage({ channel: "show-42", type: "reaction", metadata: { emoji: "heart" }, ephemeral: true }); // not stored
await rtc.muteChat("show-42", "user-13"); // survives reconnecting; they can still readFeatures
What the chat does
Everything below works inside a room and on a chat-only connection alike.
- Recent history on joinA chat-only connection receives the most recent 50 messages when it joins; page further back with getMessages and the oldest id you hold.
- Direct messagesA message with to reaches its recipient and the sender's own devices, and is absent from everyone else's history.
- Typed messagestext unless you say otherwise; gift, reaction, system or any short lowercase name, with up to 4 KB of your own metadata.
- Ephemeral reactionsAn ephemeral message is delivered and then forgotten: hearts worth showing, not worth replaying to everyone who joins later.
- Typing indicatorsSafe to call on every keystroke: the service limits it to one notice a second.
- ModerationHosts and moderators mute someone in the chat or delete any message; anyone deletes their own. A mute is held for the channel.
- From your backendPost a system notice or a gift event, read history and moderate over REST, without holding a connection.
- Keep what mattersHistory is live, not an archive: take messages with the opt-in chat.message webhook to keep them.
- Member countsThe member count covers everyone connected to the channel, in the room or only in its chat.
Webhook events and signatures: Webhooks.
Limits
The allowance and the rates, as the docs state them
Past a rate, the direct-message cap or the daily allowance, sending answers rate-limited; the error says which limit and when to try again (retryAfterMs), and over REST it is a 429 with a Retry-After header.
| Limit | Value |
|---|---|
| Text per message | 4096 bytes |
| Metadata per message | 4 KB |
| Encoded data refused as a file | a run of 512 bytes or more without spaces |
| Messages per user, across their devices | 20 a second, with a burst of 60 |
| Messages per channel, everyone together | 1,000 a second, with a burst of 2,000 |
| Daily allowance per project | 20,000 messages a day, plus 200 per participant-minute of live usage that day |
| History per channel | 500 messages |
Your backend's own posts over REST skip the per-user rate and the direct-message cap, since your backend is the authority on your users; they count toward the channel rate, the per-minute limit and the daily allowance. History keeps the most recent 500 messages per channel and is cleared when the room closes, or after 24 hours of silence for a channel with no room.
Cost
Counted in your usage, not charged
Chat does not use your hours or your wallet. What it draws on is the daily allowance, which your live minutes grow.
GET /v1/usage shows where you stand today in its chat object: messagesToday, earnedToday, allowanceToday, remainingToday and allowanceReached. Live rooms are billed per participant-minute for the media each person uses; the rates are on the pricing page.
Other vendors
Elsewhere, chat is often priced by monthly active users
Chat list prices from other vendors, in US dollars as they publish them. VoltKit RTC has no MAU tier: chat is included with live usage, within the allowance above.
| Vendor | Product line | List price (US$) | Unit | Note | Source, read 2026-10-24 |
|---|---|---|---|---|---|
| ZEGOCLOUD | In-app Chat | $99 | per 10,000 MAU | Priced separately from calling. | zegocloud.comread 2026-10-24 |
| Tencent RTC (TRTC) | Chat plan | $0Published as Chat from $0 (1,000 MAU) | per month for 1,000 MAU | trtc.ioread 2026-10-24 | |
| Tencent RTC (TRTC) | Chat MAU, pay-as-you-go | $0.05 | per user per month | trtc.ioread 2026-10-24 | |
| Stream | Chat Build plan | $0 | per month: 1,000 MAU and 100 concurrent connections | getstream.ioread 2026-10-24 | |
| Stream | Chat Start plan | $399 | per month billed annually ($499 billed monthly): 10,000 MAU and 500 concurrent connections | getstream.ioread 2026-10-24 |
List prices as published on 2026-10-24, each at the URL beside it.
ZEGOCLOUD's calling and chat prices beside VoltKit's: ZEGOCLOUD alternative.
Gifts
Gift events travel over chat
A gift or a sticker has no text and is still a message. Your server validates the gift and debits your own coins, then posts the event with its metadata, and every app plays the artwork; a message sent from your backend can be trusted in a way a client-sent one cannot.
The artwork comes from VoltKit's gift store, under a licence for your own app: gifts for RTC apps. The SDKs have no gift-sending API or gift player; coins and payouts are your app's.
SDKs
Chat is in every SDK
The same chat methods and events on the room client and on a chat-only client.
JavaScript (browser)
JavaScript SDK guide$ npm install @voltkit-rtc/clientReact (browser)
React SDK guide$ npm install @voltkit-rtc/react @voltkit-rtc/clientNode.js (server)
Node.js SDK guide$ npm install @voltkit-rtc/serverPython (server)
Python SDK guide$ pip install voltkit-rtc-serverGo (server)
Go SDK guide$ go get github.com/voltkit-rtc/voltkit-rtc-server-goPHP (server)
PHP SDK guide$ composer require voltkit/rtc-serverJava (server, Spring Boot)
Java SDK guideimplementation("in.voltkit:voltkit-rtc-server:0.1.0")Flutter (iOS and Android apps)
Flutter SDK guide$ flutter pub add voltkit_rtcAndroid (Kotlin apps)
Android SDK guideimplementation("in.voltkit:voltkit-rtc:0.9.10")Native iOS (Swift)
In preview, not released yet. The Flutter SDK covers iOS apps today; for early access, email contact@voltkit.in.
iOS preview notes
More
Related
- Gift events over chatPlan the gift flow: validate on your server, post the event, play the artwork in every app.Read the gifts guide
- Voice chat roomsAudio rooms with a stage, seats and raise hand, and the chat beside them.Voice rooms
- Dating and friendship apps1:1 calls in a room per match, with chat, moderation and call records.Calls for dating apps
In-app chat: questions
Is chat free with VoltKit RTC?
Chat is included: it is counted in your usage and not charged, and it does not use your hours or your wallet. People who only read along connect to chat without being metered as participants. Sending draws on a daily allowance that grows with your live minutes.
Is there an MAU limit?
There is no MAU tier. The limits are flood guards per user and per channel that no person reaches, and the project's daily allowance, all listed in the chat docs.
Can people chat without joining the video?
Yes. Your backend mints a chat token, and the app opens a chat-only connection that carries messages and nothing else and is not metered as a participant. A chat token cannot join a room, and a room token cannot open a chat-only connection.
Does the chat support DMs, reactions, typing, history and moderation?
Yes. A message with to is a direct message; typed messages carry your own metadata, and ephemeral ones such as reactions are delivered and not stored; typing notices are limited to one a second; history pages backwards; hosts and moderators delete messages and mute people in the chat.
How long is history kept?
Each channel keeps its most recent 500 messages. History is cleared when the channel's room closes, or after 24 hours of silence for a channel with no room. To keep messages, take them with the chat.message webhook.
Can my backend post and moderate?
Yes, over REST without holding a connection: post a system notice or a gift event, read history, and mute or delete. Your backend's posts skip the per-user rate and the direct-message cap, and count toward the channel rate, the per-minute limit and the daily allowance.
Can I send gift events over chat?
Yes. A gift is a typed message with your metadata and no text; your server validates it and debits your own coins first, and your app plays the artwork. VoltKit's gift store sells artwork, and the SDKs have no gift-sending API.
What happens past the daily allowance?
Sending answers rate-limited, with the limit daily-allowance and retryAfterMs, until the next day (UTC) or until more live minutes raise the allowance. The allowance and the caps can be raised for a project on request.
Add chat to your live app
Create a free account and an RTC project: every room you make has its chat channel from the start.
Talk to us:contact@voltkit.inWhatsApp