Update SIP trunk
curl --request PUT \
--url https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phone_number": "<string>",
"nickname": "<string>",
"sip_username": "<string>",
"sip_password": "<string>",
"sip_address": "<string>",
"sip_calling_format": "<string>",
"inbound_authorization_type": "<string>",
"allowed_inbound_ips": [
{}
],
"country_code": "<string>",
"outbound_proxy": true
}
'import requests
url = "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}"
payload = {
"phone_number": "<string>",
"nickname": "<string>",
"sip_username": "<string>",
"sip_password": "<string>",
"sip_address": "<string>",
"sip_calling_format": "<string>",
"inbound_authorization_type": "<string>",
"allowed_inbound_ips": [{}],
"country_code": "<string>",
"outbound_proxy": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone_number: '<string>',
nickname: '<string>',
sip_username: '<string>',
sip_password: '<string>',
sip_address: '<string>',
sip_calling_format: '<string>',
inbound_authorization_type: '<string>',
allowed_inbound_ips: [{}],
country_code: '<string>',
outbound_proxy: true
})
};
fetch('https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'phone_number' => '<string>',
'nickname' => '<string>',
'sip_username' => '<string>',
'sip_password' => '<string>',
'sip_address' => '<string>',
'sip_calling_format' => '<string>',
'inbound_authorization_type' => '<string>',
'allowed_inbound_ips' => [
[
]
],
'country_code' => '<string>',
'outbound_proxy' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}"
payload := strings.NewReader("{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}"
response = http.request(request)
puts response.read_body{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "new_username",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "auth",
"allowed_inbound_ips": null,
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_newtrunkid2",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "myuser",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "ip",
"allowed_inbound_ips": ["203.0.113.10"],
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_yyyyyyyyyyyy",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"error": "SIP trunk not found."
}
{
"message": "The given data was invalid.",
"errors": {
"allowed_inbound_ips": ["At least one allowed IP address is required when authorization type is \"ip\"."]
}
}
{
"error": "Failed to update SIP trunk. Please try again or contact support."
}
SIP Trunks
Update SIP trunk
Update an existing SIP trunk configuration
PUT
/
user
/
phone-numbers
/
sip-trunks
/
{id}
Update SIP trunk
curl --request PUT \
--url https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phone_number": "<string>",
"nickname": "<string>",
"sip_username": "<string>",
"sip_password": "<string>",
"sip_address": "<string>",
"sip_calling_format": "<string>",
"inbound_authorization_type": "<string>",
"allowed_inbound_ips": [
{}
],
"country_code": "<string>",
"outbound_proxy": true
}
'import requests
url = "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}"
payload = {
"phone_number": "<string>",
"nickname": "<string>",
"sip_username": "<string>",
"sip_password": "<string>",
"sip_address": "<string>",
"sip_calling_format": "<string>",
"inbound_authorization_type": "<string>",
"allowed_inbound_ips": [{}],
"country_code": "<string>",
"outbound_proxy": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phone_number: '<string>',
nickname: '<string>',
sip_username: '<string>',
sip_password: '<string>',
sip_address: '<string>',
sip_calling_format: '<string>',
inbound_authorization_type: '<string>',
allowed_inbound_ips: [{}],
country_code: '<string>',
outbound_proxy: true
})
};
fetch('https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'phone_number' => '<string>',
'nickname' => '<string>',
'sip_username' => '<string>',
'sip_password' => '<string>',
'sip_address' => '<string>',
'sip_calling_format' => '<string>',
'inbound_authorization_type' => '<string>',
'allowed_inbound_ips' => [
[
]
],
'country_code' => '<string>',
'outbound_proxy' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}"
payload := strings.NewReader("{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/user/phone-numbers/sip-trunks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"phone_number\": \"<string>\",\n \"nickname\": \"<string>\",\n \"sip_username\": \"<string>\",\n \"sip_password\": \"<string>\",\n \"sip_address\": \"<string>\",\n \"sip_calling_format\": \"<string>\",\n \"inbound_authorization_type\": \"<string>\",\n \"allowed_inbound_ips\": [\n {}\n ],\n \"country_code\": \"<string>\",\n \"outbound_proxy\": true\n}"
response = http.request(request)
puts response.read_body{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "new_username",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "auth",
"allowed_inbound_ips": null,
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_newtrunkid2",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "myuser",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "ip",
"allowed_inbound_ips": ["203.0.113.10"],
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_yyyyyyyyyyyy",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"error": "SIP trunk not found."
}
{
"message": "The given data was invalid.",
"errors": {
"allowed_inbound_ips": ["At least one allowed IP address is required when authorization type is \"ip\"."]
}
}
{
"error": "Failed to update SIP trunk. Please try again or contact support."
}
This endpoint updates an existing SIP trunk. Only include the fields you want to change — partial updates are supported. Changing credentials, address, or proxy settings automatically re-provisions the affected voice infrastructure trunks.
Fields like
Path Parameters
integer
required
The unique identifier of the SIP trunk to update
Body Parameters
All fields are optional. Only send the fields you want to update.string
The SIP extension or phone number (1-15 characters)
string
A short, human-friendly label for the trunk. Maximum 50 characters. Send
null to clear it.string
Username for SIP authentication (3-128 characters)
string
Password for SIP authentication (minimum 3 characters)
string
The SIP server address without port
string
The outbound calling number format:
+e164, e164, or nationalstring
How inbound calls are authenticated:
auth or ip. When switching to ip, you must also provide allowed_inbound_ips. When switching to auth, any existing IP whitelist is cleared.array
Array of IP addresses allowed for inbound calls. Required when
inbound_authorization_type is set to ip.string
ISO 3166-2 country code
boolean
Route outbound calls through a fixed IP address
Response
string
Success message
object
The updated SIP trunk object (same fields as Get SIP trunk)
{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "new_username",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "auth",
"allowed_inbound_ips": null,
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_newtrunkid2",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"message": "SIP trunk updated successfully.",
"data": {
"id": 42,
"phone_number": "1000",
"nickname": "Provider X — Main",
"sip_username": "myuser",
"sip_address": "sip.provider.com",
"sip_calling_format": "+e164",
"inbound_authorization_type": "ip",
"allowed_inbound_ips": ["203.0.113.10"],
"outbound_proxy": false,
"country_code": "US",
"inbound_trunk_id": "ST_newtrunkid1",
"outbound_trunk_id": "ST_yyyyyyyyyyyy",
"created_at": "2026-03-31T10:00:00.000000Z",
"updated_at": "2026-03-31T12:00:00.000000Z"
}
}
{
"error": "SIP trunk not found."
}
{
"message": "The given data was invalid.",
"errors": {
"allowed_inbound_ips": ["At least one allowed IP address is required when authorization type is \"ip\"."]
}
}
{
"error": "Failed to update SIP trunk. Please try again or contact support."
}
Re-provisioning behavior
The following field changes trigger automatic re-provisioning of voice infrastructure trunks:| Field changed | Inbound trunk | Outbound trunk |
|---|---|---|
sip_username | Re-created | Re-created |
sip_password | Re-created | Re-created |
sip_address | — | Re-created |
phone_number | Re-created | Re-created |
inbound_authorization_type | Re-created | — |
allowed_inbound_ips | Re-created | — |
outbound_proxy | — | Re-created |
sip_calling_format, country_code are stored locally and do not trigger re-provisioning.⌘I

