Telephony Integration¶
La Suite Meet supports telephony integration via LiveKit's SIP bridge, allowing participants to join meetings by phone or connecting Meet rooms to PSTN (public telephone network) systems.
Use cases¶
- Dial-in: Phone users call a number to join a meeting
- Dial-out: The system calls a phone number to bring a PSTN participant into a room
- PBX integration: Connect Meet to your organization's PBX or UCaaS system
Architecture¶
LiveKit's SIP component handles SIP signaling and audio transcoding between the PSTN world (G.711/G.722 audio, SIP protocol) and the WebRTC world (Opus audio, WebRTC protocol).
Prerequisites¶
- LiveKit server 1.5+ with SIP enabled
- A SIP trunk from a VoIP provider (Twilio, Vonage, Infobip, or a self-hosted Asterisk/FreeSWITCH)
- SIP credentials (username, password, server address)
- A phone number (DID) from your VoIP provider
Enabling SIP in LiveKit¶
Add SIP configuration to your livekit-server.yaml:
LiveKit SIP also requires its own service. Add to compose.yml:
livekit-sip:
image: livekit/sip:latest
environment:
SIP_CONFIG_FILE: /sip-config.yaml
volumes:
- ./livekit-sip.yaml:/sip-config.yaml
ports:
- "5060:5060/udp" # SIP signaling
- "10000-20000:10000-20000/udp" # RTP media
depends_on:
- redis
- livekit
SIP service configuration¶
Create livekit-sip.yaml:
api_key: myapikey
api_secret: your-livekit-api-secret
ws_url: ws://livekit:7880
redis:
address: redis:6379
sip:
port: 5060
Configuring SIP trunks¶
Use the LiveKit CLI or API to configure SIP trunks:
Inbound trunk (for dial-in)¶
lk sip inbound create \
--url wss://meet.example.com:7880 \
--api-key myapikey \
--api-secret your-secret \
--numbers "+33123456789" \
--allowed-addresses "sip.twilio.com"
Or via the LiveKit API:
POST /twirp/livekit.SIP/CreateSIPInboundTrunk
{
"trunk": {
"numbers": ["+33123456789"],
"allowed_addresses": ["sip.twilio.com"],
"name": "Main dial-in number"
}
}
Outbound trunk (for dial-out)¶
lk sip outbound create \
--url wss://meet.example.com:7880 \
--api-key myapikey \
--api-secret your-secret \
--address "sip.twilio.com" \
--username "your-twilio-account-sid" \
--password "your-twilio-auth-token"
Dispatch rules¶
Dispatch rules define what happens when a call comes in on a trunk. For example: route all calls on number +33123456789 to a specific room.
lk sip dispatch create \
--url wss://meet.example.com:7880 \
--api-key myapikey \
--api-secret your-secret \
--trunk-id <inbound-trunk-id> \
--room my-meeting-room \
--pin 1234
With a PIN-based dispatch rule, callers dial the number and enter a PIN to join a specific room.
SIP provider setup (Twilio example)¶
- Create a Twilio account and obtain a phone number
- In Twilio console, create a SIP Trunk
- Configure the origination URI to point to your LiveKit SIP service:
sip:your-server.example.com:5060 - Use your Twilio account SID and auth token as the outbound trunk credentials
Firewall requirements¶
SIP and RTP require additional open ports:
| Port | Protocol | Purpose |
|---|---|---|
| 5060 | UDP | SIP signaling |
| 10000-20000 | UDP | RTP media (SIP audio) |
The RTP port range (10000-20000) must be open for telephony to work. This is in addition to LiveKit's standard WebRTC ports.
Audio quality notes¶
SIP telephone calls use narrowband audio (G.711, 8 kHz). This is noticeably lower quality than WebRTC participants (Opus, 48 kHz). LiveKit transcodes between the two transparently, but phone participants will always sound like a phone call.
Testing telephony¶
# Dial out to a phone from a room
lk sip participant create \
--url wss://meet.example.com:7880 \
--api-key myapikey \
--api-secret your-secret \
--room my-room \
--number "+33612345678"
Limitations¶
- SIP participants appear in the room as audio-only (no video)
- Reactions, chat, and screen sharing are not available to SIP participants
- Recording will capture SIP audio alongside WebRTC participants