7443 by default). It bridges the media into the same call
lifecycle as QUIC and SIP. Six adapter shapes are built in. They share
the same post-bridge code path, but they speak different signaling
dialects on the ingress side.
Surface summary
The first four are full WebRTC (DTLS-SRTP, ICE-lite, congestion control).
The last two use a plain WebSocket. For those two, the gateway
transcodes to and from the trunk’s negotiated codec.
Tenant-scoped paths
Every signaling endpoint includes the tenant id in the URL path so the gateway can route to the right config without an extra round-trip:Per-vendor notes
Browser
The TypeScript SDK in browser mode uses this adapter when you opt into WebRTC media. The default is WebTransport. Passmedia: "webrtc" to
connect(). The SDK then negotiates SRTP locally. It shows inbound
audio via the standard MediaStreamTrack API instead of onAudioFrame
byte callbacks.
LiveKit
Pass a participant JWT that your LiveKit server minted. The ClutchCall gateway does not mint LiveKit tokens. The adapter joins the LiveKit room as a participant. It subscribes to one published track. It bridges that track to the matchingcall_sid on the gateway.
Use this adapter when the same call must fan out to multiple human
listeners in the LiveKit room (agents, supervisors, transcribers) in
addition to the AI bridge.
Daily
Daily uses plain JSON signaling. Pass the meeting URL and the participant token. The adapter joins as a hidden participant and bridges audio.Chime
First create the Chime meeting out-of-band (via the AWS SDK or REST). Then pass theMeetingId, AttendeeId, and JoinToken that Chime
returned. SigV4 signing happens transparently.
Twilio
Twilio Media Streams are PCMU at 8 kHz over a plain WebSocket. The adapter checks theX-Twilio-Signature HMAC against a per-trunk
shared secret (set via AddTrunk.api_bearer_token).
Then it bridges raw PCMU bytes to the gateway without transcoding.
Vapi
Vapi sends linear16 at 16 kHz on a plain WS. The adapter resamples to the trunk’s negotiated codec, typically PCMU 8 kHz for SIP. It uses the same SIMD path that the C++ core uses for QUIC media.Why scope is locked
The set above is intentionally not extensible at runtime. Every adapter has an opinionated mapping from vendor-specific lifecycle events (participant_joined, track_subscribed, media_stream.start) into
the gateway’s internal CallEvent machine. New vendors require a code
change, not a config knob. This is how the gateway keeps the same
CallEvent semantics across every transport.
