Your own SIP trunk
Keep the numbers and carrier you already use, and let zlicx agents answer and place calls on them. You connect your carrier's SIP trunk to zlicx once, add its numbers, and assign an agent to each number. This is the usual way to run agents on Indian numbers from carriers such as Exotel or Vobiz.
What you need
- A SIP trunk from your carrier, with the host (and port) it accepts calls on, and its username and password if it uses them.
- The IP addresses your carrier sends inbound calls from. Your carrier lists these in its trunk documentation or support pages.
- Your numbers in E.164 form, for example
+918041234567. - An agent that can run on the zlicx voice engine. HTTP tools, MCP servers and knowledge bases all work on trunk calls. Agents that use Composio connections cannot take them yet.
Billing
Your carrier rents you the numbers and bills the call minutes. zlicx charges no telephony or number rental for SIP trunk calls. AI usage and the per-minute platform fee are billed as usual from your wallet.
1. Add the trunk
- In the console, open Phone numbers and choose SIP trunks, then Add SIP trunk.
- Pick your carrier. This fills in a sensible port and transport; change them if your carrier says otherwise.
- Enter one or more gateways (up to 8). Outbound calls try them in order and move to the next if one does not take the call.
- Enter the trunk's username and password, or leave both empty if your carrier authenticates by IP address.
- Enter your carrier's IP addresses for inbound calls, one per line (an address, or a range from /16 to /32). zlicx rejects inbound calls from any other address. A trunk without IP addresses can only place outbound calls.
- Set channels: how many calls the trunk can carry at once, inbound and outbound together. Match your carrier plan.
2. Point your carrier at zlicx
The SIP trunks page shows Point your carrier at zlicx: the SIP address, signalling IPs, port, transports, media port range, and codecs. In your carrier's trunk settings:
- Set the destination (origination) URI for inbound calls to the zlicx SIP address.
- Allow the zlicx signalling IPs and the media port range if your carrier uses an allowlist.
- Use the PCMU (G.711 µ-law) or PCMA (G.711 A-law) codec.
3. Add numbers and assign agents
On the trunk, paste the numbers your carrier routes to it and choose Add. Then pick an agent for each number. A number can belong to one trunk, and only once on zlicx. Trunk numbers also appear on the Phone numbers page with the SIP TRUNK label.
How inbound calls are handled
- Your carrier sends the call to zlicx.
- zlicx reads the called number. Carriers send it in different forms (
+918041234567,918041234567,08041234567); zlicx matches it to your number by its last ten digits. - It checks that the call came from one of the trunk's IP addresses, that a channel is free, and that your wallet can cover the call.
- It answers, and the number's agent greets the caller.
When zlicx cannot take a call, it tells your carrier why:
| SIP response | Reason |
|---|---|
| 404 Not Found | The number is not on any trunk, or has no agent assigned. |
| 403 Forbidden | The call came from an IP address the trunk does not allow. |
| 486 Busy Here | All of the trunk's channels are in use. |
| 480 Temporarily Unavailable | The wallet cannot cover the call, or the agent cannot run on the voice engine. |
Outbound calls and campaigns
Quick calls, scheduled calls, and campaigns work the same as with purchased numbers: choose a trunk number as the from number. zlicx dials through the trunk's gateways, shows that number as the caller ID, and starts the agent when the callee answers. Unanswered calls are logged as Not answered. If all channels are busy, the call is not placed and the request returns an error.
The same works through the API:
curl -X POST https://api.in.zlicx.ai/api/v1/outbound-calls/quick \
-H "x-api-key: $ZLICX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "YOUR_AGENT_ID",
"fromNumber": "+918041234567",
"phoneNumber": "+919876543210",
"dynamicVariables": { "order_id": "A-1001" }
}'Call records
Each call leaves a call log with the caller and called numbers, transcript, post-call analysis, recording (when the agent keeps audio), and your post-call webhook. The log's provider is SIP_TRUNK.
Managing trunks through the API
The console uses these endpoints; each needs phone number permissions in the organization.
| Method and path | What it does |
|---|---|
GET /api/v1/sip-trunks | Lists trunks and the zlicx connection details. |
POST /api/v1/sip-trunks | Adds a trunk. |
GET /api/v1/sip-trunks/:id | Reads one trunk. Passwords are never returned. |
PATCH /api/v1/sip-trunks/:id | Changes a trunk. Omit password to keep it; send an empty string to remove it. |
DELETE /api/v1/sip-trunks/:id | Removes a trunk and its numbers from zlicx. Calls in progress finish. |
POST /api/v1/sip-trunks/:id/numbers | Adds up to 100 numbers: {"numbers": ["+918041234567"]}. |
DELETE /api/v1/sip-trunks/:id/numbers/:phId | Removes one number. |
{
"name": "Vobiz Bengaluru",
"carrier": "vobiz",
"gateways": [{ "host": "yourname.sip.vobiz.ai", "port": 5060, "transport": "tcp" }],
"username": "yourname",
"password": "your-trunk-password",
"inboundIps": ["203.0.113.0/24"],
"channels": 10
}carrier is one of exotel, vobiz, plivo, twilio, telnyx, vonage, or custom.
Troubleshooting
- Inbound calls fail with 403. Add the address your carrier actually sends from to the trunk's IP list. Ask your carrier for its full signalling range.
- Inbound calls fail with 404. Check the number is on the trunk in E.164 form and has an agent assigned.
- Outbound calls fail at once. Check the gateway host, port, transport, and credentials against your carrier's trunk settings, and that your carrier allows calls from the zlicx signalling IPs.
- Calls connect with no audio. Make sure your carrier allows the zlicx media port range and offers PCMU or PCMA.

