07Reference · Surface

Meeting agent — a room with Vikash already in it.

POST creates a LiveKit room AND dispatches Vikash, our hosted AI participant. You get a Google-Meet-style join URL and a host-seat token; Vikash joins automatically and starts listening.

Endpoint

POST/api/public/v1/meeting-agent/rooms

Two things happen server-side: livekit/create-room mints the room with a Google-Meet-style short code, then livekit/join-agent dispatches Vikash. If Vikash fails to join the response is a 502 with the partial room_url echoed so you can retry without leaking a half-provisioned room.

Request

Body (JSON, optional)

FieldTypeNotes
titlestringDisplay name for the room. Defaults to "Public API Meeting".
max_participantsinteger (1–50)Hard cap on simultaneous attendees. Default 20, clamped to [1, 50].
flow_idstringOptional. Conversation flow Vikash should follow. Omit for free-form.

Response · 200

JSON

FieldTypeNotes
room_urlstringGoogle-Meet-style share URL: https://vaanilabs.in/meet/xxx-xxxx-xxx. Hand this to participants.
room_namestringThe internal LiveKit room name. You only need this for server-side LiveKit SDK calls.
host_tokenstringShort-TTL JWT for the host seat. Gives mod controls (kick, mute) when used to connect to LiveKit directly.
session_tokenstringHMAC-signed surface token tying the room back to your api_key_id and usage row. Treat as opaque.
expires_atISO 8601 stringWhen the host_token + session_token stop being accepted.
surface"meeting-agent"Echoes the surface for client-side switching.

Errors

StatusCodeMeaning
401invalid_api_keyStandard auth failure — see auth docs.
402insufficient_balanceWallet at zero, no autopay.
403scope_deniedKey missing the meeting-agent scope.
429rate_limitedPer-key budget exceeded.
502upstream_errorLiveKit room creation OR Vikash dispatch failed. Body includes room_url if the room was created before dispatch failed.

Examples

curlmeeting-agent.sh
curl -X POST https://www.vaanilabs.in/api/public/v1/meeting-agent/rooms \
-H "Authorization: Bearer $VAANI_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Weekly standup", "max_participants": 10, "flow_id": null }'

# Response 200
# {
# "room_url": "https://vaanilabs.in/meet/abc-defg-hij",
# "room_name": "<livekit room name>",
# "host_token": "<short-lived JWT for the host seat>",
# "session_token": "<HMAC-signed surface token>",
# "expires_at": "2026-04-25T13:00:00.000Z",
# "surface": "meeting-agent"
# }
javascriptmeeting-agent.js
const res = await fetch(
"https://www.vaanilabs.in/api/public/v1/meeting-agent/rooms",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.VAANI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Weekly standup",
max_participants: 10,
}),
},
);
const { room_url, host_token } = await res.json();

// Send room_url to your participants. Use host_token to mint
// per-attendee tokens server-side, or just hand them the URL.
console.log("join here:", room_url);
pythonmeeting-agent.py
r = requests.post(
"https://www.vaanilabs.in/api/public/v1/meeting-agent/rooms",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"title": "Weekly standup", "max_participants": 10},
timeout=12,
)
r.raise_for_status()
data = r.json()
print("share:", data["room_url"]) # vaanilabs.in/meet/abc-defg-hij

Was this page helpful?