curl --request GET \
--url https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}', 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.protodesk.io/v1/ai/feedback/{kind}/{targetId}",
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.protodesk.io/v1/ai/feedback/{kind}/{targetId}"
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.protodesk.io/v1/ai/feedback/{kind}/{targetId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}")
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{
"data": {
"revision": 1,
"visibility": "personal",
"targetVersion": "<string>",
"feedback": {
"revision": 123,
"targetVersion": "<string>",
"signal": "helpful",
"reason": "<string>",
"correction": "<string>",
"sharedWithReviewers": true,
"updatedAt": "2023-11-07T05:31:56Z"
},
"review": {
"feedbackRevision": 123,
"status": "<string>",
"decision": "<string>",
"reviewedAt": "2023-11-07T05:31:56Z"
}
}
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Read feedback
Requires a connection owned by a current workspace owner/admin with ai:use and conversations:read. Feedback belongs to that human and is also visible in the app. Only the exact connection that created the result can access it through this API; other connections and private app results are excluded. Read the current revision and targetVersion before saving or withdrawing. Identical lost-response retries are safe with the same body; stale changes return 409. No Idempotency-Key is needed. Personal visibility is the default. Explicit workspace visibility shares the answer and correction for workspace review. Withdrawal retains revision history and removes the active feedback. This records feedback using the existing feedback system; it does not guarantee a future answer, publish guidance, invoke a model, or consume AI generation credits.
curl --request GET \
--url https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}', 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.protodesk.io/v1/ai/feedback/{kind}/{targetId}",
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.protodesk.io/v1/ai/feedback/{kind}/{targetId}"
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.protodesk.io/v1/ai/feedback/{kind}/{targetId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/feedback/{kind}/{targetId}")
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{
"data": {
"revision": 1,
"visibility": "personal",
"targetVersion": "<string>",
"feedback": {
"revision": 123,
"targetVersion": "<string>",
"signal": "helpful",
"reason": "<string>",
"correction": "<string>",
"sharedWithReviewers": true,
"updatedAt": "2023-11-07T05:31:56Z"
},
"review": {
"feedbackRevision": 123,
"status": "<string>",
"decision": "<string>",
"reviewedAt": "2023-11-07T05:31:56Z"
}
}
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Authorizations
Use a workspace API key in the Authorization header: Bearer pk_.... Older pk_live_ and pk_test_ keys remain valid; their prefixes do not isolate data or select a separate environment.
Path Parameters
Use reply_draft for suggested replies and follow-ups; artifact for rewrites, translations, and draft reviews.
reply_draft, artifact The artifactId from a completed result created by this exact API key or OAuth connection.
Response
Current feedback state, including revision after withdrawal.
Show child attributes
Show child attributes
