curl --request GET \
--url https://api.moonbounce.ai/v1/feedback/{feedback_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.moonbounce.ai/v1/feedback/{feedback_id}"
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/feedback/{feedback_id}', 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/feedback/{feedback_id}",
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/feedback/{feedback_id}"
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/feedback/{feedback_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/feedback/{feedback_id}")
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",
"id": "<string>",
"decision_id": "<string>",
"evaluation_id": "<string>",
"item_id": "<string>",
"resolved_from_item": true,
"source": "app_native",
"channel": "slack",
"actor": "<string>",
"claim_count": 1,
"split": "seed",
"created_at": "2023-11-07T05:31:56Z",
"reason": "<string>",
"reason_pending": true,
"unsure": true,
"withdrawn_at": "2023-11-07T05:31:56Z",
"after_reveal": true,
"supersedes": "<string>",
"superseded_by": "<string>",
"claims": [
{
"kind": "target",
"value": true
}
],
"withheld": "holdout"
}{
"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": {}
}
}Get a feedback submission as stored
Reads back any feedback submission in the key’s environment: one from POST /v1/feedback, a seed example’s from POST /v1/decisions/{decision_id}/seeds, or a review answer. claims are in the order and shape they were sent, and claim_count says how many there are. resolved_from_item says the submission named an item and the server picked the evaluation. superseded_by is set when a later submission replaced this one; a replaced submission no longer counts. supersedes is the one this replaced. split is the side of the training line the item’s group is on: seed is a starting example, train is used for fitting, holdout is kept back to test suggestions and never shown to a suggestion generator, and burned is a holdout group whose cases were shown in a preview, that was merged with a near-duplicate group, or whose content was later imported as a seed example; it counts as training from then on. It is null when the item has no group yet. Held-out feedback is kept back to test suggestions, so even its author reads only that it was recorded and how many claims it holds: while the group is holdout (or the content’s text belongs to a held-out group), withheld is holdout and claims, reason, reason_pending and unsure are left out; they come back once the group is burned. A submission whose item has no split yet is withheld the same way, as unassigned. withdrawn_at marks a claimless withdrawal of the chain; ancestors never revive. On a spot check, after_reveal is false on the reviewer’s blind answer and true on a later change of it; it is left out while withheld is set. reason_pending on a superseded submission means its reason was never added before the answer was replaced: read the chain head. supersedes and superseded_by only ever name a submission on the same evaluation. 404 for an unknown id, another organization’s or environment’s submission, or one whose evaluation was deleted.
curl --request GET \
--url https://api.moonbounce.ai/v1/feedback/{feedback_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.moonbounce.ai/v1/feedback/{feedback_id}"
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/feedback/{feedback_id}', 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/feedback/{feedback_id}",
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/feedback/{feedback_id}"
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/feedback/{feedback_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moonbounce.ai/v1/feedback/{feedback_id}")
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",
"id": "<string>",
"decision_id": "<string>",
"evaluation_id": "<string>",
"item_id": "<string>",
"resolved_from_item": true,
"source": "app_native",
"channel": "slack",
"actor": "<string>",
"claim_count": 1,
"split": "seed",
"created_at": "2023-11-07T05:31:56Z",
"reason": "<string>",
"reason_pending": true,
"unsure": true,
"withdrawn_at": "2023-11-07T05:31:56Z",
"after_reveal": true,
"supersedes": "<string>",
"superseded_by": "<string>",
"claims": [
{
"kind": "target",
"value": true
}
],
"withheld": "holdout"
}{
"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.
Path Parameters
^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Response
The submission
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 ^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$^[a-z][a-z0-9_.-]{0,127}$^evl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$True when the submission named an item and the server resolved it to this evaluation.
app_native, app_resolution, reviewer, owner, import, synthetic_review The surface the submission came through, stamped by the server.
slack, web, api, mcp, import Who submitted it, as recorded (an ext: prefix marks an actor your key named).
How many claims the submission holds.
x >= 0Which side of the training line this item's group is on: seed (a starting example, used for fitting), train (used for fitting), holdout (kept back to test suggestions, never shown to a suggestion generator) or burned (a holdout group whose cases were shown in a preview, that was merged with a near-duplicate group, or whose content was later imported as a seed example; it counts as training). Null when the item has no group yet.
seed, train, holdout, burned, null Why, as sent. Left out while withheld is set.
True when a reason was promised and has not arrived yet. On a superseded submission (superseded_by set) it means the reason was never added before the answer was replaced, and none will be: read the chain head. Left out while withheld is set.
Left out while withheld is set.
When this claimless submission withdrew its chain. Resolve chain heads before excluding withdrawn chains; ancestors never revive.
Spot checks only. false on the reviewer's first answer, given blind; true on an answer that changed it after Moonbounce's call was revealed. Accuracy is measured on the blind answer. Omitted on other items, other sources, withdrawal events and withheld rows.
The submission this one replaces.
^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$Set when a later submission replaced this one. This one no longer counts.
^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$The claims, in the order and shape they were sent. Left out while withheld is set.
Whether the target statement is true. Only for specs that declare a target.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
Show child attributes
Show child attributes
Set when the judgment (claims, reason, reason_pending, unsure) is not returned, even to its author, by the same rules as the feedback export. holdout: the item's group is held out, or the content's text belongs to a held-out group; the judgment is kept back to test suggestions and is returned once the group is burned. unassigned: the item has no split yet.
holdout, unassigned