curl --request PATCH \
--url https://app.famulor.io/api/v1/sip-trunks/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"outbound_from_user_mode": "phone_number",
"outbound_caller_id_header": "from_display"
}
'import requests
url = "https://app.famulor.io/api/v1/sip-trunks/{id}"
payload = {
"outbound_from_user_mode": "phone_number",
"outbound_caller_id_header": "from_display"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
outbound_from_user_mode: 'phone_number',
outbound_caller_id_header: 'from_display'
})
};
fetch('https://app.famulor.io/api/v1/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.famulor.io/api/v1/sip-trunks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'outbound_from_user_mode' => 'phone_number',
'outbound_caller_id_header' => 'from_display'
]),
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.famulor.io/api/v1/sip-trunks/{id}"
payload := strings.NewReader("{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.famulor.io/api/v1/sip-trunks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sip-trunks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "st1b2c3d-0000-4000-8000-000000000050",
"name": "My SIP provider",
"provider": "custom",
"sip_address": "sip.example-provider.com",
"auth_username": "acme",
"numbers": [
"+4930123456"
],
"metadata": {},
"created_at": "2026-06-01T12:00:00Z",
"updated_at": "2026-06-01T12:00:00Z"
}
}Update outbound SIP identity
Updates only the outbound identity policy for your own SIP trunk. Incoming routing, phone numbers and provider connections are preserved. Requires sip_trunks:write. Existing configurations keep phone_number until explicitly changed.
curl --request PATCH \
--url https://app.famulor.io/api/v1/sip-trunks/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"outbound_from_user_mode": "phone_number",
"outbound_caller_id_header": "from_display"
}
'import requests
url = "https://app.famulor.io/api/v1/sip-trunks/{id}"
payload = {
"outbound_from_user_mode": "phone_number",
"outbound_caller_id_header": "from_display"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
outbound_from_user_mode: 'phone_number',
outbound_caller_id_header: 'from_display'
})
};
fetch('https://app.famulor.io/api/v1/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.famulor.io/api/v1/sip-trunks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'outbound_from_user_mode' => 'phone_number',
'outbound_caller_id_header' => 'from_display'
]),
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.famulor.io/api/v1/sip-trunks/{id}"
payload := strings.NewReader("{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.famulor.io/api/v1/sip-trunks/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sip-trunks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"outbound_from_user_mode\": \"phone_number\",\n \"outbound_caller_id_header\": \"from_display\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "st1b2c3d-0000-4000-8000-000000000050",
"name": "My SIP provider",
"provider": "custom",
"sip_address": "sip.example-provider.com",
"auth_username": "acme",
"numbers": [
"+4930123456"
],
"metadata": {},
"created_at": "2026-06-01T12:00:00Z",
"updated_at": "2026-06-01T12:00:00Z"
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Path Parameters
SIP trunk ID.
Body
Outbound From user for your own SIP trunk. Phone number preserves the existing behavior. SIP username uses the authentication username and keeps the primary DID unchanged. Not available on imported carrier connections.
phone_number, auth_username Used with SIP username identity. The primary international DID is sent in the From display name and optionally the selected identity header. Match the carrier caller ID settings.
from_display, p_asserted_identity, p_preferred_identity Response
The SIP trunk (sanitized).
Customer-owned BYO/BYOC SIP trunk. Managed platform trunks, passwords, and internal trunk identifiers are never returned.
Show child attributes
Show child attributes