Start here: what are you building?
Talk to an AI
A person talks to an AI voice agent in the browser — no phone number, no carrier, nobody’s
phone rings. The browser opens a WebRTC audio line straight to the AI. This is how the live demo
on our site works, and how an embedded “talk to our AI” widget works.This is not one of the three paths below — it isn’t a phone call at all. It’s always available.
Place or connect a real phone call
You’re putting a person on a live phone call to a real number — outbound dialing, connecting
staff to customers, masked caller ID. This is what the three paths (A / B / C) are for. Pick
one with the decision tree below.
WebRTC is just the transport, not the deciding factor. WebRTC can carry a call to a carrier
(path A) or a line straight to an AI (talk-to-AI, above). So “an AI can only join when RevDesk
places the call” — below — is specifically about adding an AI to a call that also has a person on
a phone. It does not mean a browser can’t reach an AI.
AI that answers your inbound calls (a receptionist that picks up when someone dials your
number) is a separate capability — not one of the outbound paths on this page.
Placing a real call: pick a path
One question does most of the work: does an AI need to be on the call, or do you need the destination locked so the client can’t change it? If yes, RevDesk places the call (B or C). If no, the browser can dial directly (A). Then: is your staff member in the browser, or on their own phone?At a glance
The three paths
1
Path A — Call from your browser (today)
Staff click Call and talk through their browser; no phone line needed. The browser gets a
scoped, single-use token for that one call and dials the carrier directly.Quickest to launch and proven-stable. The destination is declared, attributed, and
guardrail-bounded — but because the browser is what dials, this path doesn’t lock the
destination the way B and C do, and there’s no room for an AI to join.Use it for simple internal dialing by trusted staff.
2
Path B — Browser call, placed by RevDesk (beta)
Same in-browser experience, but the browser never dials. RevDesk places the call and the
browser simply joins it, using a room-join token from
POST /v1/room-token and the RevDesk
browser SDK.Because the destination is set server-side, it can’t be changed by the client or replayed to
reach a different number — and because the call lives in a room, you can add an AI voice
(mid-call assist, AI voicemail, AI follow-ups; on the roadmap). Only the destination’s phone
rings; your staff join from the browser.Use it for an in-browser experience that still needs a hard destination lock or AI on the call.3
Path C — Bridge: connect on your own phone (today)
The path for a regular phone — no browser or SDK. Staff click Call, their own phone rings,
and when they answer the other party is already on the line. RevDesk places both legs, so the
destination is locked server-side and the other party only ever sees your RevDesk number, never
the staff member’s personal number.Two phones ring (the staff member’s and the destination’s). Most resilient — falls back to the
cellular network and needs no mic or browser permissions.Use it for regulated / privacy-sensitive calling, or anyone who’d rather answer on a phone.
What every path shares (the baseline)
No matter which path you choose:- Scoped, single-use tokens. Each token is issued for exactly one call and invalidated when that call ends — it can’t be reused.
- You can only call as a number you own. Caller ID is validated at issuance against your verified numbers.
- Per-call attribution. Every call is logged to your org, the issuing user, and the from/to. Reconcile via
GET /v1/calls. - Account guardrails. A destination allowlist, a daily spend cap, a concurrency cap, and a max per-minute rate bound the blast radius even if a token leaked.
- A call-length limit. Every call has a maximum duration and is ended automatically if it reaches it, so a stuck or looping call can never run unbounded. Default is 60 minutes; it can be raised per number or per workspace (contact us or set it in workspace settings), up to a 3-hour ceiling.
Ending a call
A call ends when any of these happens (whichever comes first):- The AI decides the conversation is over and hangs up on its own.
- A person on the call hangs up.
- You end it on demand:
POST /v1/calls/{id}/hangupstops an in-progress call immediately (ending an already-ended call just returns success). - It hits the call-length limit above.
Same surface, swap the path
Paths B and C expose the same client surface. Issue a token, attach acallUpdate handler, and
switching paths is close to a one-line change: