curl --request POST \
--url https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"parentId": null,
"ownerLabel": null,
"description": null
}
'import requests
url = "https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes"
payload = {
"name": "<string>",
"parentId": None,
"ownerLabel": None,
"description": None
}
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({name: '<string>', parentId: null, ownerLabel: null, description: null})
};
fetch('https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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([
'name' => '<string>',
'parentId' => null,
'ownerLabel' => null,
'description' => null
]),
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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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 \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"processId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"ownerLabel": "<string>",
"sortOrder": 123,
"existence": "proposed",
"contentConfirmedAt": "<string>",
"existenceConfirmedAt": "<string>",
"source": "ai",
"priority": "high",
"priorityReasoning": "<string>",
"priorityAssessedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"outcome": "created"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Create Clarity Landscape Node
Create an area folder in the process tree. An active area (the default) requires organization admin+; a “proposal” area may be added by any organization member.
curl --request POST \
--url https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"parentId": null,
"ownerLabel": null,
"description": null
}
'import requests
url = "https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes"
payload = {
"name": "<string>",
"parentId": None,
"ownerLabel": None,
"description": None
}
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({name: '<string>', parentId: null, ownerLabel: null, description: null})
};
fetch('https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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([
'name' => '<string>',
'parentId' => null,
'ownerLabel' => null,
'description' => null
]),
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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\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.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/nodes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/organizations/{orgId}/clarity/hierarchy/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 \"name\": \"<string>\",\n \"parentId\": null,\n \"ownerLabel\": null,\n \"description\": null\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"processId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"ownerLabel": "<string>",
"sortOrder": 123,
"existence": "proposed",
"contentConfirmedAt": "<string>",
"existenceConfirmedAt": "<string>",
"source": "ai",
"priority": "high",
"priorityReasoning": "<string>",
"priorityAssessedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"outcome": "created"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
API key authentication. Get your API key from the Duvo dashboard.
Path Parameters
Body
1 - 200200One or two sentences saying what family of work this area groups. Persisted as the area's summary.
2000Use "proposal" to add an area for review instead of asserting it exists. A proposal is idempotent: an equivalent live area under the same parent is returned untouched rather than duplicated. Defaults to "active" — except in a landscape-onboarding chat, which may only propose, and so defaults to "proposal".
active, proposal Response
Default Response
proposed, active ai, human high, medium, low Show child attributes
Show child attributes
Whether this call inserted a new node or returned an equivalent one that already existed. Only "proposal" mode can report "reused".
created, reused Was this page helpful?