The fastest way to add calls is the SDK — see Voice & Video Calls (SDK). This
page explains what happens under the hood.
The pieces
Call lifecycle
1
Invite
The caller starts a call. Everyone else in the conversation receives a
call_invite with
the call type (voice or video) and caller info.2
Accept / reject
A callee accepts or rejects. Rejecting ends the invite for that participant.
3
Negotiate
Accepting participants exchange SDP offers/answers and ICE candidates over the
WebSocket until a peer connection is established (
call_connected).4
In call
Media flows peer-to-peer. Mute/unmute and camera on/off are broadcast to peers.
5
Hang up
Any participant can end the call; the rest receive
call_hangup.Call types
voice— audio only.video— audio + video.
Signaling messages
Call signaling is a set of WebSocket message types (call_invite, call_accept, call_join,
call_offer, call_answer, call_ice_candidate, call_reject, call_hangup, call_mute,
video_off, …). The SDK sends and handles these for you. If you’re implementing WebRTC
directly, see the Call Signaling protocol reference.
Active call
You can check whether a conversation currently has a call in progress:Call quality
After a call, clients can submit quality metrics (duration, packet loss, jitter, round-trip time) which surface in your dashboard:conversation.getCallStats()).
Add calls with the SDK
startCall, accept, mute, streams, and events.
ICE servers endpoint
Fetch STUN/TURN config for WebRTC.