curl --request POST \
--url https://api.moonbounce.ai/v1/decisions/{decision_id}/structures \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"spec": {
"format": "moonbounce.spec/0",
"nodes": {},
"output": "<string>",
"guidance": "<string>",
"target": "<string>",
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}
}
'import requests
url = "https://api.moonbounce.ai/v1/decisions/{decision_id}/structures"
payload = { "spec": {
"format": "moonbounce.spec/0",
"nodes": {},
"output": "<string>",
"guidance": "<string>",
"target": "<string>",
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": ["<string>"],
"display": {}
}
} }
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({
spec: {
format: 'moonbounce.spec/0',
nodes: {},
output: '<string>',
guidance: '<string>',
target: '<string>',
meta: {
title: '<string>',
description: '<string>',
owner: '<string>',
tags: ['<string>'],
display: {}
}
}
})
};
fetch('https://api.moonbounce.ai/v1/decisions/{decision_id}/structures', 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.moonbounce.ai/v1/decisions/{decision_id}/structures",
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([
'spec' => [
'format' => 'moonbounce.spec/0',
'nodes' => [
],
'output' => '<string>',
'guidance' => '<string>',
'target' => '<string>',
'meta' => [
'title' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'tags' => [
'<string>'
],
'display' => [
]
]
]
]),
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.moonbounce.ai/v1/decisions/{decision_id}/structures"
payload := strings.NewReader("{\n \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\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.moonbounce.ai/v1/decisions/{decision_id}/structures")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/decisions/{decision_id}/structures")
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 \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"environment": "production",
"decision_id": "<string>",
"structure": "<string>",
"nodes": {},
"default_weights": "<string>",
"first_seen_at": "2023-11-07T05:31:56Z",
"created": true,
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}{
"environment": "production",
"decision_id": "<string>",
"structure": "<string>",
"nodes": {},
"default_weights": "<string>",
"first_seen_at": "2023-11-07T05:31:56Z",
"created": true,
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}Register a spec structure
Stores a spec’s structure under the decision so evaluations can name it by hash. Idempotent by content: 201 when this call registered it, 200 when it already existed. The first registration for an environment also creates the decision’s engine binding there from the deployment default. Returns hashes and metadata without the spec; getStructure reads the spec.
curl --request POST \
--url https://api.moonbounce.ai/v1/decisions/{decision_id}/structures \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"spec": {
"format": "moonbounce.spec/0",
"nodes": {},
"output": "<string>",
"guidance": "<string>",
"target": "<string>",
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}
}
'import requests
url = "https://api.moonbounce.ai/v1/decisions/{decision_id}/structures"
payload = { "spec": {
"format": "moonbounce.spec/0",
"nodes": {},
"output": "<string>",
"guidance": "<string>",
"target": "<string>",
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": ["<string>"],
"display": {}
}
} }
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({
spec: {
format: 'moonbounce.spec/0',
nodes: {},
output: '<string>',
guidance: '<string>',
target: '<string>',
meta: {
title: '<string>',
description: '<string>',
owner: '<string>',
tags: ['<string>'],
display: {}
}
}
})
};
fetch('https://api.moonbounce.ai/v1/decisions/{decision_id}/structures', 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.moonbounce.ai/v1/decisions/{decision_id}/structures",
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([
'spec' => [
'format' => 'moonbounce.spec/0',
'nodes' => [
],
'output' => '<string>',
'guidance' => '<string>',
'target' => '<string>',
'meta' => [
'title' => '<string>',
'description' => '<string>',
'owner' => '<string>',
'tags' => [
'<string>'
],
'display' => [
]
]
]
]),
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.moonbounce.ai/v1/decisions/{decision_id}/structures"
payload := strings.NewReader("{\n \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\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.moonbounce.ai/v1/decisions/{decision_id}/structures")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/decisions/{decision_id}/structures")
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 \"spec\": {\n \"format\": \"moonbounce.spec/0\",\n \"nodes\": {},\n \"output\": \"<string>\",\n \"guidance\": \"<string>\",\n \"target\": \"<string>\",\n \"meta\": {\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"owner\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"display\": {}\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"environment": "production",
"decision_id": "<string>",
"structure": "<string>",
"nodes": {},
"default_weights": "<string>",
"first_seen_at": "2023-11-07T05:31:56Z",
"created": true,
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}{
"environment": "production",
"decision_id": "<string>",
"structure": "<string>",
"nodes": {},
"default_weights": "<string>",
"first_seen_at": "2023-11-07T05:31:56Z",
"created": true,
"meta": {
"title": "<string>",
"description": "<string>",
"owner": "<string>",
"tags": [
"<string>"
],
"display": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {}
}
}Authorizations
An API key, sent as Authorization: Bearer <key>. Each operation lists the scope its key needs: decisions:evaluate (evaluate and read evaluations), decisions:feedback (your app's feedback) or decisions:develop (everything else, including owner feedback and the review queue). An operation listing no scope takes any scoped key. A key with no scope, or without the operation's, gets 403 INSUFFICIENT_SCOPE.
Headers
Makes a retry safe. For 24 hours, the same key with the same request returns the first stored result (with Idempotent-Replayed: true); the same key with a different request is a 422 IDEMPOTENCY_KEY_REUSED. Keys are scoped to the organization and environment across every operation, so use a fresh key per request. A request that failed before its result was stored runs again when retried with its key.
1 - 255^[\x20-\x7e]+$Path Parameters
^[a-z][a-z0-9_.-]{0,127}$Body
Show child attributes
Show child attributes
Response
Already registered
The environment of the key that made the call: production or test. Evaluations, feedback, reviews and suggestions are separate per environment; registered structures are shared.
production, test ^[a-z][a-z0-9_.-]{0,127}$^sha256:[0-9a-f]{64}$Each of the spec's nodes, by name, mapped to that node's hash (not its definition). A feature's hash is what feedback about it is stored against.
Show child attributes
Show child attributes
^sha256:[0-9a-f]{64}$Show child attributes
Show child attributes