billions-grass-55145
12/19/2025, 9:59 AMtall-airline-16756
12/19/2025, 9:59 AMtall-airline-16756
12/19/2025, 9:59 AM0.0.0.0/0). LiveKit recommends this when static IPs are not available.
To move forward, please tell me:
1. Are you configuring the trunk now in LiveKit or already configured it in Exotel?
2. Does Exotel allow credential-based auth (username/password or SIP digest) or only static-IP whitelisting?
If you want, I can provide the exact LiveKit docs link and the recommended config steps for credential auth.
Sources: SIP outbound trunk | LiveKit docs | SIP overview | LiveKit docsbillions-grass-55145
12/19/2025, 10:02 AMtall-airline-16756
12/19/2025, 10:02 AM0.0.0.0/0) for your trunk while relying on other controls (they must accept this to route calls from LiveKit).
• Use a SIP provider that supports credential-based auth or static outbound IPs if Exotel cannot change policy.
Which would you like help with?
• I can confirm the exact FQDN to give Exotel if you share your LiveKit tenant/region or desired trunk hostname.
• Or I can draft wording you can send to Exotel asking whether they support FQDN/DNS allowlisting or a temporary 0.0.0.0/0 exception.billions-grass-55145
12/19/2025, 10:04 AMtall-airline-16756
12/19/2025, 10:04 AM0.0.0.0/0) for the trunk while you validate calls — then tighten controls if possible.
• Switch to a SIP provider that supports static IPs or credential-based auth if Exotel’s policy cannot change.
Which option would you like me to help with? If you want the FQDN drafted for Exotel, tell me the subdomain you plan to use and the SIP transport (UDP/TCP/TLS).
Sources: SIP outbound trunk | LiveKit docs | SIP cloud and region pinning | LiveKit docsbillions-grass-55145
12/19/2025, 1:05 PMtall-airline-16756
12/19/2025, 1:05 PM0.0.0.0/0) for the trunk while you validate calls.
• If neither option is possible, consider using a SIP provider that offers static egress IPs or credential-based auth.
If you want, tell me the exact SIP URI shown in your dashboard and the transport (UDP/TCP/TLS) and I’ll draft the exact message you can send to Exotel. Which would you prefer?billions-grass-55145
12/19/2025, 1:12 PMtall-airline-16756
12/19/2025, 1:12 PM0.0.0.0/0) for the trunk — otherwise the trunk won’t be reachable from LiveKit.
• If neither option is possible, you’ll need a SIP provider that offers static egress IPs or credential-based auth.
If you want, tell me the exact subdomain shown in your dashboard and the transport (UDP/TCP/TLS) and I’ll draft the exact text you can send to Exotel.billions-grass-55145
12/19/2025, 1:14 PMtall-airline-16756
12/19/2025, 1:14 PM<your-subdomain>.india.sip.livekit.cloud) instead of IPs.
2. Test sequence:
◦ Configure LiveKit trunk with SIP_TRANSPORT_AUTO or UDP and test calls.
◦ If you see registration/INVITE failures, switch to TCP and retest.
◦ If you require encryption, enable TLS and verify certificates with Exotel.
1. If Exotel refuses FQDN/DNS allowlisting and only accepts static IP ranges, explain that LiveKit does not offer static egress IPs — you will need either Exotel to allow FQDN/DNS or a different SIP provider.
If you want, tell me:
• The exact subdomain shown in your dashboard and which transport you prefer to test first — I’ll draft the exact message to send to Exotel and provide the LiveKit transport config snippet. Sources: SIP outbound trunk | LiveKit docs | SIP APIs | LiveKit docs | Secure trunking | LiveKit docs | Create and configure a Plivo SIP trunk | LiveKit docsbillions-grass-55145
12/19/2025, 1:18 PMtall-airline-16756
12/19/2025, 1:18 PM<subdomain>.india.sip.livekit.cloud).
• Shorten or localize the message for Exotel support channels (ticket, chat, or email). Which would you prefer?billions-grass-55145
12/19/2025, 1:20 PMtall-airline-16756
12/19/2025, 1:21 PMbillions-grass-55145
12/23/2025, 4:45 AMtall-airline-16756
12/23/2025, 4:46 AM5njt9qbiof7.sip.livekit.cloud (or support FQDN/DNS allowlisting) and to permit UDP/TCP on port 5060 (and TLS 5061 if they require it).
• Test with Exotel using UDP first; if signaling fails, try TCP. If Exotel insists on strict IP-only allowlisting, you’ll need a provider that supports static egress IPs or consider self-hosting.
If you want, I’ll send a one-line message you can forward to Exotel now. Which transport do you want to state as preferred (UDP or TCP)?
Sources: Making calls overview | LiveKit docs | Self-hosted SIP server | LiveKit docs | Agents telephony integration | LiveKit docs | Outbound Calling Script | LiveKit docs | Ports and firewall | LiveKit docsbillions-grass-55145
12/23/2025, 11:03 AMtall-airline-16756
12/23/2025, 11:04 AMaddress. For Exotel that is typically:
sbc.exotel.com
Example JSON for the outbound trunk (replace credentials as needed):
{
"outbound": {
"address": "<http://sbc.exotel.com|sbc.exotel.com>"
},
"credentials": {
"username": "your_exotel_username",
"password": "your_exotel_password"
}
}
Notes:
• LiveKit does not let you force UDP/TCP/TLS; LiveKit will attempt UDP then fall back to TCP. Tell Exotel to accept UDP/TCP on port 5060 (and TLS 5061 if they require it).
• Provide Exotel the FQDN from your dashboard (5njt9qbiof7.sip.livekit.cloud) and ask if they can allowlist by FQDN/DNS. If they insist on IP-only whitelisting, Exotel will need to confirm acceptable CIDR ranges or you’ll need a provider with static egress IPs. Sources: sip | livekit/livekit_composite | DeepWiki | Agents telephony integration | LiveKit docs | Ports and firewall | LiveKit docsbillions-grass-55145
12/23/2025, 11:06 AMtall-airline-16756
12/23/2025, 11:07 AMaddress field: <http://sbc.exotel.com|sbc.exotel.com>.
Steps to check and try (in order)
1. Set address to <http://sbc.exotel.com|sbc.exotel.com> (FQDN). Example JSON:
{
"outbound": {
"address": "<http://sbc.exotel.com|sbc.exotel.com>"
}
}
1. Confirm Exotel has explicitly allowlisted 5njt9qbiof7.sip.livekit.cloud (the dashboard FQDN) — IPs may not match their FQDN rule if you used an IP earlier.
2. Ask Exotel to check their logs for incoming SIP INVITEs from your FQDN at the time you call (give them timestamp). If they see no INVITE, the request isn’t reaching Exotel.
3. From LiveKit side, verify DNS resolution and connectivity:
◦ Ensure LiveKit can resolve <http://sbc.exotel.com|sbc.exotel.com>.
◦ If you can run a traceroute or DNS lookup from an environment that mirrors LiveKit egress, verify the A records and that port 5060 (UDP/TCP) is reachable.
1. Confirm transport/port Exotel expects (UDP 5060 / TCP 5060 / TLS 5061). LiveKit will try UDP then TCP; TLS isn’t selectable from the dashboard.
2. Verify any credentials or SIP headers Exotel requires (auth username, realm, From/Contact formats). Wrong auth/headers can cause silent drops.
3. Check LiveKit outbound logs for the call attempt (include timestamps) and share relevant INVITE/response snippets if available.
If you’d like, I can:
• Draft a brief message for Exotel asking them to check for INVITEs (include timestamp) and confirm which transport/port and exact FQDN they expect.
• Review any LiveKit logs/INVITE snippets you paste here and point out mismatches (transport, host, SIP headers).
Which would you prefer?
Sources: Agents telephony integration | LiveKit docs | Examples | livekit/livekit_composite | DeepWiki | Making calls overview | LiveKit docs | Outbound Calling Script | LiveKit docsbillions-grass-55145
12/23/2025, 11:08 AMtall-airline-16756
12/23/2025, 11:09 AMlk agent logs --log-type=deploy --id=<your-agent-id>
◦ Look for lines showing SIP INVITE attempts, DNS resolution, connection failures, or transport fallback messages and note timestamps.
2) Outbound trunk config
• Verify your trunk is correct:
◦ CLI: lk sip outbound list (confirm address = <http://sbc.exotel.com|sbc.exotel.com> or <http://pstn.in2.exotel.com|pstn.in2.exotel.com> as Exotel advised)
◦ If you need the full config, paste it here and I’ll review.
3) API/Call errors (when creating calls)
• If CreateSIPParticipantRequest fails, capture the exception metadata — it may include sip_status and provider error details. Example (pseudo):
except TwirpError as e:
print(e.metadata.get("sip_status_code"), e.metadata.get("sip_status"))
4) Webhooks (SIP call events)
• Enable SIP webhooks in your project to receive sip_call_initiated and sip_call_ended events. These indicate whether LiveKit attempted the call and why it ended.
5) Exotel side (required)
• Ask Exotel to search for INVITEs from your FQDN 5njt9qbiof7.sip.livekit.cloud at the exact timestamps you saw in agent logs. If Exotel sees no INVITE, the request never reached them.
6) What to capture and share here
• Timestamp of a failed call attempt (UTC)
• Relevant agent log lines around that timestamp (copy/paste)
• Any sip_status or error metadata from the API call
• Current trunk address value you’re using
If you paste the agent log snippets and the call timestamp, I’ll analyze them and draft the precise follow-up to Exotel (or recommend LiveKit-side fixes).
Sources: sip | livekit/livekit_composite | DeepWiki | Building an Automated IVR Menu Caller | LiveKit docs | server-sdk-js | livekit/livekit_composite | DeepWiki | Agents telephony integration | LiveKit docstall-airline-16756
12/23/2025, 11:20 AMaddress matches the exact host Exotel expects. Your config shows <http://sbc.exotel.com|sbc.exotel.com> — keep that (do not use raw IP) unless Exotel tells you a different FQDN.
2. Ask Exotel whether inbound SIP to them requires SRV records (the lookup in the log is an SRV for _sip._udp...). If they do not publish SRV, LiveKit will try A/AAAA — Exotel should confirm supported hostnames and transports.
3. Have Exotel verify they have explicitly allowlisted the calling FQDN 5njt9qbiof7.sip.livekit.cloud and that it will accept connections to their SBC (<http://sbc.exotel.com|sbc.exotel.com>) from LiveKit.
4. Provide Exotel a sample timestamp when you attempt a call and ask them to check for incoming INVITEs or blocked DNS/SIP attempts at that time.
Useful tests (if you can run or ask Exotel to run)
• From a network that mirrors LiveKit egress, run:
◦ dig SRV _sip._udp.pstn.in2.exotel.com
◦ dig A/AAAA sbc.exotel.com
◦ nc -v -u sbc.exotel.com 5060 (UDP) and nc -v sbc.exotel.com 5060 (TCP) to test reachability
• Ask Exotel whether <http://pstn.in2.exotel.com|pstn.in2.exotel.com> is an alias that requires SRV or if <http://sbc.exotel.com|sbc.exotel.com> is the canonical SBC hostname.
Config guidance for LiveKit
• Use address: "<http://sbc.exotel.com|sbc.exotel.com>" in the trunk.
• Ensure your outbound trunk numbers and any auth fields match Exotel’s required formats.
• LiveKit performs SRV lookups; if Exotel requires clients to use a specific host/port without SRV, they must provide that FQDN or A record.
If you want, I can:
• Draft a short message for Exotel including the exact log line and a request to check for INVITEs at the provided timestamps.
• Review any DNS/trace outputs you paste here and point out the next step.
Which do you prefer?
Sources: Self-hosted SIP server | LiveKit docs | sip | livekit/livekit_composite | DeepWiki | Deploy to a VM | LiveKit docs | Ports and firewall | LiveKit docs | Configuring firewalls | LiveKit docsbillions-grass-55145
12/23/2025, 11:38 AMtall-airline-16756
12/23/2025, 11:38 AM<http://sbc.exotel.com|sbc.exotel.com>).
Which one do you want?tall-airline-16756
12/24/2025, 6:39 AMnumbers array in E.164 format (e.g., +917969415087).
2. Ensure there are no extra characters or formatting differences (spaces, brackets, tel: prefix) between Exotel’s dialed number and the trunk config.
3. If you expect multiple numbers on the trunk, add them all to the trunk numbers and save/update the trunk.
How to update the trunk quickly
• Via CLI/API: update the trunk JSON to include the exact E.164 numbers, for example:
{
"sipTrunkId": "ST_uLUcbqZ8HXS8",
"name": "Exotel Inbound Trunk",
"numbers": [
"+917969415087",
"+918766749695"
]
}
• After updating, retry the inbound call and note the timestamp.
If the call still fails
• Paste the exact trunk JSON you currently have (copy/paste) and one failed call timestamp (UTC). I’ll check for mismatches and draft a one-line request to Exotel to confirm what number they’re presenting as the destination.tall-airline-16756
12/24/2025, 7:22 AMhost to Exotel’s public IP(s) (or have them confirm a public FQDN) and ensure the trunk numbers array includes the exact E.164 destination (e.g., "+917969415087").
3. Confirm transport/port with Exotel — your logs show TCP on 5060; ensure Exotel will send INVITEs via TCP 5060 (or instruct if TLS 5061).
4. Retry a call and capture a timestamp + agent log snippet (run lk agent logs --log-type=deploy --id=<agent-id>) for the attempt.
Quick message you can send to Exotel (paste as-is) Hi — our LiveKit inbound trunk is rejecting INVITEs because they appear from a private IP (10.60.5.81). Please provide the public static IP address(es) you use for outbound SIP signaling to external trunks and confirm the transport/port (TCP/UDP 5060 or TLS 5061). Also confirm which caller/destination numbers you present to upstream trunks. Example log line: fromUri: {host: "10.60.5.81", transport: "SIP_TRANSPORT_TCP"} Timestamp: [paste UTC timestamp of failed attempt]
What I can do for you
• Draft a shorter/longer message to Exotel.
• Validate your updated trunk JSON if you paste it here.
• Analyze agent log snippets/timestamps after you retry.
Which would you like me to do now?
Sources: SIP Lifecycle Management Agent | LiveKit docs | Accepting calls overview | LiveKit docs | sip | livekit/livekit_composite | DeepWiki