Skip to content
TriedDocs
Deploy

Web calls

Let people talk to an agent in the browser with POST /v3/create-web-call and the Tried web SDK, or share a Voice Orb link.

A web call connects a browser microphone to an agent over WebRTC, with no phone number. Your backend creates the call and gets an access_token; your page joins the call with the web SDK. Web calls use the same agent, prompt, tools and post-call analysis as phone calls, and count against the same concurrency limit.

There are three ways to start one:

  • Your own page, with POST /v3/create-web-call from your server and @tried/web-sdk in the browser.
  • A public key, so the browser can call POST /v3/create-web-call itself from an allowed domain. See Chat widget.
  • A Voice Orb share link, a hosted page anyone with the link can use.
Needs keys

Audio needs LiveKit (LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET). Without it, create-web-call still creates the call and returns a token, and the Voice Orb page falls back to text chat.

Create the call on your server#

curl -X POST https://api.tried.com.au/v3/create-web-call \
  -H "Authorization: Bearer $TRIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "agent_8e0c...",
    "retell_llm_dynamic_variables": { "first_name": "Sam" },
    "metadata": { "session": "abc" }
  }'

POST /v2/create-web-call is an alias.

Field Type Default Description
agent_id string required The agent to talk to.
agent_version integer or string latest Version number. On /v3/create-web-call it may also be latest, latest_published or an environment tag name such as prod.
retell_llm_dynamic_variables object {} Dynamic variables. Non-string values are converted to strings.
metadata object {} Stored on the call.

The response is HTTP 201 with the call object (call_type: "web_call", call_status: "registered", direction: null) plus:

Field Description
access_token LiveKit token the browser joins with. Valid for 1 hour.
livekit_url The LiveKit server URL to connect to.
expires_at Token expiry, epoch milliseconds.
transport "livekit".
ice_servers ICE servers for Retell wire compatibility. Default [{ "urls": ["stun:stun.l.google.com:19302"] }]; override with the WEB_CALL_ICE_SERVERS JSON env var. LiveKit negotiates its own TURN.

Keep your API key on the server. Send only access_token and livekit_url to the browser.

Join from the browser#

@tried/web-sdk wraps livekit-client with the same API as Retell's retell-client-js-sdk. RetellWebClient is exported as an alias, so existing front ends switch by changing the import.

import { TriedWebClient } from "@tried/web-sdk";

const client = new TriedWebClient();

client.on("call_started", () => console.log("connected"));
client.on("agent_start_talking", () => setTalking(true));
client.on("agent_stop_talking", () => setTalking(false));
client.on("update", ({ transcript }) => render(transcript));
client.on("call_ended", () => console.log("ended"));
client.on("error", (err) => console.error(err));

const { access_token, livekit_url } = await fetch("/api/start-call", { method: "POST" }).then((r) => r.json());
await client.startCall({ accessToken: access_token, livekitUrl: livekit_url });

startCall options#

Option Type Description
accessToken string Required. From create-web-call.
livekitUrl string From create-web-call. Defaults to the client's url option, then wss://livekit.tried.com.au.
sampleRate number Microphone sample rate.
captureDeviceId string Microphone device.
playbackDeviceId string Speaker device.
emitRawAudioSamples boolean Emit audio events with the agent's PCM samples as Float32Array.

The microphone uses echo cancellation, noise suppression and auto gain control.

Methods#

Method Description
startCall(config) Connect and turn on the microphone.
stopCall() Leave the call and remove audio elements.
mute(), unmute() Turn the microphone off and on.
startAudioPlayback() Call from a click handler if the browser blocked autoplay.

Events#

Event Payload When
call_started none Connected and the microphone is on.
call_ready none The agent joined the room.
agent_start_talking, agent_stop_talking none The agent's state changes to and from speaking.
update { transcript: { role, content }[] } The live transcript changed. role is agent or user.
metadata any JSON data sent on the metadata topic.
audio Float32Array Agent audio samples, only with emitRawAudioSamples.
call_ended none You stopped, the room disconnected, or the agent left.
error error Connection or transcript errors.

The agent leaving the room ends the call on the client.

A Voice Orb link is a public page at /orb/<token> where anyone with the link can talk to an agent in their browser. Use it to share an agent with a colleague or a client before you build your own front end.

Open the share dialog#

In the agent builder, click the share icon next to Publish (Share a Voice Orb link).

Click Create link. Copy the URL, or open it with the external link icon.

Revoke it#

Click the bin icon on a link to revoke it. The page stops working at once.

The Share with a Voice Orb link dialog in the agent builder

The page shows the agent name, the workspace name and an animated orb. With LiveKit configured, the visitor talks by voice: the page calls POST /public/share/<token>/web-call, which creates a normal web call with metadata.source: "voice_orb". Without LiveKit it falls back to text chat.

The Voice Orb page in text fallback mode
  • Calls are billed to the workspace that owns the agent.
  • When the workspace is out of credit or over its monthly budget, the page gets HTTP 402.
  • API endpoints: GET /agents/:agent_id/share-links, POST /agents/:agent_id/share-links, DELETE /share-links/:id. Each link has share_link_id, token, enabled and url_path.

Test in the dashboard#

The agent builder's Test Audio panel runs a web call against the current draft. Call transfer does not work in web calls because there is no phone line to transfer.

Limits and gotchas#

  • Web calls count against the workspace concurrency limit and cannot use reserved inbound slots. A full workspace returns 429.
  • The access token expires after 1 hour. Create the call right before the user joins.
  • Voicemail, IVR and call screening detection also runs for the first 3 minutes of web calls.