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…
sip.sendexa.co
5060/61
UDP · TCP · TLS
3
G.711 · G.729 · Opus
/min
Per-minute, 6s increments
Authentication
Authorization: Basic <token>. Auth guide →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.
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)
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
| Parameter | Value | Notes |
|---|---|---|
| SIP Host | sip.sendexa.co | Primary multi-region anycast edge |
| Port (UDP / TCP) | 5060 | Standard SIP signaling |
| Port (TLS) | 5061 | Encrypted signaling (recommended) |
| Transports | UDP, TCP, TLS | Prefer TLS in production |
| Auth | Digest + IP ACL | SIP username/password and optional allowlist |
| Codecs | G.711 (PCMU/PCMA), G.729, Opus | Negotiated 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
Create trunk
Provision a SIP trunk with credentials, ACL, codecs, and capacity.
List trunks
List all trunks on the business account with status and limits.
Assign number
Attach a DID to a trunk and set the inbound SIP destination URI.
Query CDR
Retrieve call detail records with filters for date, direction, and status.
Quick Start — Create a Trunk
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
{"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
| Field | Type | Required | Description |
|---|---|---|---|
| username | string | required | SIP digest username issued when the trunk is created. Used in Authorization headers on REGISTER and INVITE. |
| password | string | required | SIP digest password. Store in your PBX secret store; never commit to source control. |
| ipAllowlist | string[] | optional | CIDR ranges permitted to send signaling. When set, unlisted source IPs are rejected even with valid credentials. |
| realm | string | optional | Always sendexa.co. Configure this in your PBX authentication realm if prompted. |
Recommended production posture
5061, and enable SRTP where your endpoints support it. Rotate trunk passwords from the dashboard or via PATCH /v1/sip/trunks/:id.STIR / SHAKEN
Documentation
Provision a trunk, create SIP credentials, allowlist your IP, and place a test call.
Codecs, transport, auth modes, registration, concurrent call limits, and failover.
Route DIDs into your SIP URI and dial out to the PSTN with E.164 destinations.
Query call detail records, understand billing units, and export usage for reconciliation.
Billing Snapshot
| Metric | Rule |
|---|---|
| Unit | Billed per minute of connected talk time (answered calls only) |
| Increment | 6-second increments after the first 30 seconds (destination-dependent) |
| Failed / busy / no-answer | Not billed for talk time; setup attempts may appear in CDR with zero cost |
| Currency & rates | Account currency; rate cards available in the dashboard under SIP → Rates |
Common SIP & API Errors
| Code | Layer | Cause |
|---|---|---|
401 Unauthorized | SIP | Invalid digest credentials or missing Authorization header |
403 Forbidden | SIP | Source IP not on trunk ACL, or CLI not allowed |
404 Not Found | SIP | Unknown DID or unroutable destination number |
486 Busy Here | SIP | Far end busy or concurrent call limit reached on trunk |
488 Not Acceptable | SIP | No common codec between offer and Sendexa allowlist |
INSUFFICIENT_CREDITS | REST/SIP | Account balance too low for outbound termination |
TRUNK_NOT_FOUND | REST | Invalid trunkId on number assignment or update |
Preview status
Best practices
- Prefer TLS 5061 for signaling and enable SRTP when available
- Always configure an IP allowlist in addition to SIP credentials
- Use E.164 for outbound destinations (
+233…, not local formats) - Set a secondary failover URI for inbound DID routing
- Store
trunkIdand correlate withcallId/ CDR for billing reconciliation - Monitor concurrent call utilisation against
maxConcurrentCalls