The Exotel transport connects VoxCore to Exotel’s App Bazaar Voicebot applet. Calls arrive as WebSocket connections from Exotel’s infrastructure, using Pipecat’s built-in ExotelFrameSerializer.
Connection flow
Endpoint
WebSocket /exotel/{bot_id}
bot_id identifies which bot configuration to fetch from VoxBridge.
| Property | Value |
|---|
| Encoding | LINEAR16 (signed 16-bit PCM) |
| Sample rate | 8,000 Hz |
| Channels | Mono |
| Transport | WebSocket (binary/JSON) |
Handshake
Exotel uses Pipecat’s standard telephony WebSocket handshake. VoxCore calls parse_telephony_websocket() which auto-detects Exotel from the WebSocket messages and returns call metadata:
| Field | Mapped from |
|---|
stream_id | call_data.stream_id |
caller_id | call_data.from |
did | call_data.to |
Hangup behavior
Bot-initiated: VoxCore closes the WebSocket connection. The Exotel App Bazaar flow moves to the Hangup applet, which tears down the telephony call.
Customer hangup: Exotel sends a stop event, then closes the WebSocket. VoxCore receives WebSocketDisconnect and captures disconnected_by = "customer".
Limitations
Call transfer is not supported. Exotel’s current Voicebot applet does not expose a dynamic call control API for mid-call transfers. Transfer support is deferred until Exotel adds this capability.
Prerequisites
- Exotel account with App Bazaar access
- App Bazaar flow configured:
Call Start → [Voicebot Applet] → [Hangup Applet]
- Voicebot applet WebSocket URL pointing to VoxCore’s
/exotel/{bot_id} endpoint
- No Exotel credentials needed in VoxCore — call control is flow-based