SIP Trunking
Preview
SIP

SIP Trunking

Enterprise voice connectivity over SIP. Connect your PBX, contact centre, or SBC to the public telephone network with carrier-grade origination, termination, and REST management APIs.

Full PSTN Access

Originate and terminate calls to any phone number worldwide through Sendexa carrier routes.

SIP + REST Control

Signal over SIP (UDP/TCP/TLS) and manage trunks, numbers, and CDR via the REST API.

Dual Authentication

SIP digest credentials plus optional IP access-control lists for zero-trust trunk security.

Carrier-Grade Quality

G.711, G.729, and Opus codecs with multi-region media anchors and sub-second setup.

Built-in Failover

Primary and secondary SIP URIs with sequential hunt for high-availability inbound routing.

Detailed CDR

Per-call detail records with duration, hangup cause, direction, codec, and billed minutes.

TLS & SRTP Ready

Encrypt signaling on port 5061 and optionally enable media encryption end-to-end.

PBX Friendly

Drop-in configs for Asterisk, FreeSWITCH, 3CX, FreePBX, and commercial SBCs.

SIP Host

sip…

sip.sendexa.co

Signaling Ports

5060/61

UDP · TCP · TLS

Codecs

3

G.711 · G.729 · Opus

Billing

/min

Per-minute, 6s increments

How SIP Trunking Works

Sendexa SIP Trunking bridges your private voice infrastructure to the public switched telephone network (PSTN). You keep your PBX, contact-centre platform, or softswitch; Sendexa provides the SIP edge, media path, and carrier interconnects.

Origination (Inbound)

A caller dials your Sendexa DID (local or international number). We receive the call from the PSTN and send a SIP INVITE to your configured SIP URI or registered contact.

PSTN → Sendexa → your PBX (sip:user@pbx.example.com)

Termination (Outbound)

Your PBX sends a SIP INVITE to sip.sendexa.co with an E.164 destination. After authentication we route the call across carrier partners to the handset.

Your PBX → Sendexa → PSTN (+233… / +1… / …)

SIP Connectivity

Edge Endpoints
ParameterValueNotes
SIP Hostsip.sendexa.coPrimary multi-region anycast edge
Port (UDP / TCP)5060Standard SIP signaling
Port (TLS)5061Encrypted signaling (recommended)
TransportsUDP, TCP, TLSPrefer TLS in production
AuthDigest + IP ACLSIP username/password and optional allowlist
CodecsG.711 (PCMU/PCMA), G.729, OpusNegotiated via SDP offer/answer

REST Management API

Voice media and signaling stay on SIP. Use the REST API to provision trunks, assign numbers, and pull CDRs. Base URL: https://api.sendexa.co

POST
/v1/sip/trunks

Create trunk

Provision a SIP trunk with credentials, ACL, codecs, and capacity.

GET
/v1/sip/trunks

List trunks

List all trunks on the business account with status and limits.

POST
/v1/sip/numbers

Assign number

Attach a DID to a trunk and set the inbound SIP destination URI.

GET
/v1/sip/cdr

Query CDR

Retrieve call detail records with filters for date, direction, and status.

Quick Start — Create a Trunk

Provision via REST
Bash
curl -X POST 'https://api.sendexa.co/v1/sip/trunks' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic YOUR_DASHBOARD_BASE64_TOKEN' \
-d '{
"name": "Primary HQ Trunk",
"auth": {
"username": "trunk_hq_01",
"password": "use-a-long-random-secret"
},
"ipAllowlist": ["203.0.113.10/32", "198.51.100.0/24"],
"codecs": ["PCMU", "PCMA", "G729", "opus"],
"transport": "tls",
"maxConcurrentCalls": 50,
"origination": {
"primaryUri": "sip:pbx.example.com:5061;transport=tls",
"failoverUri": "sip:backup.example.com:5061;transport=tls"
}
}'

Example response

JSON
{
"success": true,
"code": "TRUNK_CREATED",
"message": "SIP trunk provisioned successfully.",
"requestId": "REQ-9f2c1a80",
"timestamp": "2026-07-12T10:15:22.441Z",
"data": {
"trunkId": "TRK-8c1e2b9a-4d3f-41a0-9e7c-12ab34cd56ef",
"name": "Primary HQ Trunk",
"status": "active",
"sipHost": "sip.sendexa.co",
"ports": { "udp": 5060, "tcp": 5060, "tls": 5061 },
"auth": {
"username": "trunk_hq_01",
"realm": "sendexa.co"
},
"ipAllowlist": ["203.0.113.10/32", "198.51.100.0/24"],
"codecs": ["PCMU", "PCMA", "G729", "opus"],
"transport": "tls",
"maxConcurrentCalls": 50,
"origination": {
"primaryUri": "sip:pbx.example.com:5061;transport=tls",
"failoverUri": "sip:backup.example.com:5061;transport=tls"
},
"createdAt": "2026-07-12T10:15:22.441Z"
}
}

SIP Authentication Model

FieldTypeRequiredDescription
usernamestring
required
SIP digest username issued when the trunk is created. Used in Authorization headers on REGISTER and INVITE.
passwordstring
required
SIP digest password. Store in your PBX secret store; never commit to source control.
ipAllowliststring[]optionalCIDR ranges permitted to send signaling. When set, unlisted source IPs are rejected even with valid credentials.
realmstringoptionalAlways sendexa.co. Configure this in your PBX authentication realm if prompted.

Documentation

Billing Snapshot

MetricRule
UnitBilled per minute of connected talk time (answered calls only)
Increment6-second increments after the first 30 seconds (destination-dependent)
Failed / busy / no-answerNot billed for talk time; setup attempts may appear in CDR with zero cost
Currency & ratesAccount currency; rate cards available in the dashboard under SIP → Rates

Common SIP & API Errors

CodeLayerCause
401 UnauthorizedSIPInvalid digest credentials or missing Authorization header
403 ForbiddenSIPSource IP not on trunk ACL, or CLI not allowed
404 Not FoundSIPUnknown DID or unroutable destination number
486 Busy HereSIPFar end busy or concurrent call limit reached on trunk
488 Not AcceptableSIPNo common codec between offer and Sendexa allowlist
INSUFFICIENT_CREDITSREST/SIPAccount balance too low for outbound termination
TRUNK_NOT_FOUNDRESTInvalid trunkId on number assignment or update