Plivo Connector
A Plivo connector streams live audio from a Plivo call into a VideoSDK room using Plivo Audio Streaming. You point a Plivo application at the connector, and Plivo opens a bidirectional WebSocket that carries the call audio into the room. No SIP trunk is required.
Setup takes three steps: create the connector, configure your Plivo application, and route the call to a room. If you are new to connectors, read the Connectors Overview first.
How It Works
- A caller dials your Plivo number.
- Plivo sends an Answer URL request to your connector's webhook URL.
- VideoSDK resolves routing and responds with Plivo XML that tells Plivo where to stream the audio:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Stream bidirectional="true" audioTrack="inbound" contentType="audio/x-mulaw;rate=8000" keepCallAlive="true">wss://ingest.videosdk.live/plivo?ref=<callRef></Stream>
</Response> - Plivo opens that WebSocket and streams audio. VideoSDK claims the call, joins the room, and bridges audio in both directions.
You do not implement the WebSocket protocol; Plivo handles it. Audio is G.711 μ-law (audio/x-mulaw) at 8 kHz, in 20 ms frames of 160 bytes, and the call is identified by Plivo's CallUUID.
Prerequisites
- A VideoSDK account and API token. See Generate a VideoSDK Token.
- An active Plivo phone number.
- Your Plivo Auth ID and Auth Token, from the Plivo Console.
Step 1: Create a Connector
Create the connector with a single API call. Setting defaultRoomId here is the fastest path to a working call, since every call then joins that room.
curl -X POST https://api.videosdk.live/v2/connectors \
-H "Authorization: Bearer $VIDEOSDK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "plivo",
"name": "Main Plivo Connector",
"defaultRoomId": "abcd-efgh-ijkl",
"region": "us002"
}'
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | Must be plivo. |
name | string | No | A label to help you recognize the connector later. |
defaultRoomId | string | No | Room that calls join when no routing rule matches. Set this for the simplest setup. |
defaultRuleId | string | No | Fallback routing rule ID, for dynamic routing. |
region | string | No | Pins the media and ingest region (e.g., us002 or in002). When omitted, the region is derived from the caller. |
The response contains the connector, including the webhookUrl you need for the next step:
{
"message": "Connector created successfully",
"data": {
"id": "cn_b3p7q1m5x9k2r8v4",
"provider": "plivo",
"name": "Main Plivo Connector",
"webhookUrl": "https://api.videosdk.live/v2/hooks/plivo/whk_3Lm8kF1nQ5xR2vC7yZ4pB9hT6gW0dS1",
"defaultRoomId": "abcd-efgh-ijkl",
"defaultRuleId": null,
"region": "us002",
"createdAt": "2026-06-21T14:30:45.123Z"
}
}
| Field | Description |
|---|---|
id | Connector ID, prefixed with cn_. Use it to fetch, rotate, or delete the connector. |
webhookUrl | The URL you set as the Plivo Answer URL in the next step. It embeds the secret webhook key (whk_...). |
Copy the webhookUrl from the response. You will use it as the Answer URL in Step 2.
Anyone who has the webhook URL can route calls into your room, because the key is part of the URL. If it leaks, rotate the key to invalidate the old URL.
Step 2: Configure Plivo
Plivo routes calls through an application. Point the application's Answer URL at the webhookUrl from Step 1, then assign your number to that application.
- Open the Plivo Console and go to Voice > Applications > XML.
- Create or edit an application.
- Set the Answer URL to the
webhookUrl, with the method set to POST. - Save the application.
- Go to Phone Numbers > Numbers, open your number, and set its Plivo Application to the application you just configured.
- Save your changes.
That is the entire provider-side setup. When the number rings, Plivo posts to the Answer URL and VideoSDK replies with the <Stream> XML automatically.
Step 3: Route the Call
Routing decides which room a call joins. You have three options, from simplest to most flexible:
- Connector default. The
defaultRoomIdyou set in Step 1 sends every call to one fixed room. Best for a single destination or for testing. - Per-call override. Append a
roomIdquery parameter to the Answer URL (...whk_xxx?roomId=<roomId>) to target a specific room for that number. - Routing rules. For different callers or numbers landing in different rooms, or to attach an AI agent, create a routing rule and reference it with
defaultRuleId.
If you set defaultRoomId in Step 1, you can skip this step and move straight to testing.
Step 4: Test an Inbound Call
- Add a participant or AI agent to the target room, so there is audio to exchange.
- Call your Plivo number from any phone.
- Confirm that the caller hears the room and the room hears the caller.
If you registered lifecycle webhooks, you will see call-started, then call-answered, and finally call-hangup when the call ends. These are the quickest way to confirm the flow end to end.
Manage the Connector
List your connectors:
curl https://api.videosdk.live/v2/connectors \
-H "Authorization: Bearer $VIDEOSDK_TOKEN"
Fetch a single connector:
curl https://api.videosdk.live/v2/connectors/cn_b3p7q1m5x9k2r8v4 \
-H "Authorization: Bearer $VIDEOSDK_TOKEN"
Rotate the Webhook Key
Rotating the key invalidates the current webhook URL immediately and returns a new one. Update the Plivo Answer URL right after, or calls will stop reaching VideoSDK.
curl -X POST https://api.videosdk.live/v2/connectors/cn_b3p7q1m5x9k2r8v4/rotate-key \
-H "Authorization: Bearer $VIDEOSDK_TOKEN"
Delete a connector:
curl -X DELETE https://api.videosdk.live/v2/connectors/cn_b3p7q1m5x9k2r8v4 \
-H "Authorization: Bearer $VIDEOSDK_TOKEN"
Lifecycle Webhooks
To track calls on your server, register a webhook URL and listen for events such as call-started, call-answered, and call-hangup. Each request carries a videosdk-signature header (a base64 RSA-SHA256 signature of the body) so you can verify it. Connectors use the same webhook system as SIP, so see SIP Webhooks for the full event list, payloads, and registration.
Troubleshooting
| Symptom | Likely cause and fix |
|---|---|
| Call connects but there is no audio | No one is in the target room, or defaultRoomId is wrong. Add a participant or agent and verify the room ID. |
| Call hangs up right after answering | The number is not assigned to the application, or the Answer URL method is not POST. Recheck the application configuration and number assignment. |
| The stream never starts | The claim expired (more than 90 seconds), or routing resolved no room. Confirm the Answer URL is the current webhook URL and that a room is resolved. |
| Connector API calls return 401 or 403 | The Authorization token is missing or expired. See Generate a VideoSDK Token. |
| Audio works but quality is low | Telephony audio is 8 kHz narrowband μ-law by design. This is expected for PSTN calls. |
API Reference
Connector APIs used in this guide:
Got a Question? Ask us on discord

