Place a member in a binary or matrix tree
Requires a persisted company admin identity and members.manage (or users.update); droplet tokens are not supported. The company must be enabled for legged trees (legged_trees_not_enabled otherwise), and the tree must be binary or matrix: unilevel trees, including the default enrollment and sponsor trees, are seated from enrollment and refuse this request with unsupported_tree_kind. Name the slot with parent_node_id and leg, or send a rule with the parent_node_id its search starts from: first_empty, left and right are supported; inside, outside and balanced fail with rule_not_confirmed, enroller_preference with preference_not_available, and weak_leg and strong_leg with volume_not_available. Rule searches never place below a discarded member’s seat: first_empty skips it, and left or right stop above it (no_open_leg). The rule defer takes no parent and places the member in the tree’s holding tank, returning the held seat with held_until. The placing admin is recorded on the placement. The example uses illustrative IDs.
curl -X POST 'https://api.fluid.app/api/company/v2026-10/genealogy/trees/7096ad49-7117-53f6-8f7f-4805473d14c5/nodes' \
-H 'Authorization: Bearer <company-token>' \
-H 'Content-Type: application/json' \
--data \{\"node\":\{\"member_id\":\"019e5b8a-4c10-7000-8000-000000000002\",\"parent_node_id\":\"019e5b8a-4c10-7000-8000-000000000001\",\"rule\":\"first_empty\"\}\}import requests
url = "https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes"
payload = { "node": {
"member_id": "019e5b8a-4c10-7000-8000-000000000002",
"parent_node_id": "019e5b8a-4c10-7000-8000-000000000001",
"rule": "first_empty",
"reason": "New enrollment"
} }
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({
node: {
member_id: '019e5b8a-4c10-7000-8000-000000000002',
parent_node_id: '019e5b8a-4c10-7000-8000-000000000001',
rule: 'first_empty',
reason: 'New enrollment'
}
})
};
fetch('https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes', 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/{tree_id}/nodes",
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([
'node' => [
'member_id' => '019e5b8a-4c10-7000-8000-000000000002',
'parent_node_id' => '019e5b8a-4c10-7000-8000-000000000001',
'rule' => 'first_empty',
'reason' => 'New enrollment'
]
]),
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/{tree_id}/nodes"
payload := strings.NewReader("{\n \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\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/{tree_id}/nodes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes")
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 \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"node": {
"id": "019e5b8a-4c10-7000-8000-000000000003",
"tree_id": "7096ad49-7117-53f6-8f7f-4805473d14c5",
"member_id": "019e5b8a-4c10-7000-8000-000000000002",
"parent_node_id": "019e5b8a-4c10-7000-8000-000000000001",
"leg": "left",
"position": 0,
"pinned": false,
"held_until": null
},
"meta": {
"request_uuid": null,
"timestamp": "2026-09-29T00:00:00Z"
}
}{
"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"
}
}{
"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.
Path Parameters
Binary or matrix tree UUID in the authenticated company.
Body
The member to place and either the slot or a placement rule.
A member to place, and either the slot or a placement rule.
Show child attributes
Show child attributes
curl -X POST 'https://api.fluid.app/api/company/v2026-10/genealogy/trees/7096ad49-7117-53f6-8f7f-4805473d14c5/nodes' \
-H 'Authorization: Bearer <company-token>' \
-H 'Content-Type: application/json' \
--data \{\"node\":\{\"member_id\":\"019e5b8a-4c10-7000-8000-000000000002\",\"parent_node_id\":\"019e5b8a-4c10-7000-8000-000000000001\",\"rule\":\"first_empty\"\}\}import requests
url = "https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes"
payload = { "node": {
"member_id": "019e5b8a-4c10-7000-8000-000000000002",
"parent_node_id": "019e5b8a-4c10-7000-8000-000000000001",
"rule": "first_empty",
"reason": "New enrollment"
} }
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({
node: {
member_id: '019e5b8a-4c10-7000-8000-000000000002',
parent_node_id: '019e5b8a-4c10-7000-8000-000000000001',
rule: 'first_empty',
reason: 'New enrollment'
}
})
};
fetch('https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes', 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/{tree_id}/nodes",
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([
'node' => [
'member_id' => '019e5b8a-4c10-7000-8000-000000000002',
'parent_node_id' => '019e5b8a-4c10-7000-8000-000000000001',
'rule' => 'first_empty',
'reason' => 'New enrollment'
]
]),
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/{tree_id}/nodes"
payload := strings.NewReader("{\n \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\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/{tree_id}/nodes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/genealogy/trees/{tree_id}/nodes")
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 \"node\": {\n \"member_id\": \"019e5b8a-4c10-7000-8000-000000000002\",\n \"parent_node_id\": \"019e5b8a-4c10-7000-8000-000000000001\",\n \"rule\": \"first_empty\",\n \"reason\": \"New enrollment\"\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"node": {
"id": "019e5b8a-4c10-7000-8000-000000000003",
"tree_id": "7096ad49-7117-53f6-8f7f-4805473d14c5",
"member_id": "019e5b8a-4c10-7000-8000-000000000002",
"parent_node_id": "019e5b8a-4c10-7000-8000-000000000001",
"leg": "left",
"position": 0,
"pinned": false,
"held_until": null
},
"meta": {
"request_uuid": null,
"timestamp": "2026-09-29T00:00:00Z"
}
}{
"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"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}