Skip to content
Plivo integration

Connect a Plivo SIP trunk to Wixzel Voice

To run an AI voice agent on a Plivo number, connect Plivo Zentrunk to Wixzel Voice: add the platform_ip your trunk returns to the IP Access Control List so outbound calls are accepted, and set the Primary URI to 95.216.218.102:5090 so inbound calls arrive. That is the host and port in the trunk's origination_uri; a bare IP would mean port 5060, where nothing listens. Plivo keeps billing you for the line at your rates; Wixzel Voice bills the voice engine per second from a prepaid balance.

Last updated

Published

Plivo is the carrier; Wixzel Voice is the voice AI API that runs the agent on top of it. They work together over standard SIP. Plivo is a trademark of its owner, and Wixzel Voice is not affiliated with or endorsed by Plivo.

What do you need before you start?

  • A Plivo account with Zentrunk, and the host and credentials of the trunk.
  • A phone number you own at Plivo, attached to that trunk. Wixzel Voice does not sell or port numbers.
  • A Wixzel Voice API key and some prepaid credit. The minimum top-up is $5; there is no free tier.
  • Wixzel Voice is in alpha and runs 5 concurrent calls per account by default, raised on request; web and app sessions count toward the same limit.

How do you create the Plivo trunk in Wixzel Voice?

The termination address Plivo shows for the outbound trunk. The setup guide does not print a Plivo host, so copy it from the console.

cURL
curl https://api.voice.wixzel.com/v1/sip-trunks \
  -H "Authorization: Bearer $WIXZEL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Plivo",
    "host": "<the SIP host of your Zentrunk outbound trunk>",
    "transport": "udp"
  }'

Add username and password to the body if Plivo authenticates by credentials rather than IP. The password is encrypted at rest and never returned by the API again. The response carries platform_ip and origination_uri: the two values the next step needs.

What do you set at Plivo?

SettingWhat Plivo calls itValue
Allowlist calls from Wixzel VoiceIP Access Control List95.216.218.102
Send inbound calls to Wixzel VoicePrimary URI95.216.218.102:5090

Both values are today's: read platform_ip and origination_uri from GET /v1/sip-trunks rather than copying them from a page. Then register each number on the trunk with POST /v1/phone-numbers and give it an inbound_agent_id, so an agent answers it. The AI phone call API walkthrough has those requests, and the full setup steps for Plivo go through the console field by field.

What goes wrong on Plivo?

  • Zentrunk models the two directions as two separate objects, and you need both. Creating only the outbound trunk is the usual cause of "outbound works, inbound never rings".

Why did a call over Plivo not connect?

A call Plivo refused has status: "failed", a failure_code (the Q.850 cause from the carrier) and a failure_reason saying what to do, and it costs nothing. Every failure code, every refusal and how to debug a trunk are on the integrations page.

What does an AI call over Plivo cost?

Plivo bills you for the line at your rates; Wixzel Voice bills only the voice engine, per second of actual usage, from $0.0466 per connected minute on gemini-live to $0.1851 on deepgram-agent. Every engine's price.

Frequently asked questions

Why do outbound calls work on Plivo but inbound calls never ring?
Plivo Zentrunk has separate outbound and inbound trunk objects. Outbound calls only need the outbound trunk; inbound calls need an inbound trunk too, with its Primary URI set to the host and port in the origination_uri your Wixzel Voice trunk returns (95.216.218.102:5090 today), and each number needs an inbound_agent_id.
Can I use a Plivo Credentials List instead of an IP ACL?
Yes. Put the Credentials List username and password on the Wixzel Voice trunk's username and password fields, and Plivo authenticates the digest rather than the source address. The password is encrypted at rest and never returned by the API again.

Other carriers