curl --request POST \
--url https://api.doers.sh/v2/coach/reply \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agentKey": "<string>",
"images": [
{
"data": "<string>"
}
],
"mode": "dump",
"uiContext": "<string>"
}
'import requests
url = "https://api.doers.sh/v2/coach/reply"
payload = {
"agentKey": "<string>",
"images": [{ "data": "<string>" }],
"mode": "dump",
"uiContext": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentKey: '<string>',
images: [{data: '<string>'}],
mode: 'dump',
uiContext: '<string>'
})
};
fetch('https://api.doers.sh/v2/coach/reply', 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.doers.sh/v2/coach/reply",
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([
'agentKey' => '<string>',
'images' => [
[
'data' => '<string>'
]
],
'mode' => 'dump',
'uiContext' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.doers.sh/v2/coach/reply"
payload := strings.NewReader("{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.doers.sh/v2/coach/reply")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doers.sh/v2/coach/reply")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"reply": "<string>",
"actions": 0
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}Ask the coach to answer what was said
Runs the model over the thread as it stands and writes its reply into it. Post the message first with POST /coach/messages: recording and answering are separate so a slow or failing model never loses what was typed.
Answers while it works. The reply is written progressively into a message that GET /coach/stream returns, so a caller can show what is happening instead of a blank wait; that message becomes the finished reply when this returns.
The coach acts as well as speaks: it may call any operation this API exposes, on behalf of the caller and with the caller’s permissions. actions counts what it did.
Fails with a 409 when no Anthropic key is stored — the thread stays readable without one.
curl --request POST \
--url https://api.doers.sh/v2/coach/reply \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agentKey": "<string>",
"images": [
{
"data": "<string>"
}
],
"mode": "dump",
"uiContext": "<string>"
}
'import requests
url = "https://api.doers.sh/v2/coach/reply"
payload = {
"agentKey": "<string>",
"images": [{ "data": "<string>" }],
"mode": "dump",
"uiContext": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentKey: '<string>',
images: [{data: '<string>'}],
mode: 'dump',
uiContext: '<string>'
})
};
fetch('https://api.doers.sh/v2/coach/reply', 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.doers.sh/v2/coach/reply",
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([
'agentKey' => '<string>',
'images' => [
[
'data' => '<string>'
]
],
'mode' => 'dump',
'uiContext' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.doers.sh/v2/coach/reply"
payload := strings.NewReader("{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.doers.sh/v2/coach/reply")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doers.sh/v2/coach/reply")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentKey\": \"<string>\",\n \"images\": [\n {\n \"data\": \"<string>\"\n }\n ],\n \"mode\": \"dump\",\n \"uiContext\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"reply": "<string>",
"actions": 0
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}Authorizations
A pc_… token generated from Settings > API & MCP.
Body
Required when agentKey names an agent: its instructions live on the caller's disk, not in this database.
Show child attributes
Show child attributes
The agent whose thread this is. Absent means the coach's own.
2004Show child attributes
Show child attributes
A brain-dump: organise it into tasks and a plan now, without asking questions.
"dump"Where the person is — the view, project or task open in front of them.
2000