The carriers section manages SIP providers and their phone numbers (DIDs). It comprises the carrier list, carrier create, and carrier detail screens, along with the DID modal and the in-app carrier help modal.

Carrier list

At /dashboard/carriers, the list loads GET /api/v1/carriers and the Exotel integration summary in parallel. It renders a DataTable with these columns:
ColumnSource
Namecarrier.name
SIP Addresscarrier.sip_address
AuthPassword and/or IP badges derived from auth_password / allowed_addresses
DIDscount of carrier.dids
CPSoutbound_cps/s · burst outbound_burst
LiveKitsync status badge (synced / error / pending)
Last Syncedrelative time of lk_last_synced_at
The page also has a Guide button (opens the carrier guide), an Add Carrier button, a search box (name or SIP address), and an Integrations card linking to the Exotel page. Rows link to /dashboard/carriers/:id.

Create a carrier

/dashboard/carriers/create collects three sections and POSTs to /api/v1/carriers:
  • Connection Settings — Name, SIP Address (validated against a host[:port] pattern), Transport (auto/tcp/udp/tls), Destination Country.
  • Authentication — Username, Password, Allowed IPs (tag input).
  • Rate Limiting — Outbound CPS (0.1–100), Outbound Burst (1–1000), Outbound Channels (1–500).
A banner notes that LiveKit trunks are created automatically after saving. On success the page navigates to the new carrier’s detail view.

Carrier detail

/dashboard/carriers/:id loads the carrier plus the bot list (for DID assignment). It has view and edit modes and these actions: Guide, Sync to LiveKit (POST /carriers/{id}/sync), Edit, and Delete (DELETE /carriers/{id}, which also deletes its DIDs). A sync banner shows the current lk_sync_status and, on error, hovers lk_sync_error. Edit mode adds inbound auth controls beyond create:
  • Inbound Authenticationcredentials (same as outbound) or ip (IP allowlist, no credentials). IP mode requires at least one allowed IP or the save is rejected.
  • Inbound IP Allowlist — required in IP mode, optional in credentials mode.
  • Password field stays blank and only updates when typed (avoids round-tripping the masked value).
Saving PUTs to /api/v1/carriers/{id}.

Phone numbers (DIDs)

The DIDs table lists Number, Label, Direction badge, and Assigned Bot, with edit/remove per row. DID operations call:
  • Add: POST /carriers/{id}/dids
  • Edit: PUT /carriers/{id}/dids/{did_id}
  • Remove: DELETE /carriers/{id}/dids/{did_id}

Add/Edit DID modal

The DID modal collects:
FieldNotes
Phone NumberE.164 (+14155551234) or carrier format (09XXXXXXXXX); disabled when editing
Labeloptional
Directioncard toggle: Both / Inbound / Outbound
Assign Botshown only for Both or Inbound; bot answers when the DID rings

Carrier guide

The carrier guide is an in-app help modal opened from the list and detail pages. It explains connection settings, two-direction authentication, pacing controls (CPS / Burst / Channels), DID directions, inbound and outbound call flows, the sync status indicator, and quick recipes for Plivo, Twilio, and Exotel.
The guide notes that Plivo typically needs IP-allowlist inbound auth (it does not send digest credentials by default), while Twilio works with shared credentials. Exotel is handled by its own built-in integration, not this SIP carriers page.

Exotel

The separate Exotel integration page.

Fleet

Worker pool health and capacity.

Carriers and trunks

How the CXB API syncs carriers to LiveKit trunks.

SIP dialout

Outbound dialing path and trunk selection.