Bulk Solutions / Livekit - IP Based Authentication

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.

IP-based authentication Inbound + outbound sip.bulkvs.com UDP/TCP 5060 G.711u · G.729a · RFC2833

How the integration works

LiveKit Cloud does not SIP-register to Bulk Solutions. Both sides use IP-based peering and hostname routing.

Inbound

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.

Outbound

LiveKit → Bulk → PSTN

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.

Shared SIP settings

ItemValue
SIP proxy / SRVsip.bulkvs.com
SIP port5060 (UDP and TCP)
CodecsG.711u (PCMU), G.729a, T.38 pass-through where available
DTMFRFC2833 and inband (G.711u)
Bulk signaling IPsx.x.x.x - find IPs in our portal -> interconnection guide -> IP Based Authentication
AuthenticationIP-based (no SIP REGISTER required)

Values to collect before you start

Have these ready from both portals. Replace the examples with your own project and numbers.

LiveKit SIP URI
LiveKit Cloud → Settings → Project. Example: sip:YOURSUBDOMAIN.sip.livekit.cloud
LiveKit SIP host
Same host without the scheme: YOURSUBDOMAIN.sip.livekit.cloud
Your Bulk DID
Example used below: 3109060901 / +13109060901
LiveKit CLI (optional)
lk cloud auth after installing the LiveKit CLI
Use the SIP URI from project settings, not the WebSocket project URL (*.livekit.cloud without .sip). Sending INVITEs to the wrong host returns 404 No trunk found.

Inbound setup

Route calls that arrive on your Bulk DID into LiveKit rooms or voice agents.

  1. Create a LiveKit inbound trunk

    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.

    allowedAddresses: this field may need to be enabled on your LiveKit project by LiveKit support. If the dashboard rejects it, create the trunk with numbers only and ask LiveKit to turn on IP allowlisting.
  2. Create a LiveKit dispatch rule

    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.

  3. Point the Bulk DID at LiveKit

    In the Bulk Solutions portal:

    1. Interconnection → Host → Add your LiveKit SIP host: YOURSUBDOMAIN.sip.livekit.cloud, port 5060. Prefer the hostname over a frozen A-record IP. LiveKit Cloud addresses can change.
    2. If your portal screen only accepts IPv4, add the current resolved addresses and contact Bulk support so we can attach the FQDN for you.
    3. Interconnection → Trunk Group → Add and assign that host to the trunk group.
    4. Inbound → DIDs → Manage and set your telephone number to that trunk group.
    5. Wait 2–3 minutes for the host and trunk group to propagate to all Bulk SBC nodes.

    Inbound calls are sent from one of our signaling IPs to your LiveKit host with request URI 1NXXNXXXXXX.

  4. Optional: pin inbound to the US LiveKit region

    If you want signaling to stay in the United States, use:

    YOURSUBDOMAIN.us.sip.livekit.cloud

Outbound setup

Allow LiveKit Cloud to originate calls through Bulk Solutions.

  1. Allow LiveKit source IPs in Bulk

    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.

  2. Create a LiveKit outbound trunk

    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.

  3. Place a call from LiveKit

    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.

Caller ID rules

Set LiveKit numbers / sip_number to a number on your Bulk account in one of these formats. Any other caller ID format is rejected:

FormatExample
10 digits3109060901
11 digits13109060901
E.164+13109060901

E911

Emergency calling uses the same outbound trunk. Caller ID must be a provisioned 10-digit, 11-digit, or +E.164 number.

PurposeSend the call to
Emergency911@sip.bulkvs.com
Verify the address currently in the 911 database922@sip.bulkvs.com or 933@sip.bulkvs.com
Do not use 911 for connectivity tests. Use 922 or 933 to confirm the address on file, then place a live 911 call only when required.

Test plan

Inbound

  1. Dial your Bulk DID from a mobile phone.
  2. Open LiveKit Cloud → Telephony → Calls.
  3. Confirm an INVITE arrived, a SIP participant was created, and a room named call-… exists.
  4. Confirm two-way audio with G.711u or G.729a.

Outbound

  1. Run CreateSIPParticipant to a number you control.
  2. Answer the call and confirm caller ID is your Bulk DID.
  3. Send DTMF if your app uses menus (RFC2833).
  4. Optionally call 922@sip.bulkvs.com to verify E911 data.

Troubleshooting

SymptomWhat to check
No INVITE in LiveKitBulk host, trunk group, and DID assignment. Wait for 2–3 minute propagation. Confirm the host is the project SIP URI.
404 No trunk foundNumber format mismatch. Add both +1NXXNXXXXXX and 1NXXNXXXXXX to the inbound trunk. Confirm you used the SIP URI, not the LiveKit WebSocket URL.
Inbound 403 / ignoredLiveKit allowedAddresses missing our three SBC IPs, or INVITE sent to the wrong project subdomain.
Outbound 403 from BulkLiveKit source IP is not on your Bulk host list. Add the LiveKit static ranges.
Outbound rejected caller IDFrom number is not 10-digit, 11-digit, or +1 E.164.
Call connects with no audioAllow SIP media from LiveKit static ranges. Confirm codec negotiation includes G.711u or G.729a.
Inbound works, then later failsThe Bulk host was a single resolved LiveKit IP that changed. Switch the host to the LiveKit FQDN.

Need help?

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.

Bulk Solutions support
Phone: 855-906-0901 or 310-906-0901
Email: support@bulkvs.com
Portal: interconnection, trunk groups, and DIDs

LiveKit Cloud documentation for trunks and dispatch rules is at docs.livekit.io/telephony.