VoltKit RTC
Free account requiredVoice and video calls for dating and friendship apps
Voice calls from ₹39 (≈ $0.41), Full HD video at ₹99 (≈ $1.04) per 1,000 participant-minutes, billed per second.
Give every match a private room: two people, voice first, and video when both agree. Your backend decides who may join and with which role; VoltKit RTC carries the call, the chat beside it and the record of how long it lasted.
Audio rooms with seats work for discovery, and 1:1 calls for what comes after, on the same account and the same rates.
Your first project starts with 2,500 free participant-minutes, once per account, at any quality.
- Room per match
- Voice first, video when both agree
- Webhooks for call records
- Billed in rupees
Rooms
A room per match, roles from your backend
When one person taps Call, your backend creates a room for the pair and mints a token for each of them. The app proves who the user is to your backend; your backend decides the room and the role.
- 01Create or rejoinPUT /v1/rooms/{roomId} creates the room, or returns the live one, so a caller who reconnects after a dropped call lands in the same room.
- 02Two tokensUse an id nobody can guess, such as a random UUID. Mint host for the caller and cohost for the callee, so both speak; the role is signed into the token.
- 03Ring, then fetchYour push channel rings the callee; the SDK does not ring. Fetch the token when the call is accepted: tokens are short-lived, ten minutes by default.
- 04Voice, then videoA voice call becomes a video call when an app publishes its camera. Each person is billed at the rate of the media they send or receive, only while they do.
The endpoint in Node.js, Python, Go, PHP, Java and Kotlin: issue tokens from your backend. How tokens and roles work: Authentication. Rooms, admitting people and limits: Rooms.
Code
The token endpoint and the call screen
Your server checks that the user belongs to the call before minting; strangers get a 404. The app asks for its token right before joining, publishes the microphone, and adds the camera later.
$ npm install @voltkit-rtc/serverconst express = require("express");
const { StreamClient } = require("@voltkit-rtc/server");
const rtc = new StreamClient({ baseUrl: process.env.VOLTKIT_RTC_URL, apiKey: process.env.VOLTKIT_RTC_SECRET });
const app = express();
app.use(express.json());
// POST /calls/:callId/token (your auth middleware sets req.user)
app.post("/calls/:callId/token", requireUser, async (req, res) => {
const call = await db.calls.find(req.params.callId);
if (!call || ![call.callerId, call.calleeId].includes(req.user.id)) return res.sendStatus(404);
await rtc.ensureRoom({ roomId: call.id, hostIdentity: call.callerId });
const role = req.user.id === call.callerId ? "host" : "cohost";
const { token, wsUrl, expiresAt } = await rtc.createToken({ roomId: call.id, identity: req.user.id, role });
res.set("Cache-Control", "no-store").json({ token, wsUrl, expiresAt });
});$ flutter pub add voltkit_rtcfinal creds = await fetchRoomCredentials(roomId);
client = StreamClient(wsUrl: creds.wsUrl, token: creds.token);
client.onClosed.listen(handleClosed); // why it ended: see Errors
final joined = await client.connect(); // throws RpcError when the join is refused
await client.publish(constraints: {'audio': true, 'video': false}); // microphone only
// Both agreed to video:
await client.publish(); // camera and microphone
await client.setCamEnabled(false); // camera off, device kept, so switching back is instantimplementation("in.voltkit:voltkit-rtc:0.9.10")StreamOptions(speakerphone = false) // start on the earpiece, as a phone call does
client.setSpeakerphoneOn(true) // the speaker button
scope.launch { client.audioOutput.collect { out -> speakerIcon(out?.type) } } // speaker, earpiece, wiredHeadset, bluetooth, usb
val routes = client.listDevices(DeviceKind.audiooutput) // for an audio-route picker
client.switchDevice(DeviceKind.audiooutput, "speaker") // a choice by hand wins over a headsetThe Android SDK runs the call audio while connected: a Bluetooth headset wins, then a wired one, then the speaker or the earpiece as you choose. The whole call screen is in one-to-one voice calls and the Android SDK guide.
Safety
The controls you get, and what your app builds
Moderation is enforced by the service, so a modified app cannot unmute itself or ignore a removal. The rules about who may meet whom are yours.
What VoltKit does
- Roles signed into each token; the app cannot change its own
- Kick: the person is removed at once, and the room refuses that identity afterwards
- Forced mute of a microphone or a camera, held at the server
- A moderator role that mutes and removes listeners, without publishing
- Chat mute and delete, in calls and rooms
- Signed, retried webhooks: who joined, who left, why, and for how long
What your app builds
- Matching queues, filters and profiles
- Reporting, blocking and review of reports
- Age checks and identity verification
- Your users' payments and per-minute prices
VoltKit has no AI moderation or content filtering: it gives you the controls and the records, and your app's rules sit on top. Every project also follows the acceptable use policy. Webhook events and signatures: Webhooks.
Paid calls
Paid per-minute calls and timed dates
Participant-minute billing maps to per-minute prices for your users. Each participant.left webhook carries durationSeconds for that session, which your backend can settle against your own prices; your wallet is charged per second.
2 people × 60 minutes = 120 participant-minutes
120 participant-minutes × 99 ÷ 1,000 = 11.88 credits, ₹11.88 (≈ $0.13) at today's rate
Full HD Video + HD Audio: 99 credits per 1,000 participant-minutes. Billed per second, so a 7½-minute call costs 7½ minutes.
2 people × 10 minutes = 20 participant-minutes
20 participant-minutes × 39 ÷ 1,000 = 0.78 credits, ₹0.78 (≈ $0.01) at today's rate
Standard Voice: 39 credits per 1,000 participant-minutes. Billed per second, so a 7½-minute call costs 7½ minutes.
Speed dates and timed calls: your app runs the timer. When it runs out, your backend calls DELETE /v1/rooms/{roomId} (rtc.deleteRoom(roomId) with the Node.js SDK), and each app receives onRoomClosed, then onClosed(roomClosed). Use the same call when a caller cancels before the callee answers.
A room nobody has joined yet is kept for ten minutes by default, and a room people have left closes about 30 seconds after the last one leaves. When a room closes, its chat history goes with it.
Discovery
Audio rooms for meeting new people
One way to design a friendship app: group audio rooms with seats where people meet, then a 1:1 call when two of them want to talk alone.
Planning a voice-first friendship or dating app, in the category of apps like FRND? It is built from the same parts: audio rooms with a stage and seats for discovery (voice chat rooms), a room per match for the call, chat beside both (chat docs), and gifts as events over chat that your app validates, with the artwork from VoltKit's gift store.
App names identify a category of app; their trademarks belong to their owners, and VoltKit is not affiliated with them.
Pricing
Voice and Full HD rates, read live
One rate at a time per person, for the media they actually use; video already includes HD audio.
- Standard VoiceUp to 64 kbps₹39 (≈ $0.41) per 1,000 participant-minutes
- HD VoiceUp to 128 kbps₹49 (≈ $0.52) per 1,000 participant-minutes
- Full HD Video + HD AudioUp to 1080p/30, HD audio included₹99 (≈ $1.04) per 1,000 participant-minutes
Prices are in Indian rupees; dollar figures are approximate, at ₹95 per US dollar on 24 October 2026, for orientation only. You are billed in rupees.
UPI, GST and a calculator for your own sessions: pricing in India. Every rate, including the 60 fps upgrades: pricing.
SDKs
SDKs for your apps and your backend
Flutter covers Android and iOS apps; the Android SDK is voice first and runs the call audio for you. The native iOS (Swift) SDK is in preview.
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
- Voice chat roomsAudio rooms with a stage, seats and raise hand, where people meet before a 1:1 call.Voice rooms
- Live chatChat beside every call and room, with moderation and a daily allowance that grows with your live minutes.In-app chat
- Video calling in FlutterA step-by-step guide: token endpoint, join and publish, video tiles, reconnects and leaving.Read the guide
Calls for dating and friendship apps: questions
Can I build 1:1 matching calls with VoltKit?
Yes. Your backend makes a room per match with an id nobody can guess and mints two tokens, host for the caller and cohost for the callee, so both can speak. The matching queue, filters and profiles are your app's; VoltKit provides the rooms, roles, chat and webhooks.
How is a paid 1:1 call billed on my side?
A 60-minute Full HD 1:1 call is 120 participant-minutes: 11.88 credits, ₹11.88 (≈ $0.13) at today's rate, charged to your wallet per second. Each participant.left webhook carries durationSeconds for that session, so your backend can settle per-minute prices with your own users.
Can users talk without video and switch to video later?
Yes. An app publishes the microphone alone, then publishes again to add the camera when both agree, and can switch the camera off without losing the call. Each participant is billed one rate at a time: the highest of what they send and what they receive, recorded every 5 seconds and charged per second.
What safety tools exist?
Roles enforced from the token, kick (the room refuses that identity afterwards), forced mute of a microphone or camera, a moderator role, chat mute and delete, and signed webhooks that record who joined, who left and for how long. Reporting, blocking, age checks and review are your app's code; VoltKit has no AI moderation.
How do I know when a call ended and how long it lasted?
Webhooks. room.ended carries durationSeconds and the reason the room closed; participant.left carries durationSeconds and why that session ended: left, disconnected, kicked, room-ended, replaced or evicted. Deliveries are signed and retried.
Does VoltKit do matchmaking or profiles?
No. VoltKit provides rooms, roles, chat, music and webhooks. Matching, profiles, payments and safety reviews belong to your app and your backend.
Does it work on iOS?
Flutter apps run on iOS and Android with voltkit_rtc. The native iOS (Swift) SDK is a preview and not released yet; for early access, email contact@voltkit.in.
What does a 10-minute voice call cost?
A 10-minute voice call between two people is 20 participant-minutes; at standard voice that is 0.78 credits, ₹0.78 (≈ $0.01) at today's rate.
Add calls to your app
Create a free account, make an RTC project, and put two test users in a room with the voice calls guide.
Talk to us:contact@voltkit.inWhatsApp