Control Protocol Reference
The control WebSocket exchanges JSON messages.
Envelopes
Request:
{ "type": "request", "id": "id", "method": "method.name", "params": {} }Successful response:
{ "type": "response", "id": "id", "ok": true, "result": {} }Failed response:
{
"type": "response",
"id": "id",
"ok": false,
"error": { "code": "BAD_REQUEST", "message": "Invalid request" }
}Event:
{
"type": "event",
"event": "event.name",
"eventId": "event-id",
"sessionId": "session-id",
"sequence": 1,
"occurredAt": "2026-06-30T00:00:00.000Z",
"data": {}
}Commands
Route:
route.register
SIP:
sip.createOutboundsip.cancelOutboundsip.reinvitesip.bye
sip.createOutbound accepts optional SIP digest credentials as auth: { "username": "...", "password": "..." }. Both fields are required when auth is present. A caller can also supply outboundAttemptId; while dialog creation is pending, sip.cancelOutbound can send a SIP CANCEL for that ID from the same control connection.
Sessions:
session.createsession.getsession.listsession.delete
When coturn authentication is configured, session.create returns an iceConfiguration tied to the selected RTPBridge backend. webrtc.restartIce renews that configuration without changing backends.
WebRTC:
webrtc.createOfferwebrtc.createFromOfferwebrtc.acceptAnswerwebrtc.acceptOfferwebrtc.restartIce
RTP:
rtp.createOfferrtp.createFromOfferrtp.acceptAnswerrtp.reinvite
rtp.createOffer accepts srtp: true for required SRTP or srtpOptional: true for opportunistic SRTP. The two options are mutually exclusive; opportunistic mode allows the peer to select plain RTP by omitting crypto from its answer.
Media:
media.playmedia.playAndWaitmedia.stopmedia.bridgemedia.unbridgemedia.gathermedia.playAndGathermedia.leaveMessageendpoint.updateDirectiondtmf.inject
Recordings:
recording.startrecording.stoprecording.listrecording.delete
Reserved or deferred:
event.acksip.answersip.rejectvad.startvad.stopamd.startamd.stop
Binary Data
Large PCAP recording downloads and merges are HTTP streaming routes, not WebSocket messages.