curl --request PUT \
--url https://app.famulor.io/api/v1/leads/{id}/channels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channels": [
{
"platform": "teams",
"external_user_id": "29:customer-routing-id",
"display_name": "Ada Lovelace",
"connection_name": "Customer Support"
}
]
}
'import requests
url = "https://app.famulor.io/api/v1/leads/{id}/channels"
payload = { "channels": [
{
"platform": "teams",
"external_user_id": "29:customer-routing-id",
"display_name": "Ada Lovelace",
"connection_name": "Customer Support"
}
] }
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({
channels: [
{
platform: 'teams',
external_user_id: '29:customer-routing-id',
display_name: 'Ada Lovelace',
connection_name: 'Customer Support'
}
]
})
};
fetch('https://app.famulor.io/api/v1/leads/{id}/channels', 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/leads/{id}/channels",
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([
'channels' => [
[
'platform' => 'teams',
'external_user_id' => '29:customer-routing-id',
'display_name' => 'Ada Lovelace',
'connection_name' => 'Customer Support'
]
]
]),
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/leads/{id}/channels"
payload := strings.NewReader("{\n \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\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.famulor.io/api/v1/leads/{id}/channels")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/leads/{id}/channels")
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 \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"platform": "sms",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"contact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"external_user_id": "<string>",
"username": "<string>",
"display_name": "<string>",
"attributes": {},
"connection_name": "<string>",
"last_seen_at": "2023-11-07T05:31:56Z"
}
]
}Replace contact channels
Replace the contact’s manually managed channel profiles. For Microsoft Teams, provide the visible connection_name; it may be omitted only when exactly one Teams identity connection is active. Active Teams connection names are unique within a workspace, and reconnected copies of the same Microsoft identity are normalized to one current connection name. A user identity already linked to another contact returns a conflict and never merges records. Required scope: leads:write (legacy calls:write is also accepted).
curl --request PUT \
--url https://app.famulor.io/api/v1/leads/{id}/channels \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channels": [
{
"platform": "teams",
"external_user_id": "29:customer-routing-id",
"display_name": "Ada Lovelace",
"connection_name": "Customer Support"
}
]
}
'import requests
url = "https://app.famulor.io/api/v1/leads/{id}/channels"
payload = { "channels": [
{
"platform": "teams",
"external_user_id": "29:customer-routing-id",
"display_name": "Ada Lovelace",
"connection_name": "Customer Support"
}
] }
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({
channels: [
{
platform: 'teams',
external_user_id: '29:customer-routing-id',
display_name: 'Ada Lovelace',
connection_name: 'Customer Support'
}
]
})
};
fetch('https://app.famulor.io/api/v1/leads/{id}/channels', 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/leads/{id}/channels",
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([
'channels' => [
[
'platform' => 'teams',
'external_user_id' => '29:customer-routing-id',
'display_name' => 'Ada Lovelace',
'connection_name' => 'Customer Support'
]
]
]),
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/leads/{id}/channels"
payload := strings.NewReader("{\n \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\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.famulor.io/api/v1/leads/{id}/channels")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/leads/{id}/channels")
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 \"channels\": [\n {\n \"platform\": \"teams\",\n \"external_user_id\": \"29:customer-routing-id\",\n \"display_name\": \"Ada Lovelace\",\n \"connection_name\": \"Customer Support\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"platform": "sms",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"contact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"external_user_id": "<string>",
"username": "<string>",
"display_name": "<string>",
"attributes": {},
"connection_name": "<string>",
"last_seen_at": "2023-11-07T05:31:56Z"
}
]
}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
Audience contact ID.
Body
50Show child attributes
Show child attributes
Response
Updated contact channel profiles.
Show child attributes
Show child attributes