RingTrunk documentation
Indian phone numbers and SIP trunks for developers. What RingTrunk is, how the two call directions work, the connection details, the two rules every call must follow, and where to go next for LiveKit, Pipecat, OpenAI's Realtime API, Vapi and the REST API.
Updated 24 September 2026
In short: RingTrunk gives your software an Indian phone number and a SIP trunk to carry calls on it, both directions, on the platform you already use.
RingTrunk gives your software an Indian phone number and a SIP trunk to carry calls on it. You point the platform you already use at the trunk: LiveKit Cloud, self-hosted LiveKit, a Pipecat agent behind LiveKit, OpenAI's Realtime API over SIP, Vapi, or anything else that speaks SIP. There is no SDK to adopt and nothing to rewrite. Everything you can do in the portal is also available through a REST API.
What you get
- An Indian phone number. A 10-digit Indian number that receives calls and is presented as the caller ID on calls you place.
- A SIP trunk. A username (the trunk id), a password shown once, and a server address. One trunk carries both directions.
- A console and an API. Create trunks, attach numbers, set where inbound calls go, rotate credentials and read call records, by hand or from code.
Definitions
- SIP trunk. A connection between your voice software and the telephone network over SIP. Instead of physical lines, your system authenticates to a SIP server and sends calls to it, and that server sends calls back to you.
- Termination (outbound). Calls your system places. Your platform authenticates to our SIP server with the trunk id and password and sends an INVITE; we deliver the call to the Indian mobile network.
- Origination (inbound). Calls to your number. We send an INVITE to the origination URIs on your trunk. These carry no credentials, so your server accepts them by our source IP.
- Origination URI. The host, and optionally port and transport, of the SIP server that should receive your inbound calls, for example
your-project.sip.livekit.cloud:5060;transport=tcp. You can list several; they are tried in priority order, which is failover, not load balancing. - Caller ID (CLI). The number shown to the person you call. On RingTrunk it must be one of the numbers attached to the trunk.
- Channel. One concurrent call. Every number comes with a number of channels, and a trunk's limit is the sum across the numbers attached to it.
- CPS. Calls per second. A rate cap, separate from the channel limit.
How it fits together
Two directions, configured independently.
| Direction | Who connects to whom | Authentication |
|---|---|---|
| Outbound (termination) | Your platform → pstn.ringtrunk.com | SIP digest. Username is the trunk id, password issued once. |
| Inbound (origination) | RingTrunk → your origination URIs | None on the INVITE. Your server trusts our source IP. |
Connection details
| Setting | Value |
|---|---|
| SIP server | pstn.ringtrunk.com. No port needed; SRV records carry it. |
| Explicit fallback | sip.ringtrunk.com:5070 for stacks that ignore SRV. |
| Transport | UDP or TCP. In LiveKit, pin TCP rather than leaving it automatic. |
| Username | Your trunk id, for example TRa8f3k2m9qz47b1c. |
| Password | Shown once, when the trunk is created or the password is rotated. |
| Realm | Any. |
| Codec | G.711 A-law (PCMA), 20 ms. Nothing else is negotiated. |
| Inbound source IP | Shown on your trunk's Origination tab in the portal. Allow it on your firewall. |
Port 5070, not 5060. Port 5060 on our switch is the carrier side and will not accept your registration.
The two rules every call must follow
- Caller ID must be one of your own numbers. Present a number that is attached to the trunk, in plain 10-digit form. Anything else is rejected with
403 cli_not_allowedbefore it reaches the network. This is an Indian regulatory requirement and it is enforced on every call. - Destinations are Indian mobile numbers. 10 digits starting 6, 7, 8 or 9. Landlines, short codes and international destinations are rejected with
403 destination_not_supported.
Number formats
Numbers are 10-digit Indian mobile numbers and are written without a prefix on RingTrunk, for example 9XXXXXXXXX. On an inbound call the user part of the request URI is the number in that form, so route on it. When you configure an inbound trunk in LiveKit, list the number in every form the To header may take: 9XXXXXXXXX, +919XXXXXXXXX, 09XXXXXXXXX and 919XXXXXXXXX.
Timing to expect
- A new trunk can take up to 60 seconds before its first registration succeeds.
- A rotated password becomes active within 60 seconds. The old one keeps working until then, and existing registrations are not dropped.
- Suspending a trunk blocks new calls immediately. Calls already in progress are not disconnected.
Guides
- Connect LiveKit Cloud to an Indian phone number
- Connect self-hosted LiveKit
- Give a Pipecat voice agent an Indian phone number
- Connect OpenAI's Realtime API to an Indian phone number over SIP
- Connect Vapi to an Indian phone number with a bring-your-own SIP trunk
- Placing calls: caller ID, destinations and capacity
- Receiving calls: origination URIs, failover and forwarding
- REST API reference
- Troubleshooting SIP responses
- Example repositories on GitHub, MIT licensed: Pipecat, LiveKit Agents, OpenAI Realtime over SIP and Vapi
Running something else?
RingTrunk is plain SIP, so it connects to any stack that can authenticate with digest credentials and accept an INVITE by source IP. Write to [email protected] with what you run and we will send you the settings.