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 curl and Node.js)
  • your API base URL, called API_URL below (for example https://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.