curl --request PUT \
--url https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"message": "Update node configuration and tags",
"state": {
"directories": [
"/services",
"/apis",
"/docs"
],
"node": {
"description": "Production service configuration",
"metadata": {},
"title": "My Application Node"
},
"tags": {
"environment": {
"link": "https://wiki.example.com/envs",
"value": "production"
},
"team": {
"value": "backend"
},
"version": {
"value": "v2.1.0"
}
}
}
}
'import requests
url = "https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push"
payload = {
"message": "Update node configuration and tags",
"state": {
"directories": ["/services", "/apis", "/docs"],
"node": {
"description": "Production service configuration",
"metadata": {},
"title": "My Application Node"
},
"tags": {
"environment": {
"link": "https://wiki.example.com/envs",
"value": "production"
},
"team": { "value": "backend" },
"version": { "value": "v2.1.0" }
}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
message: 'Update node configuration and tags',
state: {
directories: ['/services', '/apis', '/docs'],
node: {
description: 'Production service configuration',
metadata: {},
title: 'My Application Node'
},
tags: {
environment: {link: 'https://wiki.example.com/envs', value: 'production'},
team: {value: 'backend'},
version: {value: 'v2.1.0'}
}
}
})
};
fetch('https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push', 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.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'message' => 'Update node configuration and tags',
'state' => [
'directories' => [
'/services',
'/apis',
'/docs'
],
'node' => [
'description' => 'Production service configuration',
'metadata' => [
],
'title' => 'My Application Node'
],
'tags' => [
'environment' => [
'link' => 'https://wiki.example.com/envs',
'value' => 'production'
],
'team' => [
'value' => 'backend'
],
'version' => [
'value' => 'v2.1.0'
]
]
]
]),
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.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push"
payload := strings.NewReader("{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"branch": "main",
"commit_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "Update node configuration and tags",
"node_id": "123e4567-e89b-12d3-a456-426614174000",
"objects_created": 2,
"objects_reused": 3,
"previous_commit": "456e7890-e29b-41d4-a716-446655440001"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Push Node State
Git-like full-state push operation.
This endpoint implements the declarative API where clients send the complete desired state, and the server handles diffing and object reuse automatically.
Similar to git push, the client describes the end state they want, and the
server figures out what changed and creates an optimal commit.
Features:
- Automatic object reuse for unchanged content
- Complete state snapshots in each commit
- Branch support for collaborative workflows
- Validation of state schema
curl --request PUT \
--url https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"message": "Update node configuration and tags",
"state": {
"directories": [
"/services",
"/apis",
"/docs"
],
"node": {
"description": "Production service configuration",
"metadata": {},
"title": "My Application Node"
},
"tags": {
"environment": {
"link": "https://wiki.example.com/envs",
"value": "production"
},
"team": {
"value": "backend"
},
"version": {
"value": "v2.1.0"
}
}
}
}
'import requests
url = "https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push"
payload = {
"message": "Update node configuration and tags",
"state": {
"directories": ["/services", "/apis", "/docs"],
"node": {
"description": "Production service configuration",
"metadata": {},
"title": "My Application Node"
},
"tags": {
"environment": {
"link": "https://wiki.example.com/envs",
"value": "production"
},
"team": { "value": "backend" },
"version": { "value": "v2.1.0" }
}
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
message: 'Update node configuration and tags',
state: {
directories: ['/services', '/apis', '/docs'],
node: {
description: 'Production service configuration',
metadata: {},
title: 'My Application Node'
},
tags: {
environment: {link: 'https://wiki.example.com/envs', value: 'production'},
team: {value: 'backend'},
version: {value: 'v2.1.0'}
}
}
})
};
fetch('https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push', 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.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'message' => 'Update node configuration and tags',
'state' => [
'directories' => [
'/services',
'/apis',
'/docs'
],
'node' => [
'description' => 'Production service configuration',
'metadata' => [
],
'title' => 'My Application Node'
],
'tags' => [
'environment' => [
'link' => 'https://wiki.example.com/envs',
'value' => 'production'
],
'team' => [
'value' => 'backend'
],
'version' => [
'value' => 'v2.1.0'
]
]
]
]),
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.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push"
payload := strings.NewReader("{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.yertle.com/orgs/{org_id}/nodes/{node_id}/tree/{branch}/push")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"message\": \"Update node configuration and tags\",\n \"state\": {\n \"directories\": [\n \"/services\",\n \"/apis\",\n \"/docs\"\n ],\n \"node\": {\n \"description\": \"Production service configuration\",\n \"metadata\": {},\n \"title\": \"My Application Node\"\n },\n \"tags\": {\n \"environment\": {\n \"link\": \"https://wiki.example.com/envs\",\n \"value\": \"production\"\n },\n \"team\": {\n \"value\": \"backend\"\n },\n \"version\": {\n \"value\": \"v2.1.0\"\n }\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"branch": "main",
"commit_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "Update node configuration and tags",
"node_id": "123e4567-e89b-12d3-a456-426614174000",
"objects_created": 2,
"objects_reused": 3,
"previous_commit": "456e7890-e29b-41d4-a716-446655440001"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Request model for Git-like full-state push operations.
Response
Successful Response
Response model for Git-like full-state push operations.
ID of the created commit
Node ID that was updated
Branch that was updated
Commit message
Number of new objects created
Number of existing objects reused
Previous commit ID on this branch
Mapping from temp connection IDs to real UUIDs
Show child attributes
Show child attributes