Genealogy
Add a tree definition
Company admin access is required. Writes require developer.update. Droplet installation tokens are not supported. This registry API does not place or move members. Default role trees cannot be removed or have their role cleared. The example uses illustrative fixture IDs. Substitute records visible to your authenticated company or member.
POST
/
api
/
company
/
v2026-10
/
genealogy
/
trees
Add a tree definition
curl -X POST 'https://api.fluid.app/api/company/v2026-10/genealogy/trees' \
-H 'Authorization: Bearer <company-token>' \
-H 'Content-Type: application/json' \
--data \{\"tree\":\{\"key\":\"service-team\",\"name\":\"Service\ Team\",\"kind\":\"unilevel\",\"authority\":\"unconfigured\"\}\}import requests
url = "https://api.fluid.app/api/company/v2026-10/genealogy/trees"
payload = { "tree": {
"key": "service-team",
"name": "Service Team",
"kind": "unilevel",
"authority": "unconfigured"
} }
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({
tree: {
key: 'service-team',
name: 'Service Team',
kind: 'unilevel',
authority: 'unconfigured'
}
})
};
fetch('https://api.fluid.app/api/company/v2026-10/genealogy/trees', 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://api.fluid.app/api/company/v2026-10/genealogy/trees",
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([
'tree' => [
'key' => 'service-team',
'name' => 'Service Team',
'kind' => 'unilevel',
'authority' => 'unconfigured'
]
]),
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://api.fluid.app/api/company/v2026-10/genealogy/trees"
payload := strings.NewReader("{\n \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\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://api.fluid.app/api/company/v2026-10/genealogy/trees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/genealogy/trees")
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 \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\n}"
response = http.request(request)
puts response.read_body{
"tree": {
"allow_multiple_positions": false,
"authority": "unconfigured",
"created_at": "2026-09-10T03:03:17Z",
"default_placement_rule": "exact",
"external_integration_market_id": null,
"holding_tank_days": 0,
"id": "01a08945-0695-7e9b-80d5-76cd56d540e4",
"key": "service-team",
"kind": "unilevel",
"leg_names": [],
"lock_version": 0,
"max_depth": 300,
"max_movement_levels": 0,
"movement_approval": "immediate",
"movement_window_days": 0,
"name": "Service Team",
"owning_company_integration_id": null,
"role": null,
"updated_at": "2026-09-10T03:03:17Z",
"upstream_tree_ref": null,
"volume_key": null,
"volume_on_move": null
},
"status": 201,
"meta": {
"request_uuid": null,
"timestamp": "2026-09-10T03:03:17Z"
}
}{
"message": "<string>",
"error": "<unknown>"
}{
"message": "<string>",
"error": "<unknown>"
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Company admin or company service token, subject to developer permissions.
Body
application/json
Tree definition fields. Ownership must be declared explicitly on creation.
Show child attributes
Show child attributes
⌘I
Add a tree definition
curl -X POST 'https://api.fluid.app/api/company/v2026-10/genealogy/trees' \
-H 'Authorization: Bearer <company-token>' \
-H 'Content-Type: application/json' \
--data \{\"tree\":\{\"key\":\"service-team\",\"name\":\"Service\ Team\",\"kind\":\"unilevel\",\"authority\":\"unconfigured\"\}\}import requests
url = "https://api.fluid.app/api/company/v2026-10/genealogy/trees"
payload = { "tree": {
"key": "service-team",
"name": "Service Team",
"kind": "unilevel",
"authority": "unconfigured"
} }
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({
tree: {
key: 'service-team',
name: 'Service Team',
kind: 'unilevel',
authority: 'unconfigured'
}
})
};
fetch('https://api.fluid.app/api/company/v2026-10/genealogy/trees', 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://api.fluid.app/api/company/v2026-10/genealogy/trees",
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([
'tree' => [
'key' => 'service-team',
'name' => 'Service Team',
'kind' => 'unilevel',
'authority' => 'unconfigured'
]
]),
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://api.fluid.app/api/company/v2026-10/genealogy/trees"
payload := strings.NewReader("{\n \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\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://api.fluid.app/api/company/v2026-10/genealogy/trees")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/genealogy/trees")
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 \"tree\": {\n \"key\": \"service-team\",\n \"name\": \"Service Team\",\n \"kind\": \"unilevel\",\n \"authority\": \"unconfigured\"\n }\n}"
response = http.request(request)
puts response.read_body{
"tree": {
"allow_multiple_positions": false,
"authority": "unconfigured",
"created_at": "2026-09-10T03:03:17Z",
"default_placement_rule": "exact",
"external_integration_market_id": null,
"holding_tank_days": 0,
"id": "01a08945-0695-7e9b-80d5-76cd56d540e4",
"key": "service-team",
"kind": "unilevel",
"leg_names": [],
"lock_version": 0,
"max_depth": 300,
"max_movement_levels": 0,
"movement_approval": "immediate",
"movement_window_days": 0,
"name": "Service Team",
"owning_company_integration_id": null,
"role": null,
"updated_at": "2026-09-10T03:03:17Z",
"upstream_tree_ref": null,
"volume_key": null,
"volume_on_move": null
},
"status": 201,
"meta": {
"request_uuid": null,
"timestamp": "2026-09-10T03:03:17Z"
}
}{
"message": "<string>",
"error": "<unknown>"
}{
"message": "<string>",
"error": "<unknown>"
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}