CallMineAI Docs
Home
  • Introduction
  • Architecture
  • Installation
  • Web installer
  • Configuration
  • Deployment
  • Customer panel
  • Admin panel
  • Agents & Voices
  • Campaigns & Calls
  • Billing & Credits
  • Telephony (Twilio)
  • Voice & AI
  • SIP trunks
  • Messaging
  • REST API
Home
  • Introduction
  • Architecture
  • Installation
  • Web installer
  • Configuration
  • Deployment
  • Customer panel
  • Admin panel
  • Agents & Voices
  • Campaigns & Calls
  • Billing & Credits
  • Telephony (Twilio)
  • Voice & AI
  • SIP trunks
  • Messaging
  • REST API
  • Getting started

    • Introduction
    • Architecture
    • Installation
    • Web installer
    • Configuration
    • Deployment
  • Using CallMineAI

    • Customer Guide
    • Agents & Voices
    • Campaigns & Calls
    • Billing & Credits
  • Administration

    • Admin Guide
    • Roles & permissions
    • Localization
  • Integrations

    • Telephony (Twilio)
    • Voice & AI
    • SIP trunks
    • Messaging
    • REST API
  • Help

    • FAQ & troubleshooting

SIP trunks

The SIP Trunk add-on lets a customer bring their own SIP trunk as an alternative to — or alongside — the built-in Twilio telephony. Instead of buying numbers through Twilio, a workspace connects an existing carrier trunk (Twilio Elastic SIP, Plivo, Telnyx, and others), imports its numbers, and points an AI agent at them.

It is a plan-gated add-on, exposed by the sip_enabled plan feature. Workspaces on a plan without it never see the SIP navigation entry, and the /app/sip/* routes are protected by the plan.feature:sip middleware. See Billing & credits for how plan features are assigned, and Telephony for the default Twilio path.

What it is

A SIP trunk is a direct voice connection to your own carrier. With this add-on a customer can:

  • keep numbers already registered with a carrier instead of porting them to Twilio,
  • route inbound and (engine permitting) outbound AI calls over that trunk,
  • run SIP and Twilio numbers side by side in the same workspace.

Trunk credentials (username, password, auth id) are encrypted at rest and are marked hidden on the model, so they are never returned in API responses, Inertia props, or JSON.

Engines

Each trunk is bound to a voice engine that drives the AI conversation. The engine determines which call directions are supported.

EngineValueInboundOutboundRecording
ElevenLabselevenlabsYesYesYes
OpenAI RealtimeopenaiYesNoNo

OpenAI Realtime is inbound-only

The OpenAI Realtime engine rejects a number imported for outbound use. Choose ElevenLabs for a trunk that needs to place outbound calls or capture recordings. The default engine for new trunks is set by SIP_DEFAULT_ENGINE.

Adding a trunk

Customer — SIP trunks

The SIP trunk management page in the customer workspace.

Open SIP Trunks at /app/sip and add a trunk. Pick a provider template to auto-fill the SIP host, port, and transport, then enter the credentials from your carrier.

Available provider templates:

ProviderValueDefault hostPortTransport
Twiliotwilioyour-domain.pstn.twilio.com5060tls
Plivoplivophone.plivo.com5060udp
Telnyxtelnyxsip.telnyx.com5060tls
Vonagevonagesip.nexmo.com5060tls
Bandwidthbandwidthgw.bandwidth.com5060udp
Exotelexotelsip.exotel.com5060udp
DIDWWdidwwsip.didww.com5060udp
Zadarmazadarmasip.zadarma.com5060udp
Cloudonixcloudonixsip.cloudonix.io5060tls
RingCentralringcentralsip.ringcentral.com5060tls
Sinchsinchsip.sinch.com5060tls
Infobipinfobipsip.infobip.com5060tls
Generic SIPgeneric(blank)5060udp

Each template is only a starting point — the host, port (1–65535), and transport (udp, tcp, or tls) remain editable. Toggle inbound and outbound per trunk, and set a per-trunk concurrency limit. On save the platform generates a webhook_secret used to verify inbound engine callbacks.

Credentials are write-only

When editing a trunk, leave the password field blank to keep the stored value. Credentials are never sent back to the browser, so an empty field means "unchanged".

Importing SIP numbers & assigning an agent

Once a trunk is active, import the numbers it serves from the same page:

  1. Choose the trunk and enter the number (it is normalized to E.164).
  2. Pick the direction — inbound, outbound, or both.
  3. Optionally assign an active agent to answer or place calls on that number.

Importing calls the trunk's engine to provision the number; if provisioning fails the import is rolled back. SIP numbers carry source = sip and cost 0 monthly credits (you pay your carrier directly). Use Assign at any time to change the agent, or release the number to remove it.

Limits

Three plan columns cap SIP usage per workspace:

LimitPlan columnEnforced on
Trunkssip_trunks_limitAdding a trunk
SIP numberssip_numbers_limitImporting a number
Concurrencysip_concurrency_limitSimultaneous SIP calls

Attempting to add a trunk or import a number beyond the plan limit is rejected with an error message.

Environment & webhook

SIP_ENABLED=true
SIP_DEFAULT_ENGINE=elevenlabs          # elevenlabs | openai
OPENAI_REALTIME_MODEL=gpt-4o-realtime-preview

Inbound events for OpenAI Realtime trunks arrive at:

POST /webhooks/sip/openai

This route is CSRF-exempt and HMAC-verified against the trunk's webhook_secret; requests that fail verification are rejected.

Last Updated: 7/9/26, 8:56 AM
Prev
Voice & AI
Next
Messaging