Loading
The runtime is dependency-free, ES2020, and lives at a stable versioned URL: https://www.vaanilabs.in/embed/v1/vaanivoice.js. It exposes a single global, window.Converlane, and is idempotent — including it twice is harmless.
Four init methods
window.Converlane
| Field | Type | Notes |
|---|---|---|
Converlane.textvoice(opts) | function | Mount an inline text-voice card into opts.container (CSS selector or element). Requires opts.apiKey. |
Converlane.voicebot(opts) | function | Floating bubble that opens a panel. opts.position: "bottom-right" | "bottom-left". Requires opts.apiKey. |
Converlane.meetingAgent(opts) | function | Inline LiveKit room with Vikash dispatched. Requires opts.apiKey + opts.container. |
Converlane.meeting(opts) | function | Inline LiveKit room only. Requires opts.apiKey + opts.container. |
HTML — text-voice
<!-- Drop on any page. Loads the embed runtime asynchronously. -->
<script src="https://www.vaanilabs.in/embed/v1/vaanivoice.js" defer></script>
<div id="my-voice-agent"></div>
<script>
window.addEventListener("DOMContentLoaded", () => {
Converlane.textvoice({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#my-voice-agent",
});
});
</script><!-- Drop on any page. Loads the embed runtime asynchronously. -->
<script src="https://www.vaanilabs.in/embed/v1/vaanivoice.js" defer></script>
<div id="my-voice-agent"></div>
<script>
window.addEventListener("DOMContentLoaded", () => {
Converlane.textvoice({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#my-voice-agent",
});
});
</script># The embed snippet is browser-only. From a server, use the four
# /api/public/v1/* endpoints directly — see the surface specs.
#
# A handy pattern: server-render the HTML below, but inject a
# DASHBOARD-MINTED key, never a long-lived key, into the page.
print('<script src="https://www.vaanilabs.in/embed/v1/vaanivoice.js" defer></script>')JS — all four surfaces
// Floating bubble (bottom-right by default).
Converlane.voicebot({
apiKey: "vv_live_YOUR_KEY_HERE",
position: "bottom-right", // or "bottom-left"
});
// Inline meeting room with Vikash.
Converlane.meetingAgent({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#meeting-slot",
title: "Office hours",
});
// Inline LiveKit room (no AI).
Converlane.meeting({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#room-slot",
});// Floating bubble (bottom-right by default).
Converlane.voicebot({
apiKey: "vv_live_YOUR_KEY_HERE",
position: "bottom-right", // or "bottom-left"
});
// Inline meeting room with Vikash.
Converlane.meetingAgent({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#meeting-slot",
title: "Office hours",
});
// Inline LiveKit room (no AI).
Converlane.meeting({
apiKey: "vv_live_YOUR_KEY_HERE",
container: "#room-slot",
});# The embed snippet is browser-only. From a server, use the four
# /api/public/v1/* endpoints directly — see the surface specs.
#
# A handy pattern: server-render the HTML below, but inject a
# DASHBOARD-MINTED key, never a long-lived key, into the page.
print('<script src="https://www.vaanilabs.in/embed/v1/vaanivoice.js" defer></script>')Manage in the dashboard
Already signed up? Configure embed snippets, copy ready-to-paste markup, and rotate the key from /api-keys/embed in the dashboard.