Skip to content

VoltKit RTC

Free account required

In-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-limited until 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/client
import { 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");

Features

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.

Chat limits from the chat docs
LimitValue
Text per message4096 bytes
Metadata per message4 KB
Encoded data refused as a filea run of 512 bytes or more without spaces
Messages per user, across their devices20 a second, with a burst of 60
Messages per channel, everyone together1,000 a second, with a burst of 2,000
Daily allowance per project20,000 messages a day, plus 200 per participant-minute of live usage that day
History per channel500 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.

In-app chat list prices of other vendors, in US dollars. List prices as published on 2026-10-24, each at the URL beside it.
VendorProduct lineList price (US$)UnitNoteSource, read 2026-10-24
ZEGOCLOUDIn-app Chat$99per 10,000 MAUPriced 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 MAUtrtc.ioread 2026-10-24
Tencent RTC (TRTC)Chat MAU, pay-as-you-go$0.05per user per monthtrtc.ioread 2026-10-24
StreamChat Build plan$0per month: 1,000 MAU and 100 concurrent connectionsgetstream.ioread 2026-10-24
StreamChat Start plan$399per month billed annually ($499 billed monthly): 10,000 MAU and 500 concurrent connectionsgetstream.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)

    $ npm install @voltkit-rtc/client
    JavaScript SDK guide
  • React (browser)

    $ npm install @voltkit-rtc/react @voltkit-rtc/client
    React SDK guide
  • Node.js (server)

    $ npm install @voltkit-rtc/server
    Node.js SDK guide
  • Python (server)

    $ pip install voltkit-rtc-server
    Python SDK guide
  • Go (server)

    $ go get github.com/voltkit-rtc/voltkit-rtc-server-go
    Go SDK guide
  • PHP (server)

    $ composer require voltkit/rtc-server
    PHP SDK guide
  • Java (server, Spring Boot)

    implementation("in.voltkit:voltkit-rtc-server:0.1.0")
    Java SDK guide
  • Flutter (iOS and Android apps)

    $ flutter pub add voltkit_rtc
    Flutter SDK guide
  • Android (Kotlin apps)

    implementation("in.voltkit:voltkit-rtc:0.9.10")
    Android SDK guide
  • 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

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