Bring your own carrier (SIP trunk)
If you already have phone numbers with a carrier or a PBX, you can connect them to VOIS AI over a standard SIP trunk instead of buying numbers from us. Your numbers stay with your carrier; calls are routed between your carrier and our SIP gateway, and your agents answer and place calls on them exactly as they do on numbers bought through the Phone Channel.
- Inbound: your carrier (or PBX) sends calls for your numbers to our SIP host. We match the dialed number to the agent you assigned to it, and the agent answers.
- Outbound: when an agent places a call, we send the call to your carrier's SIP termination endpoint, authenticated with the credentials you give us, using one of your numbers as caller ID.
Before you start
Create a SIP trunk channel in your project. The channel screen shows everything your carrier needs:
- the SIP host for your region,
- the IP prefix our gateway sends traffic from,
- the inbound digest credentials, if you choose credential authentication.
Then add your numbers (in E.164 format, for example +971501234567) to the trunk and assign each one to an agent.
SIP hosts
| Region | SIP host | Port |
|---|---|---|
| India | sip.in.voisx.ai | 5060 (UDP or TCP) |
| UAE | sip.uae.voisx.ai | 5060 (UDP or TCP) |
Use the host for the region your project lives in.
Allowlist our IP prefix
Most carriers and PBXs only accept SIP and media from known addresses. Allowlist the IP prefix shown in your SIP trunk channel screen for both signaling (SIP, port 5060) and media (RTP, UDP ports 20000-29999). The prefix is per region, so always copy it from the channel screen rather than resolving the hostname: the host name can resolve to any address inside the prefix.
Authentication
Choose how we recognise inbound calls from your carrier:
| Option | How it works | Use when |
|---|---|---|
| IP allowlist | You enter the IP ranges (CIDR, for example 203.0.113.0/29) your carrier sends calls from. Calls from those addresses are accepted. | Your carrier publishes fixed signaling IPs (Twilio, Telnyx and most tier-1 carriers do). |
| Digest credentials | We generate a username and password for the trunk. Your carrier or PBX answers our SIP challenge with them. | Your source IP changes, or you're sending from a PBX behind a dynamic IP. |
Calls that don't match a trunk are dropped without a response.
For outbound calls, you give us your carrier's termination host, port, transport and (if your carrier requires it) a username and password. We answer your carrier's digest challenge with those credentials.
Media and call features
| Feature | Support |
|---|---|
| Codecs | G.711 µ-law (PCMU) and G.711 A-law (PCMA). Put the one your carrier prefers first. |
| DTMF | RFC 4733 (telephone-event). In-band and SIP INFO DTMF are not supported. |
| Call transfer | SIP REFER (blind transfer). If your carrier rejects REFER, we dial the transfer target through the same trunk and connect the two calls for you. |
| Outbound caller ID | Any of the caller IDs you list on the trunk. Your carrier must allow you to present them. |
Billing
On a SIP trunk you pay your carrier directly for the phone line and minutes. On VOIS AI you're charged only the platform per-minute voice rate for your agent's voice model. There is no telephony markup and no number rental charge for numbers on your own trunk.
Outbound calling safety
Outbound calls on your own trunk go through the same safeguards as any other outbound call on the platform:
- Calling hours: calls are only placed inside the calling window configured for the project, in the callee's local time.
- Do-not-call list: numbers on your project's do-not-call list are never dialed.
- Rate limits: there is a limit on how many calls a project can place per minute and how many can be in progress at once.
You are responsible for having the right to call the people you dial and for complying with local telemarketing rules.
Current limitations (v1)
- No encryption yet: TLS for signaling and SRTP for media are not supported. Use UDP or TCP on port 5060.
- Static trunks only: we don't register to your PBX or carrier (no SIP REGISTER). Your side must send calls to our host, and we send calls to a fixed termination host.
- One agent per number.
Setup guides
Twilio Elastic SIP Trunking
- In the Twilio Console, go to Elastic SIP Trunking > Trunks and create a trunk.
- Origination (inbound to VOIS AI): add an origination URI pointing at your region's host, for example
sip:sip.in.voisx.ai:5060. Priority 10, weight 10. - In VOIS AI, use IP allowlist authentication and enter Twilio's signaling IP ranges for the edge locations you use (listed in Twilio's documentation under Elastic SIP Trunking IP addresses).
- Termination (outbound from VOIS AI):
- Pick a termination SIP URI, for example
yourcompany.pstn.twilio.com. - Under Authentication, create a Credential List with a username and password, and attach it to the trunk. Optionally also add an IP access control list with the IP prefix from your channel screen.
- In VOIS AI, set the outbound host to your termination URI, port 5060, and enter the credential list's username and password.
- Pick a termination SIP URI, for example
- Numbers: attach your Twilio numbers to the trunk, then add the same numbers to your VOIS AI SIP trunk and assign agents.
Telnyx
- In the Telnyx Mission Control Portal, go to Voice > SIP Trunking and create a SIP connection.
- Choose the authentication type:
- IP address: add the IP prefix from your channel screen. In VOIS AI, use IP allowlist and enter Telnyx's signaling IP ranges.
- Credentials: Telnyx gives you a username and password for outbound. For inbound, use Digest credentials in VOIS AI and set the generated username and password in the connection's inbound settings.
- Under Inbound, set the SIP URI / destination to your region's host (for example
sip.uae.voisx.ai), transport UDP or TCP, and select G.711 µ-law and/or A-law. - Under Outbound, create or pick an outbound voice profile and attach the connection. In VOIS AI, set the outbound host to
sip.telnyx.com, port 5060. - Assign your numbers to the connection, then add them to your VOIS AI trunk.
Exotel
- Ask Exotel to enable SIP trunking on your account if it isn't already, and create a SIP trunk in the Exotel dashboard.
- Set the trunk's destination to your region's host (for example
sip.in.voisx.ai, port 5060). - Allowlist the IP prefix from your VOIS AI channel screen in Exotel's trunk settings.
- In VOIS AI, choose IP allowlist and enter the signaling IPs Exotel provides for your trunk, or choose Digest credentials and give Exotel the generated username and password.
- For outbound, enter the termination host and credentials Exotel provides into the trunk's outbound settings in VOIS AI.
- Map your Exotel numbers (ExoPhones) to the trunk, then add them to your VOIS AI trunk.
Your own PBX
Asterisk (PJSIP)
Example pjsip.conf for a trunk to the India region, using IP authentication in both directions. Replace <VOIS_IP_PREFIX> with the IP prefix from your channel screen.
[vois-ai]
type=endpoint
transport=transport-udp
context=from-vois-ai
disallow=all
allow=ulaw
allow=alaw
dtmf_mode=rfc4733
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
aors=vois-ai
from_domain=sip.in.voisx.ai
[vois-ai]
type=aor
contact=sip:sip.in.voisx.ai:5060
qualify_frequency=60
[vois-ai]
type=identify
endpoint=vois-ai
match=<VOIS_IP_PREFIX>
To send a call to an agent, dial the agent's number (E.164) through the endpoint, for example in extensions.conf:
exten => _+X.,1,Dial(PJSIP/${EXTEN}@vois-ai)
If you use Digest credentials instead, add an outbound_auth section with the generated username and password and reference it from the endpoint:
[vois-ai-auth]
type=auth
auth_type=userpass
username=<generated username>
password=<generated password>
; and in the [vois-ai] endpoint section:
; outbound_auth=vois-ai-auth
For outbound calls from VOIS AI to Asterisk, set the trunk's outbound host to your Asterisk public address, and route incoming calls in the from-vois-ai context.
3CX
In the 3CX Management Console, go to Voice & Chat > Add Trunk and choose Generic SIP Trunk:
| Setting | Value |
|---|---|
| Registrar / Server / Gateway | sip.in.voisx.ai (or your region's host) |
| Port | 5060 |
| Transport | UDP or TCP |
| Authentication | Do not require - IP based (with IP allowlist in VOIS AI). For Digest credentials, enter the generated username and password as the authentication ID and password, with registration turned off. |
| Codecs | G.711 U-law, G.711 A-law (remove others) |
| DTMF | RFC 2833 / RFC 4733 |
Because we don't accept SIP REGISTER, set the trunk so 3CX does not register. Add the IP prefix from your channel screen to 3CX's allowed IPs, then route the DIDs that should reach agents through this trunk.
Troubleshooting
| Symptom | Likely cause | What to check |
|---|---|---|
| Call connects but no audio | RTP is blocked or sent to a private address. | Allow UDP 20000-29999 to and from our IP prefix. If your PBX is behind NAT, make sure it advertises its public IP in SDP (in Asterisk: external_media_address, external_signaling_address, rtp_symmetric=yes). |
| One-way audio | NAT on your side, or a firewall that only allows one direction of RTP. | Same as above. Enable symmetric RTP, disable direct media / media bypass, and check your firewall allows return traffic on the RTP range. |
| 403 Forbidden | Authentication failed. | With IP allowlist: the carrier's source IP isn't in the trunk's allowed ranges. With digest: the username or password doesn't match what the channel screen shows. For outbound, your carrier rejected our credentials: re-check the outbound username and password. |
| 404 Not Found | The dialed number isn't registered on this trunk. | Add the number (E.164, with + and country code) to the trunk in VOIS AI and assign an agent. Check your carrier sends the number in E.164 in the Request-URI or To header. |
| No response at all (calls time out) | The call didn't match any trunk, so it was dropped, or 5060 is blocked. | Check you're sending to the right regional host, from an address in your allowed ranges, and that outbound UDP/TCP 5060 is open. |
| 480 Temporarily Unavailable | Telephony is paused on the project or credit is exhausted. | Check your project's balance and telephony settings. |