curl --request POST \
--url https://app.famulor.io/api/v1/sip-trunks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My SIP provider",
"sip_address": "sip.example-provider.com",
"numbers": [
"+4930123456"
],
"auth_username": "acme",
"auth_password": "s3cret"
}
'import requests
url = "https://app.famulor.io/api/v1/sip-trunks"
payload = {
"name": "My SIP provider",
"sip_address": "sip.example-provider.com",
"numbers": ["+4930123456"],
"auth_username": "acme",
"auth_password": "s3cret"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My SIP provider',
sip_address: 'sip.example-provider.com',
numbers: ['+4930123456'],
auth_username: 'acme',
auth_password: 's3cret'
})
};
fetch('https://app.famulor.io/api/v1/sip-trunks', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'My SIP provider',
'sip_address' => 'sip.example-provider.com',
'numbers' => [
'+4930123456'
],
'auth_username' => 'acme',
'auth_password' => 's3cret'
]),
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"
payload := strings.NewReader("{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.famulor.io/api/v1/sip-trunks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sip-trunks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}"
response = http.request(request)
puts response.read_bodyCreate a SIP trunk
Registers your own SIP provider for inbound and outbound calling. Supports DID or Extension (trunk_kind), calling-number format, transport, and advanced options (secure trunking, headers, codecs). Use this to bring your own numbers instead of buying from the marketplace. See BYO SIP trunk. Required scope: sip_trunks:write (keys without scope restrictions have full access).
curl --request POST \
--url https://app.famulor.io/api/v1/sip-trunks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "My SIP provider",
"sip_address": "sip.example-provider.com",
"numbers": [
"+4930123456"
],
"auth_username": "acme",
"auth_password": "s3cret"
}
'import requests
url = "https://app.famulor.io/api/v1/sip-trunks"
payload = {
"name": "My SIP provider",
"sip_address": "sip.example-provider.com",
"numbers": ["+4930123456"],
"auth_username": "acme",
"auth_password": "s3cret"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'My SIP provider',
sip_address: 'sip.example-provider.com',
numbers: ['+4930123456'],
auth_username: 'acme',
auth_password: 's3cret'
})
};
fetch('https://app.famulor.io/api/v1/sip-trunks', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'My SIP provider',
'sip_address' => 'sip.example-provider.com',
'numbers' => [
'+4930123456'
],
'auth_username' => 'acme',
'auth_password' => 's3cret'
]),
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"
payload := strings.NewReader("{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.famulor.io/api/v1/sip-trunks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sip-trunks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"My SIP provider\",\n \"sip_address\": \"sip.example-provider.com\",\n \"numbers\": [\n \"+4930123456\"\n ],\n \"auth_username\": \"acme\",\n \"auth_password\": \"s3cret\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
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.
Body
Provider termination host, e.g. sip.provider.com (no sip: prefix, no port).
Exactly one inbound match number is required. DID: E.164. Extension: E.164 or national digits without country code.
1 elementdid, extension twilio, custom Stored server-side; never returned by the API.
Stored server-side; never returned by the API.
shared, separate credentials, none auto, udp, tcp, tls e164_plus, e164_no_plus, national ISO-3166 alpha-2 for outbound region pinning, or empty for automatic.
TLS signaling + SRTP media.
allow, require, disable Custom outbound INVITE headers (max 10).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
none, x, all PCMU, PCMA, G722, AMR-WB 1 <= x <= 36005 <= x <= 600May include inbound auth mode (inbound_auth, allowed_addresses) and region hints.
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 created 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