Managed cloud is a single production environment. There is no separate sandbox
tenant. Test against your own numbers and a low-volume trunk before you scale
up. If you need an isolated stack, see
On-Prem / Self-Hosted.
Before you start
1
Create a workspace and API key
Sign in at portal.clutchcall.dev. Create (or pick) a workspace. Mint an
API key under Settings → API keys. Keep the key server-side. This key
can originate calls and read call data.Your workspace automatically gets a per-tenant SIP edge
(
<workspace-id>.sip.clutchcall.dev) and a browser media endpoint
(<workspace-id>.webrtc.clutchcall.dev).2
Configure a trunk and a number (for phone calls)
In the voice console at agent.clutchcall.dev, add an outbound SIP
trunk. Claim or bring a phone number. Note the trunk id. You pass it as
trunkId. Skip this step if you only want the browser agent below.3
Build an agent
Still in agent.clutchcall.dev, create a voice agent:
- Pick a speech-to-speech or ASR→LLM→TTS provider.
- Give the agent a system prompt.
- Note the agent’s id (e.g.
appointment-reminder).
Install the SDK
- TypeScript
- Python
Path A — an AI agent on a phone call
Originate an outbound call and attach a server-side agent. When the callee answers, the engine connects the audio bridge to your agent automatically. Your process never touches the media. This is the whole app.1
Originate with an agent attached
Pass
agent to originate(). The engine attaches the runtime on answer.2
Wait for connect or failure
The control plane is request/response. Poll
calls.get() until the call
leaves the ringing states.- TypeScript
- Python
Path B — a browser voice agent
This path needs no phone number. Capture the mic in the browser. Publish the audio as encoded Opus. Play the agent’s reply back. Media rides QUIC end to end, so this path has no WebRTC transport and no SFU. Use a browser-scoped key (minted in the console with browser origin restrictions). Never use your server key.1
Originate a browser-legged call
Get a
sid from the control plane.2
Start playback
Create and
start() an OpusPlayer for the downlink.3
Attach as the caller
attachCaller() subscribes downlink and publishes uplink.4
Capture the mic
captureMicrophone() forwards encoded frames onto the uplink.captureMicrophone runs the browser’s own echo-cancellation, gain control, and
noise suppression. It then diverts the encoded Opus frames onto the uplink
track. Raw PCM never crosses the wire. This works today in Chromium-based
browsers. Safari and UDP-blocked networks fall back to a WebSocket/WebRTC media
leg. See
Browser compatibility.Next steps
Build a voice agent
Prompt, providers, and tools for the agent that you attached above.
Recipes
End-to-end worked examples: outbound sales, browser agent, human handoff.
Calls API
Full signatures for
originate, get, transfer, and hangup.Outbound telephony
Trunks, numbers, and the dialer behind Path A.

