curl --request POST \
--url https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Idempotency-Key: <idempotency-key>'import requests
url = "https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm"
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm', 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/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.post("https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"proposalId": "<string>",
"runId": "<string>",
"effectId": "<string>",
"type": "<string>",
"target": {},
"before": {},
"after": {},
"confirmedAt": "2023-11-07T05:31:56Z",
"undo": {
"status": "available",
"undoneAt": "2023-11-07T05:31:56Z"
}
}
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Confirm a proposed Evelin action
Only this API key or OAuth grant can access this chat. Requires current owner/admin membership. Chats retain a ceiling of the permissions granted at creation; added permissions require a new chat. Private app chats and other clients are isolated. External integrations such as Linear are unavailable. Confirm only the exact proposal reviewed and requested by the user. Conversation properties and personal reminders require conversations:write. Help Center drafts require help:articles:write; publication additionally requires help:articles:publish. Scopes must remain in the current grant and session ceiling. Stale proposals return 409. Identical retries return the original receipt without repeating the action. This can publish customer-visible Help Center content but never sends a customer message.
curl --request POST \
--url https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm \
--header 'Authorization: Bearer <token>' \
--header 'Idempotency-Key: <idempotency-key>'import requests
url = "https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm"
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Idempotency-Key': '<idempotency-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm', 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/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.post("https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/assistant/sessions/{sessionId}/turns/{turnId}/actions/{proposalId}/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"proposalId": "<string>",
"runId": "<string>",
"effectId": "<string>",
"type": "<string>",
"target": {},
"before": {},
"after": {},
"confirmedAt": "2023-11-07T05:31:56Z",
"undo": {
"status": "available",
"undoneAt": "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.
Headers
8 - 128Path Parameters
111Response
Existing result replayed without a new effect.
