curl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"message": "Also bump the timeout to 30s while you're in there.",
"client_message_id": "follow-up-018f6f3a"
}
EOFimport requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages"
payload = {
"message": "Also bump the timeout to 30s while you're in there.",
"client_message_id": "follow-up-018f6f3a"
}
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({
message: 'Also bump the timeout to 30s while you\'re in there.',
client_message_id: 'follow-up-018f6f3a'
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages', 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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages",
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([
'message' => 'Also bump the timeout to 30s while you\'re in there.',
'client_message_id' => 'follow-up-018f6f3a'
]),
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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages"
payload := strings.NewReader("{\n \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages")
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 \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"delivery": "<string>",
"continuation_session_id": "<string>"
}{
"error": "message_required"
}{
"error": "quota_exhausted",
"reason": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"required_scope": "<string>"
}{
"error": "session_not_found"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "cloud_agents_disabled"
}Send a message
Adds a follow-up instruction to a running or finished Session, including an owned subagent Session. Child continuations retain their original execution permissions. Device execution requires devices:use in addition to run, including continuations and pending Device handoffs.
Scope:runcurl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"message": "Also bump the timeout to 30s while you're in there.",
"client_message_id": "follow-up-018f6f3a"
}
EOFimport requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages"
payload = {
"message": "Also bump the timeout to 30s while you're in there.",
"client_message_id": "follow-up-018f6f3a"
}
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({
message: 'Also bump the timeout to 30s while you\'re in there.',
client_message_id: 'follow-up-018f6f3a'
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages', 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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages",
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([
'message' => 'Also bump the timeout to 30s while you\'re in there.',
'client_message_id' => 'follow-up-018f6f3a'
]),
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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages"
payload := strings.NewReader("{\n \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\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.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/sessions/{sessionId}/messages")
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 \"message\": \"Also bump the timeout to 30s while you're in there.\",\n \"client_message_id\": \"follow-up-018f6f3a\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"delivery": "<string>",
"continuation_session_id": "<string>"
}{
"error": "message_required"
}{
"error": "quota_exhausted",
"reason": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"required_scope": "<string>"
}{
"error": "session_not_found"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "cloud_agents_disabled"
}Authorizations
Your Reason API key from Settings > API. New keys use reason_; legacy ara_ keys remain accepted. Keys are capability-scoped: run, mcp:read, mcp:write, secrets:read, secrets:write, sessions:read, sessions:debug, knowledge:read, memory:read, memory:write, skills:read, skills:write, repos:read, repos:write, reviews:read, reviews:write, deployment:read, analytics:read, org:read, org:write, attachments:read, attachments:write, guardrails:read, guardrails:write, automations:read, automations:write, agent_auth:read. mcp:write manages MCP server configuration only; it does not authorize remote MCP-tool execution. sessions:debug is privileged: it expands diagnostic session events only for organization owners/admins.
Path Parameters
Organization id or slug. Resolve it with GET /v3/self.
The session id.
Body
Follow-up instruction, at most 2 MiB when UTF-8 encoded.
Caller-generated idempotency key. Reusing it for the same Session returns the original accepted turn.
1 - 160Optional model id from GET /agent-auth/models to retry this session on. A model override always starts a new continuation run, because a run's model is fixed at its first execution. Omit or use auto to keep the session's current model.
Optional reasoning effort override applied to the continuation run.
minimal, low, medium, high, xhigh, max 
