curl --request POST \
--url https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"draft": "<string>",
"targetLanguage": "<string>",
"tone": "<string>"
}
'import requests
url = "https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite"
payload = {
"draft": "<string>",
"targetLanguage": "<string>",
"tone": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({draft: '<string>', targetLanguage: '<string>', tone: '<string>'})
};
fetch('https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite', 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/conversations/{conversationId}/actions/rewrite",
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([
'draft' => '<string>',
'targetLanguage' => '<string>',
'tone' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite"
payload := strings.NewReader("{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite")
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>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"kind": "<string>",
"status": "<string>",
"trigger": {
"type": "<string>"
},
"conversationId": "<string>",
"agentId": "<string>",
"agentVersionId": "<string>",
"createdAt": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Rewrite a draft
Requires ai:use and conversations:read on a connection owned by a current workspace owner/admin. API keys created before human ownership was recorded must be replaced in Settings. OAuth works through MCP; REST uses API keys. Creates a durable asynchronous run, never sends a message. Poll get_evelin_run, then retrieve the appropriate result. Uses the same workspace knowledge, runtime availability, and credit policy as the app. Identical retries with the same key reuse the run; changed inputs conflict. Private results remain bound to this exact connection. For improve, omit tone, preset and targetLanguage. For polish, choose at most one of tone or preset. For translate, provide targetLanguage and omit tone and preset.
curl --request POST \
--url https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"draft": "<string>",
"targetLanguage": "<string>",
"tone": "<string>"
}
'import requests
url = "https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite"
payload = {
"draft": "<string>",
"targetLanguage": "<string>",
"tone": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({draft: '<string>', targetLanguage: '<string>', tone: '<string>'})
};
fetch('https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite', 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/conversations/{conversationId}/actions/rewrite",
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([
'draft' => '<string>',
'targetLanguage' => '<string>',
'tone' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite"
payload := strings.NewReader("{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/ai/conversations/{conversationId}/actions/rewrite")
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>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"draft\": \"<string>\",\n \"targetLanguage\": \"<string>\",\n \"tone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"kind": "<string>",
"status": "<string>",
"trigger": {
"type": "<string>"
},
"conversationId": "<string>",
"agentId": "<string>",
"agentVersionId": "<string>",
"createdAt": "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
Body
Response
Run accepted or replayed. No message was sent.
Show child attributes
Show child attributes
