Prerequisites
1. Plivo Account
Sign up for Plivo and get your credentials:2. Phone Number
You need a voice-enabled Plivo number to make or receive calls.
Get a number:
- Go to Phone Numbers > Buy Numbers
- Select country and type (local, toll-free, mobile)
- Filter by
voice_enabled = true - Purchase
India Numbers (Additional Requirements)
India Numbers (Additional Requirements)
Indian phone numbers require KYC compliance:
Submit compliance at Compliance Application before purchasing. See Rent India Numbers for details.
3. WebSocket Server
Your server must:- Accept WebSocket connections over
wss:// - Be publicly accessible (use ngrok for local development)
- Handle Plivo’s stream events (start, media, dtmf, stop)
4. AI Service Credentials (Optional)
For voice AI applications, you’ll typically need:- Speech-to-Text: Deepgram, Google Speech, AWS Transcribe
- LLM: OpenAI, Anthropic, Google Gemini
- Text-to-Speech: ElevenLabs, Google TTS, Amazon Polly
How It Works
Plivo streams real-time audio between phone calls and your WebSocket server.Architecture
Step-by-Step Flow
- Call Initiation: A caller dials your Plivo number, or your application initiates an outbound call.
- Answer URL Request: Plivo makes an HTTP request to your configured Answer URL.
-
Stream XML Response: Your server responds with XML containing the
<Stream>element, specifying the WebSocket URL and streaming parameters. - WebSocket Connection: Plivo establishes a WebSocket connection to your specified URL.
-
Start Event: Plivo sends a
startevent containing call metadata (call ID, stream ID, media format). -
Media Streaming:
- Inbound: Plivo continuously sends
mediaevents containing base64-encoded audio chunks from the caller. - Outbound: Your server sends
playAudioevents with base64-encoded audio to be played to the caller.
- Inbound: Plivo continuously sends
-
DTMF Events: When the caller presses keys, Plivo sends
dtmfevents with the digit information. -
Control Events: Your server can send
clearAudioto interrupt playback orcheckpointto track playback progress. - Connection Close: When the call ends or streaming stops, the WebSocket connection closes.
Stream XML
The<Stream> XML element initiates audio streaming for a call. Include it in your Answer URL response.
Basic Syntax
Parameters
Supported Content Types
Examples
Bidirectional Stream with mu-law Codec
Stream with Status Callbacks and Extra Headers
Stream APIs
Control active streams programmatically via REST API calls.Base URL
Authentication
Use HTTP Basic Authentication with your Plivo Auth ID and Auth Token.Stop a Stream
Endpoint:DELETE /v1/Account/{auth_id}/Call/{call_uuid}/Stream/
Get Stream Details
Endpoint:GET /v1/Account/{auth_id}/Call/{call_uuid}/Stream/
Using the Plivo SDK
Node.js
Python
Stream Status Callbacks
Configure a callback URL to receive notifications about stream lifecycle events.Configuration
Callback Parameters
Example Handler
Signature Validation
Plivo signs WebSocket connection requests to verify authenticity. Validate these signatures to ensure requests originate from Plivo.V3 Signature Headers
Using the Plivo SDK
Using the Node.js Stream SDK
Theplivo-stream-sdk-node handles signature validation automatically:
validateSignature is enabled, connections with invalid signatures are automatically rejected with a 1008 WebSocket close code.
WebSocket Events
All communication over the WebSocket uses JSON messages. Here are the essential events you need to handle.Events from Plivo (Input)
Events to Plivo (Output)
Quick Example
X-Headers
Pass custom metadata from your Stream XML to your WebSocket server.Usage
Parsing
Limits
WebSocket and Stream Limits
Best Practices
Use mu-law 8000Hz
Why mu-law at 8kHz is recommended:- Native Telephony Format: No transcoding required, lowest latency
- Bandwidth Efficient: Compresses 16-bit audio to 8-bit while maintaining voice quality
- Universal Compatibility: Every STT/TTS service supports mu-law
- Sufficient for Voice: Human speech is well-represented at 8kHz
Minimize Latency
For a responsive Voice AI experience, aim for under 1 second total response time:
Server Location: Deploy your WebSocket server close to your expected caller locations. Plivo routes calls through the edge location closest to the caller.
Handle Interruptions
Always support user interruption usingclearAudio:
Integration Guides
For complete code examples and step-by-step tutorials:Plivo Stream SDK
Official SDKs for Python, Node.js, and Java with full examples using Deepgram, OpenAI, and ElevenLabs
Pipecat
Build with the Pipecat framework for simplified voice AI pipelines
Next Steps
- Protocol Reference: Complete JSON schemas, TypeScript types, and advanced patterns
- Plivo Stream SDK: Production-ready SDKs with examples
Support
For questions, issues, or feature requests:- Documentation: Plivo Docs
- Support: support@plivo.com
- GitHub Issues: For SDK-specific issues
Last updated: January 2026