curl --request GET \
--url https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback', 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}/feedback",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"environment": "production",
"items": [
{
"id": "<string>",
"source": "app_native",
"channel": "slack",
"actor": "<string>",
"reason_pending": true,
"unsure": true,
"created_at": "2023-11-07T05:31:56Z",
"claims": [
{
"claim": {
"kind": "expected_answer",
"question": "<string>",
"value": true
},
"shown": {
"structure_hash": "<string>"
},
"question_hash": "<string>"
}
],
"evaluation": {
"id": "<string>",
"item_id": "<string>",
"assignment_mode": "primary",
"created_at": "2023-11-07T05:31:56Z",
"version": {
"structure_hash": "<string>",
"binding": 2,
"engine_profile": "<string>"
},
"aggregations": {},
"answers": {},
"content": {
"state": "<unknown>",
"attribute_values": {}
},
"status": "computed",
"value": 123,
"via": "<string>",
"outcome": "<unknown>",
"missing": [
"questions.asks_for_refund"
]
},
"split": {
"split": "seed",
"group": "<string>"
},
"reason": "<string>",
"reason_added_at": "2023-11-07T05:31:56Z",
"withdrawn_at": "2023-11-07T05:31:56Z",
"after_reveal": true,
"supersedes": "<string>",
"superseded_by": "<string>"
}
],
"next_cursor": "<string>",
"resume_cursor": "<string>",
"has_more": true,
"withheld": {
"holdout": 1,
"unassigned": 1
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}Export a decision's feedback as training data
curl --request GET \
--url https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback', 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}/feedback",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/decisions/{decision_id}/feedback")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"environment": "production",
"items": [
{
"id": "<string>",
"source": "app_native",
"channel": "slack",
"actor": "<string>",
"reason_pending": true,
"unsure": true,
"created_at": "2023-11-07T05:31:56Z",
"claims": [
{
"claim": {
"kind": "expected_answer",
"question": "<string>",
"value": true
},
"shown": {
"structure_hash": "<string>"
},
"question_hash": "<string>"
}
],
"evaluation": {
"id": "<string>",
"item_id": "<string>",
"assignment_mode": "primary",
"created_at": "2023-11-07T05:31:56Z",
"version": {
"structure_hash": "<string>",
"binding": 2,
"engine_profile": "<string>"
},
"aggregations": {},
"answers": {},
"content": {
"state": "<unknown>",
"attribute_values": {}
},
"status": "computed",
"value": 123,
"via": "<string>",
"outcome": "<unknown>",
"missing": [
"questions.asks_for_refund"
]
},
"split": {
"split": "seed",
"group": "<string>"
},
"reason": "<string>",
"reason_added_at": "2023-11-07T05:31:56Z",
"withdrawn_at": "2023-11-07T05:31:56Z",
"after_reveal": true,
"supersedes": "<string>",
"superseded_by": "<string>"
}
],
"next_cursor": "<string>",
"resume_cursor": "<string>",
"has_more": true,
"withheld": {
"holdout": 1,
"unassigned": 1
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"reason": "<string>",
"param": "<string>",
"details": {
"issues": [
{
"param": "<string>",
"code": "<string>",
"message": "<string>"
}
]
}
}
}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.
Path Parameters
^[a-z][a-z0-9_.-]{0,127}$Query Parameters
Only feedback on evaluations of this structure hash.
^sha256:[0-9a-f]{64}$1 <= x <= 100The previous page's next_cursor, or its resume_cursor to poll later; retained on empty export polls.
1 - 1024Response
A page of feedback, oldest first
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 Show child attributes
Show child attributes
Next page, or null at the end.
Export checkpoint for later polls, retained on empty pages. Pass as cursor on a later poll. Creation ordering requires periodic full rescans for late commits, holdout releases and updates; this is not a lossless change feed.
True when more items follow this page now.
Submission rows, including withdrawal events (not distinct evaluations), in scope (this decision, the key's environment, the same version filters) that the export leaves out of every page. Counted on the first page only (no cursor); null on later pages. Counts per filter can tell you that a version gained held-out feedback, never which item.
Show child attributes
Show child attributes