Preview a member genealogy move
Requires a writable opaque member token, a portal JWT or a verified One Auth identity access token for a non-impersonated rep or shopper. A legacy member session JWT that resolves to the current member is read-only and returns 403. A portal JWT minted read-only is refused with 401 on a write, by the legacy authentication these routes also run, as are a root admin portal JWT, an admin portal JWT with no rep membership of its own, and any other non-member credential. Writes share the member API limit of 120 requests per minute per bearer credential, and return 429 beyond it. Requires the bearer member’s current rep eligibility and movement policy. The moved node and destination must remain within the member’s current team; no member or actor selector is accepted. Previews do not write or enqueue work. Incomplete previews return validation_incomplete among the violations; submit a move to request deferred validation. The example uses illustrative fixture IDs. Substitute records visible to your authenticated company or member.
curl -X POST 'https://api.fluid.app/api/member/v2026-10/team/01a08945-1a27-7dcf-9971-de363f3408ba/move/validate' \
-H 'Authorization: Bearer <member-token>' \
-H 'Content-Type: application/json' \
--data \{\"move\":\{\"parent_node_id\":\"01a08945-1a23-75ce-9026-9646ed3df5a1\"\}\}import requests
url = "https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate"
payload = { "move": { "parent_node_id": "01a08945-1a23-75ce-9026-9646ed3df5a1" } }
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({move: {parent_node_id: '01a08945-1a23-75ce-9026-9646ed3df5a1'}})
};
fetch('https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate', 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/member/v2026-10/team/{id}/move/validate",
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([
'move' => [
'parent_node_id' => '01a08945-1a23-75ce-9026-9646ed3df5a1'
]
]),
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/member/v2026-10/team/{id}/move/validate"
payload := strings.NewReader("{\n \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\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/member/v2026-10/team/{id}/move/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate")
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 \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\n }\n}"
response = http.request(request)
puts response.read_body{
"validation": {
"valid": true,
"approval_required": true,
"deferred": false,
"violations": []
},
"status": 200,
"meta": {
"request_uuid": null,
"timestamp": "2026-09-10T03:03:22Z"
}
}{
"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"
}
}{
"error": "Rate limit exceeded",
"message": "Too many requests. Please wait before trying again.",
"retry_after": 30
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
A member credential for the member's own team — a member or customer session JWT, a portal JWT, or a member's user token. It follows the member API's credential rules. Company service tokens, admin credentials and members who can no longer act are refused, and a session JWT cannot write. A member whose user is also an admin of the company may read, but not change, their own team with their own member token, one no admin holds.
Path Parameters
Body
An explicit unilevel move proposal. Actor and source are derived from authentication.
curl -X POST 'https://api.fluid.app/api/member/v2026-10/team/01a08945-1a27-7dcf-9971-de363f3408ba/move/validate' \
-H 'Authorization: Bearer <member-token>' \
-H 'Content-Type: application/json' \
--data \{\"move\":\{\"parent_node_id\":\"01a08945-1a23-75ce-9026-9646ed3df5a1\"\}\}import requests
url = "https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate"
payload = { "move": { "parent_node_id": "01a08945-1a23-75ce-9026-9646ed3df5a1" } }
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({move: {parent_node_id: '01a08945-1a23-75ce-9026-9646ed3df5a1'}})
};
fetch('https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate', 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/member/v2026-10/team/{id}/move/validate",
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([
'move' => [
'parent_node_id' => '01a08945-1a23-75ce-9026-9646ed3df5a1'
]
]),
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/member/v2026-10/team/{id}/move/validate"
payload := strings.NewReader("{\n \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\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/member/v2026-10/team/{id}/move/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/team/{id}/move/validate")
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 \"move\": {\n \"parent_node_id\": \"01a08945-1a23-75ce-9026-9646ed3df5a1\"\n }\n}"
response = http.request(request)
puts response.read_body{
"validation": {
"valid": true,
"approval_required": true,
"deferred": false,
"violations": []
},
"status": 200,
"meta": {
"request_uuid": null,
"timestamp": "2026-09-10T03:03:22Z"
}
}{
"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"
}
}{
"error": "Rate limit exceeded",
"message": "Too many requests. Please wait before trying again.",
"retry_after": 30
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}