What this is
A handful of POST endpoints that hand you back short-TTL signed tokens for live transports. No SDK to install, no webhook dance. Mint a key, send a request, hold a connection.
Every request authenticates with Authorization: Bearer vv_live_…, every key is scope-gated and rate-limited per minute, and every session is metered against your wallet. There is one canonical base URL: https://www.vaanilabs.in.
The four surfaces
Pick the surface that fits the conversation you want to host. Voice surfaces give you a WebSocket; meeting surfaces give you a room URL.
Text-voice
4paise / sec
Browser-side voice agent. Mic in, voice out, full-duplex over a single WebSocket. Pair with a flow for branching conversations.
Read the spec →Voicebot
4paise / sec
Same engine as text-voice, scoped separately so embed-snippet usage shows up cleanly on your dashboard.
Read the spec →Meeting agent
8paise / sec
A LiveKit room with Vikash — our hosted AI participant — joined automatically. You get a join URL and a host token.
Read the spec →Meeting
1paise / sec
A LiveKit room only. No AI participant, no transcription. Use when you want raw multi-party audio/video at cost.
Read the spec →Quickstart — 90 seconds
Get a key from the dashboard key manager, fire one request, hold the WebSocket. That's the whole loop.
# 1. Create a key in the dashboard, then export it.
export VAANI_API_KEY="vv_live_YOUR_KEY_HERE"
# 2. Open a text-voice session.
curl -X POST https://www.vaanilabs.in/api/public/v1/textvoice/session \
-H "Authorization: Bearer $VAANI_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const apiKey = "vv_live_YOUR_KEY_HERE";
// Open a text-voice session.
const res = await fetch(
"https://www.vaanilabs.in/api/public/v1/textvoice/session",
{
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
},
);
const { ws_url, ws_token } = await res.json();
// Connect the live transport.
const ws = new WebSocket(ws_url);
ws.onmessage = (e) => console.log("frame:", e.data);import os, requests, websockets, asyncio
API_KEY = os.environ["VAANI_API_KEY"]
r = requests.post(
"https://www.vaanilabs.in/api/public/v1/textvoice/session",
headers={"Authorization": f"Bearer {API_KEY}"},
json={},
timeout=10,
)
r.raise_for_status()
session = r.json()
async def stream():
async with websockets.connect(session["ws_url"]) as ws:
async for frame in ws:
print("frame:", frame)
asyncio.run(stream())Table of contents
00
Authentication
API keys, headers, scopes.
00
Rate limits
Per-key budgets + 429s.
00
Error codes
Every status we return.
00
Pricing & billing
Per-second rates, wallet, autopay.
01
Text-voice
Browser-side voice agent over WS.
01
Voicebot
Same WS, dashboard split for embed snippets.
01
Meeting agent
LiveKit room + Vikash dispatched.
01
Meeting
LiveKit room only — no AI participant.
02
Embed snippets
Drop-in JS for any site.
02
Changelog
Versioning + release notes.