Caller → Bulk → LiveKit
A caller dials your Bulk DID. Our SBCs send the INVITE to your LiveKit SIP URI. A LiveKit inbound trunk and dispatch rule place the caller in a room or hand the call to an agent.
IP-based SIP interconnection guide for LiveKit Cloud.
Use your Bulk Solutions IP-authenticated SIP trunks with LiveKit Cloud so PSTN callers can reach LiveKit rooms and agents, and LiveKit can place outbound calls on our network.
LiveKit Cloud does not SIP-register to Bulk Solutions. Both sides use IP-based peering and hostname routing.
A caller dials your Bulk DID. Our SBCs send the INVITE to your LiveKit SIP URI. A LiveKit inbound trunk and dispatch rule place the caller in a room or hand the call to an agent.
Your application calls LiveKit CreateSIPParticipant. LiveKit sends the INVITE to sip.bulkvs.com. We authenticate the source IP and terminate the call on the PSTN.
| Item | Value |
|---|---|
| SIP proxy / SRV | sip.bulkvs.com |
| SIP port | 5060 (UDP and TCP) |
| Codecs | G.711u (PCMU), G.729a, T.38 pass-through where available |
| DTMF | RFC2833 and inband (G.711u) |
| Bulk signaling IPs | x.x.x.x - find IPs in our portal -> interconnection guide -> IP Based Authentication |
| Authentication | IP-based (no SIP REGISTER required) |
Have these ready from both portals. Replace the examples with your own project and numbers.
sip:YOURSUBDOMAIN.sip.livekit.cloudYOURSUBDOMAIN.sip.livekit.cloud3109060901 / +13109060901lk cloud auth after installing the LiveKit CLI*.livekit.cloud without .sip). Sending INVITEs to the wrong host returns 404 No trunk found.
Route calls that arrive on your Bulk DID into LiveKit rooms or voice agents.
In LiveKit Cloud go to Telephony → SIP trunks → Create new trunk, choose Inbound, then paste:
{
"name": "Bulk inbound",
"numbers": [
"+13109060901",
"13109060901"
],
"allowedAddresses": [
"x.x.x.x - find IPs in our portal -> interconnection guide -> IP Based Authentication",
"",
""
]
}
Include both number formats. Bulk sends the request URI as 1NXXNXXXXXX (example 13109060901). LiveKit often matches E.164 with a plus. Listing both avoids a trunk miss.
Do not set a SIP username or password on this trunk. Bulk inbound IP authentication does not send digest credentials.
numbers only and ask LiveKit to turn on IP allowlisting.
A trunk alone is not enough. A dispatch rule tells LiveKit which room to create. In Telephony → Dispatch rules:
{
"name": "Bulk inbound dispatch",
"rule": {
"dispatchRuleIndividual": {
"roomPrefix": "call-"
}
}
}
To send every inbound call to a LiveKit agent, add roomConfig.agents and set agentName to your worker name.
In the Bulk Solutions portal:
YOURSUBDOMAIN.sip.livekit.cloud, port 5060. Prefer the hostname over a frozen A-record IP. LiveKit Cloud addresses can change.Inbound calls are sent from one of our signaling IPs to your LiveKit host with request URI 1NXXNXXXXXX.
If you want signaling to stay in the United States, use:
YOURSUBDOMAIN.us.sip.livekit.cloud
Allow LiveKit Cloud to originate calls through Bulk Solutions.
LiveKit Cloud publishes static ranges for SIP signaling and media in US and several other regions. Add these as hosts in Interconnection → Host → Add, then wait 2–3 minutes:
143.223.88.0/21
161.115.160.0/19
153.57.128.0/18
If the portal does not accept CIDR notation, contact support@bulkvs.com and we will add the ranges on your account.
In LiveKit Cloud go to Telephony → SIP trunks → Create new trunk, choose Outbound:
{
"name": "Bulk outbound",
"address": "sip.bulkvs.com",
"numbers": [
"+13109060901"
]
}
Use the hostname sip.bulkvs.com, not a single Bulk IP. Leave username and password empty for IP authentication. Save the trunk ID (ST_…) for API calls.
Create a SIP participant. Example CLI payload:
{
"sip_trunk_id": "ST_xxxxxxxxxxxx",
"sip_call_to": "+13105551212",
"room_name": "outbound-test",
"participant_identity": "bulk-test",
"wait_until_answered": true
}
Bulk accepts destinations as 1NXXNXXXXXX@sip.bulkvs.com or NXXNXXXXXX@sip.bulkvs.com.
Set LiveKit numbers / sip_number to a number on your Bulk account in one of these formats. Any other caller ID format is rejected:
| Format | Example |
|---|---|
| 10 digits | 3109060901 |
| 11 digits | 13109060901 |
| E.164 | +13109060901 |
Emergency calling uses the same outbound trunk. Caller ID must be a provisioned 10-digit, 11-digit, or +E.164 number.
| Purpose | Send the call to |
|---|---|
| Emergency | 911@sip.bulkvs.com |
| Verify the address currently in the 911 database | 922@sip.bulkvs.com or 933@sip.bulkvs.com |
call-… exists.CreateSIPParticipant to a number you control.922@sip.bulkvs.com to verify E911 data.| Symptom | What to check |
|---|---|
| No INVITE in LiveKit | Bulk host, trunk group, and DID assignment. Wait for 2–3 minute propagation. Confirm the host is the project SIP URI. |
404 No trunk found | Number format mismatch. Add both +1NXXNXXXXXX and 1NXXNXXXXXX to the inbound trunk. Confirm you used the SIP URI, not the LiveKit WebSocket URL. |
| Inbound 403 / ignored | LiveKit allowedAddresses missing our three SBC IPs, or INVITE sent to the wrong project subdomain. |
| Outbound 403 from Bulk | LiveKit source IP is not on your Bulk host list. Add the LiveKit static ranges. |
| Outbound rejected caller ID | From number is not 10-digit, 11-digit, or +1 E.164. |
| Call connects with no audio | Allow SIP media from LiveKit static ranges. Confirm codec negotiation includes G.711u or G.729a. |
| Inbound works, then later fails | The Bulk host was a single resolved LiveKit IP that changed. Switch the host to the LiveKit FQDN. |
If you get stuck on either side of the trunk, send us the DID, LiveKit SIP URI, approximate call time, and a Call-ID. We can pull the SIP ladder from our network.
LiveKit Cloud documentation for trunks and dispatch rules is at docs.livekit.io/telephony.