Connect in one step from the console
For Telnyx, Vobiz, Twilio, Plivo, Vonage and Exotel, the console does the carrier side for you. Open SIP trunks, pick your carrier under Connect a carrier, and paste the API keys from your carrier’s API settings page. We then use your carrier’s API to:- create a trunk that sends your calls to Wixzel Voice
- allow our server to place calls through it
- list the numbers on your account, so you pick one and the agent that answers it
The IP to allowlist
Calls are placed from
187.126.120.231.Nearly every carrier authorises outbound calls by source IP, so this address has
to be on your trunk’s allowlist before anything will connect. Do this first: a
trunk that is correct in every other respect still fails without it, and the
failure looks like a fault at our end rather than a missing permission.Every trunk returns it as platform_ip, so you can read it from the API rather
than trusting this page to stay current:Where inbound calls should be sent
Send inbound calls to
sip:187.126.120.231:5090.This is the other half of a trunk, and it is separate configuration in a
different part of your carrier’s console from the allowlist above. The allowlist
tells them to accept calls from us; this tells them where to deliver calls
to us. Twilio calls the field the Origination URI; other carriers call it
a termination point, a destination SIP URI, or just the host. It is the same
string.Getting this wrong fails in the quietest way this product has: you buy a number,
point it at an agent, and it simply never rings. Nothing appears in your logs or
ours, because the call never arrives: the carrier had nowhere to deliver it.Every trunk returns it as origination_uri, so read it from the API rather than
trusting this page to stay current:origination_uri names the UDP port. A carrier that delivers over TCP, such as
Exotel, sends to 187.126.120.231:5091 over TCP instead.What you need
Any SIP provider will do. From them you need:- a host, such as
sip.carrier.example - credentials: a username and password, if they use registration
- your numbers, and whether inbound calls are delivered to that trunk
- an IP allowlist entry for
187.126.120.231, or a credential list if you would rather authenticate with a username and password
Connecting it
transport is udp, tcp or tls.
The password is encrypted at rest and is never returned by the API again,
including to you. Store it wherever you keep the rest of your carrier
credentials.
Registering a number
A number must belong to a trunk before it can place a call:inbound_agent_id and calls to that number are answered
automatically by that agent.
On a trunk made by connecting a carrier in one step, registering a number also
points it at Wixzel Voice at the carrier, and the number must already be on that
carrier account. GET /v1/sip-trunks/{id}/carrier-numbers lists them.
Buying a number
Wixzel Voice still sells no numbers. On a trunk made by connecting Twilio, Telnyx, Plivo, Vobiz or Vonage, it can buy one on your own carrier account: the carrier charges you at its own price, and we add nothing. The trunk’scan_buy_numbers says whether its carrier allows this. Vobiz and Vonage are
marked beta.
Search first. Searching is free and changes nothing:
monthly_cost and upfront_cost, in the
carrier’s currency. Then buy one, with the country and type you searched for:
phone_numbers:purchase scope and an Idempotency-Key: retrying with
the same key returns the first result and never buys twice.
- Regulated numbers. Many countries, India among them, need approved documents before a carrier sells a number there. If your carrier account already has an approved Twilio bundle, Telnyx requirement group or Plivo compliance application for that country and type, it is used. If not, the carrier refuses, and the error says where to get one approved.
purchase_status: "pending"means the carrier took the order and is still processing it. The number is registered either way.502 bought_not_connectedmeans the number was bought but could not be pointed at Wixzel Voice. It stays on your carrier account. Register it again withPOST /v1/phone-numbersto retry.
Carrier-side setup
Your carrier needs to know where to send traffic and, more often the cause of a silent failure, needs to agree that you are allowed to place the call at all. Work through all of these before blaming the API:1
Allowlist the Wixzel Voice IP
Wixzel Voice authenticates to your carrier by IP unless you gave the trunk a
username and password. If the IP is not on your carrier’s allowlist,
your INVITE is rejected before it is ever rated, and nothing appears on
your bill to hint at why.Calls originate from 187.126.120.231. Add that to whatever your carrier
calls its IP access control list, and see the carrier guides
for where that setting lives on the common providers.2
Verify the caller ID
The number in
from_number_id has to be one your carrier has authorised you
to present. Carriers routinely accept the call, log it, then drop it when the
presented caller ID is not provisioned on the account.3
Complete KYC and any destination registration
Some markets gate outbound calling behind identity checks. In India in
particular, an account that has not finished KYC (and, for many
providers, DLT registration) can hold a positive balance and still have
every outbound call cleared immediately. The portal shows the calls; it does
not always show the reason.
4
Check the balance and the destination is enabled
A prepaid balance is necessary but not sufficient. Confirm the specific
destination range is enabled on your account, not just that there is credit.
Carrier guides
Each carrier names the same two settings differently and keeps them in a different part of its console. These pages say where, for the carriers people connect most often:Twilio
Elastic SIP Trunking: an IP ACL for outbound, the Origination URI for inbound.
Telnyx
One SIP Connection with IP authentication, an inbound region and a transport.
Plivo
Zentrunk: an outbound trunk and a separate inbound trunk. You need both.
Vonage
Programmable SIP: outbound and inbound settings, and the ACL.
Bandwidth
No SIP REGISTER, so the static IP is the only way in. Or a network bridge.
Exotel
Virtual SIP Trunking for Indian numbers, over TCP.
Vobiz
A SIP domain per trunk as the host, and an origination URI that means the opposite.
Any other carrier
Any SIP provider works with Wixzel Voice (more on bringing any SIP provider). The pattern is the same everywhere, only the vocabulary moves:
Two settings decide whether a correct-looking trunk works:
- Number format. Twilio, Telnyx and Vobiz expect the leading
+. Many wholesale carriers cannot parse it and answer408 Request Timeoutafter a few seconds, with the call showing in their portal as received but never answered. Setsend_plustofalseto send bare digits. - Transport. UDP is the default almost everywhere, but Exotel does not take UDP: use TCP. A mismatch looks like the carrier ignoring you.
send_plus and the KYC step
above.
Trunk changes take effect immediately: creating, updating or deleting a trunk
rewrites the telephony configuration and reloads it, so there is nothing to
restart.
When a call does not connect
A call that is accepted by the API and then fails looks like this:POST /v1/calls returns 201 with status: "queued", and a later GET /v1/calls
shows status: "failed", a short duration_seconds, and cost_micros: null.
cost_micros: null is the important part. You are not charged for a call that
never connected: no answer means no billable seconds, and the credit reserved
at admission is released. A failed call costs you nothing, which also means the
absence of a charge is not evidence of a problem on our side.
Work down this list in order.
1. Read your carrier's own call logs first
1. Read your carrier's own call logs first
This is the single most informative step, and it is easy to skip. Your
carrier’s portal will show whether the call reached them at all, what caller
ID they saw, what destination they parsed, and how they cleared it.Three outcomes, and each points somewhere different:
- The call is not listed. It never reached your carrier. The IP allowlist, the trunk host or the firewall is wrong.
- Listed, answered, with a duration and a cost. The call worked at the telephony layer. If the caller heard nothing, the problem is media, not signalling; see the audio note below.
- Listed, zero answered, zero cost, a short duration. The carrier
accepted your
INVITEand then cleared the call. This is a carrier-side permission problem far more often than a configuration one: caller ID not provisioned, KYC incomplete, or the destination not enabled. Nothing on the Wixzel Voice side can fix it, and the fastest route is your carrier’s support with the timestamp and the call id from their log.
2. Check the number is actually on a trunk
2. Check the number is actually on a trunk
400 number_not_on_trunk means the number has no sip_trunk_id. Calls are
placed over your trunk, so a number that is not on one has nowhere to go.3. 408 Request Timeout: try send_plus: false
3. 408 Request Timeout: try send_plus: false
If your carrier answers Setting a
100 Trying and then 408 Request Timeout a few
seconds later, they could not route the destination. The most common reason
is the leading +.Wixzel Voice dials sip:+15551234567@your-carrier by default, which is what
Twilio and Telnyx expect. Many wholesale carriers cannot parse a + in the
request URI: they accept the INVITE, fail to route it, and time out. The call
shows in their portal as received and never answered, which looks like a
fault at your end.Send bare digits instead:dial_prefix implies this: a tech prefix is matched literally, so
the + is always dropped when one is configured.4. 403 Forbidden: check the caller ID
4. 403 Forbidden: check the caller ID
A
403 is a permission decision, usually about who you claim to be rather
than who you are dialling. Check that the number behind from_number_id is
one your carrier has authorised you to present.Carriers commonly reject a call with no caller ID at all. If you are testing
from a softphone or an Asterisk CLI rather than through the API, confirm you
are actually sending one: an INVITE with From: "Anonymous" earns a 403
from most carriers regardless of how well the account is configured.5. Rejected in about a second: the IP is not allowlisted
5. Rejected in about a second: the IP is not allowlisted
A call that fails in roughly a second, with hangup cause 21 (Call Rejected)
and no ringing, was refused by the carrier before it was routed. On Twilio
this is almost always the Termination IP Access Control List: add
187.126.120.231 to it.The distinguishing feature is the timing. An unauthorised source is rejected
immediately, because the carrier does not need to look anything up to decide.
A call that is accepted and then fails several seconds later is a different
problem (routing, formatting or account permissions), and the entries above
cover those.This is worth checking first whenever the same trunk works from another
server. Identical trunk settings do not carry the allowlist with them.6. Interpret the hangup cause
6. Interpret the hangup cause
Normal Clearing (Q.850 cause 16) on a call that was never answered is not
as reassuring as it sounds. It means the far end ended the call deliberately
rather than erroring; a rejection can be dressed as a normal hangup. Read it
as “something upstream chose to end this”, not as “the call completed”.A duration of a few seconds with no answer is usually the carrier clearing
the call, not a person declining it. A human declining a call typically takes
longer than the ring itself.7. An inbound number never rings at all
7. An inbound number never rings at all
Not a failure but an absence. If the Origination URI is missing from your
carrier’s console the call never leaves them, so there is nothing in our
logs, no hangup cause, and no failed call to inspect. Outbound working is no
evidence either way: the two directions are configured separately.Check the carrier has
sip:187.126.120.231:5090 (or whatever
GET /v1/sip-trunks reports as origination_uri) as the destination for
that number, that the number is attached to the trunk on their side, and
that it has an inbound_agent_id here so something answers it.8. Connected, but no audio
8. Connected, but no audio
If calls connect but there is no audio, the usual cause is RTP not reaching
the server: check that your firewall allows the media port range, not just
the signalling port. Signalling on 5060 and media on the RTP range are
separate holes in the firewall, and opening only the first produces exactly
this symptom.

