Quick Start
Connect your first call on Kallo in about ten minutes: create a room from your backend, add two participants and join from the browser.
You need:
- a Kallo account (create one)
- a backend that can make HTTPS requests (the examples use
curland Node.js) - your API base URL, called
API_URLbelow (for examplehttps://api.your-host.com; the REST API lives under$API_URL/v1)
1. Pick a project
Every workspace starts with a Test and a Production project. Use the Test project while you build; switch projects with the selector in the dashboard sidebar. Each project has its own API keys, rooms, usage and webhooks. Credit is shared by the whole workspace.
2. Add credit
Calls are billed per participant-minute from a prepaid USD balance, in test projects as well. Open Billing, choose an amount (from $5) and pay by card, Apple Pay or Google Pay. The balance updates as soon as the payment is confirmed.
3. Create a server API key
Open API keys, create a key with at least these scopes, and copy the secret. It is shown once.
rooms:write
participants:write
Keys look like sk_test_... (Test project) or sk_live_... (Production).
Keep them on your server and never ship them in a web or mobile app.
export API_URL="https://api.your-host.com"
export SECRET_KEY="sk_test_..."
4. Create a room
curl -sS "$API_URL/v1/rooms" \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: booking-123-room" \
-d '{
"name": "consult-123",
"max_participants": 2,
"expires_in": 3600
}'
The response contains the room id (room_...). The Idempotency-Key
header is optional but recommended: a retried request with the same key
returns the same room instead of creating a second one.
5. Add participants
Create one participant per person. Each gets a short-lived participant token and a join link.
curl -sS "$API_URL/v1/rooms/room_.../participants" \
-H "Authorization: Bearer $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_id": "customer-123",
"name": "Customer",
"role": "publisher"
}'
{
"id": "part_...",
"room_id": "room_...",
"token": "rtc_pt_...",
"join_url": "https://your-web-host/join#token=rtc_pt_...",
"expires_at": "..."
}
Repeat for the second person. Participant tokens only let someone join that room; they cannot call the REST API.
6. Join the call
You have two options.
Hosted call page. Send join_url to the person (email, chat, in-app
link). It opens a ready-made call page with camera and microphone
controls. The token stays in the URL fragment, so it is never sent to a
server log.
Your own UI. Pass the token to the Web SDK:
npm install @kallolive/web
import { RTCClient } from "@kallolive/web";
const rtc = new RTCClient({ apiBaseUrl: API_URL });
rtc.on("track.subscribed", ({ track }) => {
if (track.kind !== "video") return;
const video = document.createElement("video");
video.autoplay = true;
video.playsInline = true;
rtc.attachTrack(track.id, video);
document.body.appendChild(video);
});
await rtc.connect({ token: participantToken });
await rtc.microphone.enable();
await rtc.camera.enable();
For mobile apps, the Flutter SDK takes the same token. See the SDK guide.
7. Do the same from Node.js
npm install @kallolive/server
import { Kallo } from "@kallolive/server";
const rtc = new Kallo({
secretKey: process.env.SECRET_KEY!,
baseURL: `${process.env.API_URL}/v1`,
});
const room = await rtc.rooms.create(
{ name: "consult-123", max_participants: 2, expires_in: 3600 },
{ idempotencyKey: "booking-123-room" },
);
const customer = await rtc.participants.create(room.id, {
external_id: "customer-123",
name: "Customer",
role: "publisher",
});
// Send customer.join_url, or give customer.token to your app.
A Go SDK with the same coverage is in the SDK guide.
8. End the room and check usage
curl -sS -X DELETE "$API_URL/v1/rooms/room_..." \
-H "Authorization: Bearer $SECRET_KEY"
Ending a room disconnects everyone and finalizes usage. The room, its participant-minutes and the charge appear in the dashboard under Rooms, Usage and Billing within a few seconds.
Next steps
- Get notified when sessions start and end with Webhooks.
- Handle errors, retries and rate limits: REST API.
- Understand participant-minutes and credit: Usage and billing.
- Before going live, switch to the Production project and a
sk_live_key.