The iCallMate WebSocket protocol defines how the telephony dialler communicates with VoxCore. All messages are JSON-encoded text frames.

Connection

wss://fleet.vohci.com/ws/{bot_id}

Handshake sequence

After WebSocket connection, the dialler must send exactly three events in order:

1. connected

{
  "event": "connected",
  "callerId": "+919876543210",
  "did": "+911234567890",
  "callDirection": "incoming",
  "streamId": "stream-abc"
}

2. start

{
  "event": "start",
  "streamId": "stream-abc",
  "mediaFormat": {
    "encoding": "LINEAR",
    "sampleRate": 8000,
    "channels": 1
  }
}

3. answer

{
  "event": "answer"
}

Audio streaming

Dialler → VoxCore: media

{
  "event": "media",
  "payload": "<base64-encoded LINEAR16 audio>"
}
PropertyValue
EncodingLINEAR16 (signed 16-bit PCM)
Sample rate8,000 Hz
ChannelsMono
Payload encodingBase64

VoxCore → Dialler: reverse-media

{
  "event": "reverse-media",
  "chunk": 42,
  "did": "+911234567890",
  "payload": "<base64-encoded LINEAR16 audio>",
  "timestamp": "2026-04-24 14:30:00",
  "streamId": "stream-abc",
  "callerId": "+919876543210",
  "chunk_durn_ms": 20,
  "callDirection": "incoming",
  "encoding": "LINEAR",
  "RevMediaQ": 0,
  "source": "ai"
}

Control events

Dialler → VoxCore

hangup-call

Sent when the customer or network disconnects.
{
  "event": "hangup-call",
  "disconnectedBy": "customer"
}

VoxCore → Dialler

reverse-media-stop

Clears the dialler’s audio playback buffer. Always sent before hangup.
{
  "event": "reverse-media-stop",
  "callerId": "+919876543210",
  "streamId": "stream-abc"
}

reverse-hangup-call

Drops the call. Sent after reverse-media-stop.
{
  "event": "reverse-hangup-call",
  "streamId": "stream-abc",
  "callerId": "+919876543210",
  "source": "ai",
  "message": "Call ended by bot"
}

reverse-call-transfer

Transfers the call to another number.
{
  "event": "reverse-call-transfer",
  "streamId": "stream-abc",
  "callerId": "+919876543210",
  "transferTo": "+911111111111"
}

Event timeline