Connect Vapi to Bitcall (Outbound SIP Trunk)
Connect Vapi to Bitcall (Outbound SIP Trunk)
Use Bitcall as the outbound SIP trunk for your Vapi voice agent. Step-by-step: create credentials, add a BYO SIP trunk in Vapi, set caller ID, and test an outbound call.

Before you begin (outbound-only today)
💡 Heads-up: Bitcall is outbound-only today — perfect for Vapi agents that make calls (sales, reminders, surveys, notifications). Inbound numbers (DIDs) are coming soon, and we'll add inbound steps here when they land.
Your Vapi agent does the talking. Bitcall makes sure the call actually reaches a phone. Let's connect them — the outbound way.
🧰 What you'll need
- A Vapi account with access to the dashboard and a private API key
- A Bitcall account with a SIP account (username + password) — see Set Up Your First SIP Account
- An outbound Caller ID (CLI) you're allowed to present (number rules depend on the destination country and operator)
- A little Bitcall balance (prepaid — top up with card, PayPal, or crypto)
🔑 Step 1: Get your Bitcall SIP details
From your Bitcall SIP account, you'll use:
| Setting | Value |
|---|---|
| SIP domain (gateway) | gateway.bitcall.io |
| Port | 5060 |
| Transport | UDP (TCP/TLS also supported, via the domain) |
| Auth | Your SIP username and password |
⚠️ Use username/password authentication, not IP auth. Vapi's own docs note that IP-based auth can misroute on shared SIP servers and is only reliable when a provider gives a dedicated SIP server or unique termination URI. Username/password is the clean path for Bitcall.
➕ Step 2: Create a BYO SIP trunk in Vapi
Vapi connects to outside carriers using a credential of type byo-sip-trunk. Create it with your Bitcall details (API method shown — there's also a SIP Trunk section in the Vapi dashboard):
curl -X POST "https://api.vapi.ai/credential" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_VAPI_PRIVATE_KEY" \
-d '{
"provider": "byo-sip-trunk",
"name": "Bitcall Outbound Trunk",
"gateways": [{
"ip": "gateway.bitcall.io",
"inboundEnabled": false
}],
"outboundLeadingPlusEnabled": true,
"outboundAuthenticationPlan": {
"authUsername": "YOUR_BITCALL_SIP_USERNAME",
"authPassword": "YOUR_BITCALL_SIP_PASSWORD"
}
}'
📋 Save the returned Credential ID — you'll need it in the next step.
Note:
inboundEnabledis set tofalsebecause Bitcall handles outbound today.outboundLeadingPlusEnabledkeeps numbers in+E.164format on the way out.
📇 Step 3: Register your outbound Caller ID
Vapi needs a "phone number" resource to use as the caller ID (from-number) on outbound calls. Since Bitcall is outbound-only, this is the CLI you want to display — not a Bitcall DID.
curl -X POST "https://api.vapi.ai/phone-number" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_VAPI_PRIVATE_KEY" \
-d '{
"provider": "byo-phone-number",
"name": "Bitcall Outbound CLI",
"number": "YOUR_OUTBOUND_CALLER_ID",
"numberE164CheckEnabled": false,
"credentialId": "YOUR_CREDENTIAL_ID"
}'
📋 Save the returned Phone Number ID for your test call.
🎭 Step 4: Set your Caller ID rules
Caller ID on outbound calls depends on the destination country and operator rules — some routes pass your CLI through, some override or sanitize it. Set and manage your CLI here: Change or Manage Your Caller ID.
🎲 Want to rotate caller IDs across a campaign? You can present different CLIs per call from your agent logic.
🚀 Step 5: Place a test outbound call
From the Vapi dashboard, or via the API:
curl -X POST "https://api.vapi.ai/call/phone" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_VAPI_PRIVATE_KEY" \
-d '{
"assistantId": "YOUR_ASSISTANT_ID",
"customer": { "number": "NUMBER_YOU_ARE_CALLING", "numberE164CheckEnabled": false },
"phoneNumberId": "YOUR_PHONE_NUMBER_ID"
}'
📞 Ring… ring… your Vapi agent is now dialling out through Bitcall. 🎉
🛠️ Troubleshooting
| Problem | Likely cause & fix |
|---|---|
401 Unauthorized on outbound |
Wrong SIP username/password, or the trunk is set to IP auth. Use username/password and re-check credentials. |
| Call connects but agent is silent / one-way audio | RTP isn't reaching Vapi's media server — usually a NAT/firewall or SDP issue. |
| Call drops after ~30–60 seconds | RTP inactivity during the agent's "thinking" gaps. Enable RTP keepalives / comfort noise and raise the RTP timeout. |
| Caller ID not showing or rejected | CLI rules vary by destination/operator. Check Change or Manage Your Caller ID. |
| Can't dial a country | Make sure the number is in +E.164 format, your balance is funded, and the route is enabled for that destination. |
🧠 TL;DR recap
✅ Get your Bitcall SIP username/password (gateway.bitcall.io:5060)
✅ Create a byo-sip-trunk credential in Vapi (username/password auth, inboundEnabled: false)
✅ Register your outbound Caller ID as a byo-phone-number
✅ Set CLI rules, top up, and place a test outbound call ☕
Related: SIP trunking for AI voice agents (full guide) · Set Up Your First SIP Account · Change or Manage Your Caller ID
No previous post
AI Voice Calls Dropping After 30 Seconds? The RTP Keepalive Fix
On This Page
Before you begin (outbound-only today)
🧰 What you'll need
🔑 Step 1: Get your Bitcall SIP details
➕ Step 2: Create a BYO SIP trunk in Vapi
📇 Step 3: Register your outbound Caller ID
🎭 Step 4: Set your Caller ID rules
🚀 Step 5: Place a test outbound call
🛠️ Troubleshooting
🧠 TL;DR recap