Skip to main content
POST
/
api
/
v1
/
Account
/
{auth_id}
/
trunks
Create a trunk
curl --request POST \
  --url https://api.vobiz.ai/api/v1/Account/{auth_id}/trunks \
  --header 'Content-Type: application/json' \
  --header 'X-Auth-ID: <api-key>' \
  --header 'X-Auth-Token: <api-key>' \
  --data '
{
  "name": "Retell AI SIP"
}
'
import requests

url = "https://api.vobiz.ai/api/v1/Account/{auth_id}/trunks"

payload = { "name": "Retell AI SIP" }
headers = {
"X-Auth-ID": "<api-key>",
"X-Auth-Token": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {
'X-Auth-ID': '<api-key>',
'X-Auth-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: 'Retell AI SIP'})
};

fetch('https://api.vobiz.ai/api/v1/Account/{auth_id}/trunks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
{
  "trunk_id": "<string>",
  "account_id": "<string>",
  "name": "<string>",
  "trunk_domain": "<string>",
  "trunk_status": "<string>",
  "secure": true,
  "trunk_direction": "<string>",
  "concurrent_calls_limit": 123,
  "cps_limit": 123,
  "description": "<string>",
  "transport": "<string>",
  "recording": true,
  "enable_transcription": true,
  "pii_redaction": true,
  "webhook_method": "<string>",
  "recording_webhook_enabled": true,
  "created_at": "<string>",
  "updated_at": "<string>"
}
{
"trunk_id": "aabbccdd-1234-5678-90ab-cdef12345678",
"account_id": "MA_XXXXXXXX",
"name": "My Outbound Trunk",
"trunk_domain": "aabbccdd-1234-5678-90ab-cdef12345678.sip.vobiz.ai",
"trunk_status": "active",
"secure": false,
"trunk_direction": "outbound",
"concurrent_calls_limit": 10,
"cps_limit": 2,
"description": "",
"transport": "udp",
"recording": false,
"enable_transcription": false,
"pii_redaction": false,
"webhook_method": "POST",
"recording_webhook_enabled": false,
"created_at": "2026-03-25T05:11:52.054462Z",
"updated_at": "2026-03-25T05:11:52.054462Z"
}
POST https://api.vobiz.ai/api/v1/Account/{auth_id}/trunks
Use this endpoint to create a new SIP trunk for handling voice traffic. Each trunk can be configured with rate limits, authentication methods (credentials and IP ACLs), and origination URIs for outbound routing.
Authentication required:
  • X-Auth-ID - Your account Auth ID
  • X-Auth-Token - Your account Auth Token
  • Content-Type: application/json
Auto-Generated Domain: Upon creation, Vobiz automatically generates a unique SIP domain for your trunk in the format: trunk_id.sip.vobiz.ai. This domain is used for routing inbound calls to your trunk.

Request Parameters

Only three fields are required to create a trunk. The rest of the trunk’s configuration - transport, TLS/SRTP, recording, attached credentials, IP ACLs, and origination URIs - is applied afterwards through the dedicated endpoints or the Console.
FieldTypeRequiredDescription
namestringYesDescriptive name for the trunk. Maximum 255 characters.
trunk_typestringYesTrunk direction. One of INBOUND or OUTBOUND (uppercase). Determines how the trunk routes traffic.
max_concurrent_callsintegerYesMaximum number of simultaneous calls. Returned on the trunk object as concurrent_calls_limit.
Defaults applied at creation. New trunks come back with cps_limit: 2, secure: false, transport: udp, and trunk_status: active. The trunk_domain is auto-generated as {trunk_id}.sip.vobiz.ai. Tune limits later with Update a Trunk, and attach auth and routing with Credentials, IP ACLs, and Origination URIs.
cps_limit vs concurrent_calls_limit. cps_limit caps how many new calls can be started per second (flood protection); concurrent_calls_limit caps how many calls can be live at once (capacity and cost control). They are independent.

Examples

curl -X POST https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks \
  -H "X-Auth-ID: AUTH_ID" \
  -H "X-Auth-Token: AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My SIP Trunk",
    "trunk_type": "OUTBOUND",
    "max_concurrent_calls": 10
  }'
const response = await fetch(
  'https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks',
  {
    method: 'POST',
    headers: {
      'X-Auth-ID': 'AUTH_ID',
      'X-Auth-Token': 'AUTH_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      name: 'My SIP Trunk',
      trunk_type: 'OUTBOUND',
      max_concurrent_calls: 10,
    }),
  }
);
const trunk = await response.json();
console.log(trunk.trunk_id);
import requests

response = requests.post(
    "https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks",
    headers={
        "X-Auth-ID": "AUTH_ID",
        "X-Auth-Token": "AUTH_TOKEN",
        "Content-Type": "application/json",
    },
    json={
        "name": "My SIP Trunk",
        "trunk_type": "OUTBOUND",
        "max_concurrent_calls": 10,
    },
)
trunk = response.json()
print(trunk["trunk_id"])
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

func main() {
    body, _ := json.Marshal(map[string]any{
        "name":                 "My SIP Trunk",
        "trunk_type":           "OUTBOUND",
        "max_concurrent_calls": 10,
    })
    req, _ := http.NewRequest("POST",
        "https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks",
bytes.NewBuffer(body))
    req.Header.Set("X-Auth-ID", "AUTH_ID")
    req.Header.Set("X-Auth-Token", "AUTH_TOKEN")
    req.Header.Set("Content-Type", "application/json")

    resp, _ := (&http.Client{}).Do(req)
    defer resp.Body.Close()
    var trunk map[string]any
    json.NewDecoder(resp.Body).Decode(&trunk)
    fmt.Println(trunk["trunk_id"])
}
require 'net/http'
require 'uri'
require 'json'

uri = URI('https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks')
req = Net::HTTP::Post.new(uri)
req['X-Auth-ID'] = 'AUTH_ID'
req['X-Auth-Token'] = 'AUTH_TOKEN'
req['Content-Type'] = 'application/json'
req.body = {
  name: 'My SIP Trunk',
  trunk_type: 'OUTBOUND',
  max_concurrent_calls: 10
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts JSON.parse(res.body)['trunk_id']
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Auth-ID", "AUTH_ID");
client.DefaultRequestHeaders.Add("X-Auth-Token", "AUTH_TOKEN");

var payload = new StringContent(
    System.Text.Json.JsonSerializer.Serialize(new {
name = "My SIP Trunk",
trunk_type = "OUTBOUND",
max_concurrent_calls = 10
    }),
    System.Text.Encoding.UTF8,
    "application/json");

var res = await client.PostAsync(
    "https://api.vobiz.ai/api/v1/Account/AUTH_ID/trunks", payload);
Console.WriteLine(await res.Content.ReadAsStringAsync());

Response

Returns the complete trunk object, including the auto-generated trunk_id UUID and timestamps.
Response - 201 Created
{
  "trunk_id": "aabbccdd-1234-5678-90ab-cdef12345678",
  "account_id": "MA_XXXXXXXX",
  "name": "My Outbound Trunk",
  "trunk_domain": "aabbccdd-1234-5678-90ab-cdef12345678.sip.vobiz.ai",
  "trunk_status": "active",
  "secure": false,
  "trunk_direction": "both",
  "concurrent_calls_limit": 10,
  "cps_limit": 2,
  "description": "",
  "transport": "udp",
  "recording": false,
  "enable_transcription": false,
  "pii_redaction": false,
  "webhook_method": "POST",
  "recording_webhook_enabled": false,
  "created_at": "2026-05-12T05:11:52.054462Z",
  "updated_at": "2026-05-12T05:11:52.054462Z"
}
Next Steps:
  • Save the trunk_id for all future operations
  • Add credentials or IP ACLs for authentication
  • Configure origination URIs for outbound call routing
  • Test the trunk with a sample call before production use

Authorizations

X-Auth-ID
string
header
required

Your Vobiz account Auth ID

X-Auth-Token
string
header
required

Your Vobiz account Auth Token

Path Parameters

auth_id
string
required

Your account Auth ID

Example:

"MA_XXXXXX"

Body

application/json
name
string
required

Trunk name.

Maximum string length: 100
trunk_direction
enum<string>

Direction of the trunk — inbound or outbound only (a trunk is one direction, not both).

Available options:
inbound,
outbound
trunk_status
enum<string>

Trunk status — enabled or disabled (note: not active).

Available options:
enabled,
disabled
secure
boolean
trunk_domain
string

SIP domain. Auto-generated as {first8ofUUID}.sip.vobiz.ai if omitted.

Maximum string length: 255
transport
enum<string>
Available options:
udp,
tcp,
tls
inbound_destination
string
Maximum string length: 255
description
string
Maximum string length: 500
concurrent_calls_limit
integer

Stored on the trunk. The enforced concurrency limit is account-level (account base + channel subscriptions), not this field.

Required range: 0 <= x <= 1000
cps_limit
integer

Stored on the trunk. The enforced CPS is account-level, not this field.

Required range: 0 <= x <= 100
credential_uuid
string

Attach an existing SIP credential (username / password / realm) by UUID.

ipacl_uuid
string

Attach an existing IP access-control list (IP-based auth) by UUID.

primary_uri_uuid
string

Primary origination URI UUID.

fallback_uri_uuid
string

Fallback origination URI UUID.

recording
boolean
default:false

Enable call recording.

enable_transcription
boolean
default:false

Auto-transcribe recordings when recording=true.

pii_redaction
boolean
default:false

Redact PII from transcriptions.

pii_entity_types
string

Comma-separated list of entity types to redact.

webhook_url
string

Customer webhook for call-admission events (CallInitiated / Hangup). Must be a valid public http/https URL. SSRF-validated — localhost, private (RFC1918), and cloud-metadata (169.254.169.254) URLs are rejected with invalid webhook_url. See Trunk Webhooks.

Maximum string length: 500
Example:

"https://example.com/vobiz/webhook"

webhook_method
enum<string>
default:POST

HTTP method for the webhook callback.

Available options:
POST,
GET
recording_webhook_enabled
boolean
default:false

Fire a recording.completed webhook to webhook_url after a recording is saved.

username
string
deprecated

Deprecated — use credential_uuid.

Maximum string length: 100
password
string
deprecated

Deprecated — use credential_uuid.

Maximum string length: 100
ip_whitelist
string[]
deprecated

Deprecated — use ipacl_uuid.

Response

Success

trunk_id
string
required
account_id
string
required
name
string
required
trunk_domain
string
required
trunk_status
string
required
secure
boolean
required
trunk_direction
string
required
concurrent_calls_limit
integer
required
cps_limit
integer
required
description
string
required
transport
string
required
recording
boolean
required
enable_transcription
boolean
required
pii_redaction
boolean
required
webhook_method
string
required
recording_webhook_enabled
boolean
required
created_at
string
required
updated_at
string
required