Connect LiveKit to Bitcall (Outbound SIP Trunk)
Connect LiveKit to Bitcall (Outbound SIP Trunk)
Use Bitcall as the outbound SIP trunk for a LiveKit voice agent. Create a SIP outbound trunk (address, numbers, auth), then dial out with createsipparticipant.

Before you begin
💡 Heads-up: Bitcall is outbound-only today — a clean fit for LiveKit agents that place calls. Works with self-hosted LiveKit or LiveKit Cloud. Inbound numbers (DIDs) are coming soon.
"LiveKit runs your real-time agent. Bitcall is the outbound trunk it dials through." 🤖📞
🧰 What You'll Need
- A LiveKit project (self-hosted or LiveKit Cloud) with the
lkCLI installed, or dashboard access - A Bitcall SIP account (username + password) — see Set Up Your First SIP Account
- An outbound Caller ID (CLI) you're allowed to present, in E.164
- A little Bitcall balance (prepaid)
🔑 Step 1: Get Your Bitcall SIP Details
| Setting | Value |
|---|---|
| SIP address (trunk domain) | gateway.bitcall.io |
| Port | 5060 |
| Auth | SIP username + password |
➕ Step 2: Create a SIP Outbound Trunk
LiveKit dials out through a SIP outbound trunk that holds your provider endpoint and credentials. Create outbound-trunk.json:
{
"trunk": {
"name": "Bitcall Outbound Trunk",
"address": "gateway.bitcall.io",
"numbers": ["YOUR_OUTBOUND_CALLER_ID"],
"auth_username": "YOUR_BITCALL_SIP_USERNAME",
"auth_password": "YOUR_BITCALL_SIP_PASSWORD"
}
}
Then create it with the CLI:
lk sip outbound create outbound-trunk.json
📋 Copy the returned Trunk ID — you'll need it to place calls.
addressis your Bitcall SIP host (gateway.bitcall.io).numbersis the outbound Caller ID you present (not a Bitcall DID — Bitcall is outbound-only).- On LiveKit Cloud, you can do the same from Telephony → SIP trunks → Create new trunk → JSON editor → Outbound.
- Optional: set
destination_countryto originate from a region close to where you're calling.
🎭 Step 3: Set Your Caller ID (CLI)
Caller-ID behavior depends on the destination country and operator rules: Change or Manage Your Caller ID.
🚀 Step 4: Place an Outbound Call
Dial a number into a room using the trunk (CLI shown; the same exists in the SDKs via create_sip_participant):
lk sip participant create \
--room "my-room" \
--trunk "YOUR_TRUNK_ID" \
--call "NUMBER_YOU_ARE_CALLING" \
--identity "outbound-caller"
For an AI agent, dispatch your LiveKit Agent into the room, then create the SIP participant to dial the user — see LiveKit's "outbound calls" agent guide. 📞🎉
🛠️ Troubleshooting Table
| Problem | Likely cause & fix |
|---|---|
CreateSIPParticipant fails immediately |
The trunk's auth was rejected by Bitcall — re-check auth_username / auth_password and address. |
| Connected but no audio / one-way | Media-path / NAT issue. Verify your LiveKit SIP service networking and firewall. See AI voice calls dropping after 30 seconds. |
| Call drops after ~30–60 seconds | RTP inactivity during the agent's thinking gaps → RTP keepalives + raise the timeout. See AI voice calls dropping after 30 seconds. |
| Caller ID wrong / missing | CLI rules vary by destination. See Change or Manage Your Caller ID. |
| Can't dial a country | Ensure the number is +E.164, your balance is funded, and the route is enabled. |
🧠 TL;DR Recap
✅ Create a SIP outbound trunk: address = gateway.bitcall.io, numbers = [your CLI], plus your SIP username/password
✅ lk sip outbound create (or LiveKit Cloud JSON editor) → copy the Trunk ID
✅ Dial with lk sip participant create / create_sip_participant, agent dispatched into the room ☕
Related: SIP trunking for AI voice agents (full explainer) · AI voice calls dropping after 30 seconds · Set Up Your First SIP Account
Connect ElevenLabs to Bitcall (Outbound SIP Trunk)
No next post
On This Page
Before you begin
🧰 What You'll Need
🔑 Step 1: Get Your Bitcall SIP Details
➕ Step 2: Create a SIP Outbound Trunk
🎭 Step 3: Set Your Caller ID (CLI)
🚀 Step 4: Place an Outbound Call
🛠️ Troubleshooting Table
🧠 TL;DR Recap