Get every WebRTC softphone call to connect — even from corporate firewalls, hotel Wi-Fi, and mobile carriers. 1 TB free, 5 TB for $9/month.
Your QA tests pass. Browser-to-browser SIP calls connect cleanly when both peers sit on the same Wi-Fi. Then a real customer calls in from a phone tethered to a mobile carrier, or a remote worker behind a corporate firewall, and the call rings — but there's silence. One-way audio. ICE failed. The browser couldn't establish a media path because the user is behind symmetric NAT, carrier-grade NAT, or a firewall that blocks UDP entirely.
This is why every production VoIP/SIP deployment needs a TURN server. STUN alone covers maybe 80% of users. The remaining 20% — the ones on hotel Wi-Fi, in conference centers, or on locked-down corporate networks — need a relay.
Drop these credentials into your existing JsSIP or SIP.js config. No SIP signaling change needed — TURN only handles the media path.
const ua = new JsSIP.UA({
uri: 'sip:alice@your-pbx.example.com',
password: 'secret',
sockets: [new JsSIP.WebSocketInterface('wss://your-pbx.example.com:7443')],
pcConfig: {
iceServers: [
{ urls: 'stun:stun.expressturn.com:3478' },
{
urls: [
'turn:relay1.expressturn.com:3478?transport=udp',
'turn:relay1.expressturn.com:3478?transport=tcp',
'turns:relay1.expressturn.com:443?transport=tcp'
],
username: 'YOUR_EXPRESSTURN_USERNAME',
credential: 'YOUR_EXPRESSTURN_PASSWORD'
}
],
iceTransportPolicy: 'all'
}
});
If you're running FreeSWITCH with mod_verto or Asterisk with chan_pjsip and a browser-based softphone, the TURN configuration lives in the browser client, not the PBX. The same iceServers array above works for verto.js, sipML5, or any custom WebRTC SIP client. Your PBX never talks to the TURN server directly.
For server-side WebRTC endpoints (e.g. an Asterisk-as-WebRTC-gateway pattern where the PBX itself terminates the WebRTC leg), point Asterisk's rtp.conf at your public IP and use STUN — TURN is for the browser side, not the PBX side.
To verify TURN is actually working in your dev environment (not just falling back silently to host candidates), set iceTransportPolicy: 'relay' in your RTCPeerConnection config. Every call will then be forced through TURN, surfacing credential or routing problems immediately.
Most VoIP teams stay on the free plan during development and hit premium when their first hundred or so paying customers come online. Cancel any time, 30-day refund.
Do I need a TURN server for SIP over WebRTC?
Yes if any of your users are behind symmetric NAT, mobile carrier-grade NAT, or restrictive corporate firewalls. STUN alone fails in those cases and the call drops or stays one-way audio. A TURN server relays the media so the call connects.
Does ExpressTURN work with FreeSWITCH and Asterisk?
ExpressTURN provides standard RFC 5766/8656 TURN. Any SIP softphone or browser-based WebRTC client that connects to FreeSWITCH or Asterisk can use ExpressTURN as its ICE server. The TURN server only relays media; it does not need to know about your SIP signaling.
Which port should my softphone use?
Port 3478 (UDP and TCP) is the default. For users on networks that block 3478, use TURN over TCP on 80 or TURN over TLS on 443 — these traverse virtually all corporate firewalls.
How much bandwidth does a TURN call use?
An Opus voice call uses about 30–40 kbps each direction, so roughly 30 MB per hour for both legs combined when relayed through TURN. The free 1 TB plan supports about 33,000 hours of relayed voice. Premium 5 TB supports about 165,000 hours.
Ready to fix the calls that don't connect?
Sign Up — Free 1 TB/monthRelated: TURN for live streaming · TURN for telehealth · JsSIP + Asterisk integration recipe · vs Twilio Network Traversal