curl --request POST \
--url https://app.famulor.io/api/v1/workspace/transfer-ownership \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/workspace/transfer-ownership"
payload = {
"member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
member_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
expected_owner_user_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/workspace/transfer-ownership', 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/workspace/transfer-ownership",
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([
'member_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'expected_owner_user_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/workspace/transfer-ownership"
payload := strings.NewReader("{\n \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/workspace/transfer-ownership")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/workspace/transfer-ownership")
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 \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"owner_member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"previous_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"previous_owner_role": "admin"
}
}Transfer workspace ownership
Appoint an existing active, verified member as owner. Requires settings:write and a user-owned credential belonging to the current owner; service-account credentials cannot transfer ownership. The previous owner stays as admin. Plan, credits, numbers, workspace data, payment methods and billing details are preserved. Read the current owner from List team members and provide their user ID as the expected owner to reject stale requests. The previous owner’s user-bound API and OAuth credentials may be revoked by the role change; service-account credentials remain in place. The previous owner’s personal API keys and OAuth access for this workspace are revoked; workspace service credentials stay active.
curl --request POST \
--url https://app.famulor.io/api/v1/workspace/transfer-ownership \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://app.famulor.io/api/v1/workspace/transfer-ownership"
payload = {
"member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expected_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
member_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
expected_owner_user_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.famulor.io/api/v1/workspace/transfer-ownership', 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/workspace/transfer-ownership",
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([
'member_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'expected_owner_user_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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/workspace/transfer-ownership"
payload := strings.NewReader("{\n \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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/workspace/transfer-ownership")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/workspace/transfer-ownership")
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 \"member_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"expected_owner_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"owner_member_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"previous_owner_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"previous_owner_role": "admin"
}
}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.
Body
Response
Success.
Show child attributes
Show child attributes