curl --request POST \
--url https://api.reasonmachines.com/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.com/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.com/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.com/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.com/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.com/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.com/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>"
}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.com/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.com/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.com/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.com/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.com/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.com/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.com/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>"
}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:read reads sessions, including the assistant, reasoning and tool activity in their events. sessions:debug is privileged: only for organization owners/admins, it expands session events to the full diagnostic projection (diagnostic event kinds, status text and raw event metadata).
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 Moves the Session: this message's turn, and every later one, runs on this target instead of the one the Session was on. Same shape and admission as the create target (cloud, a Device and root, or a named Machine). Only the conversation moves; files on the previous machine do not, unless they were pushed to the Session branch. A move starts a new continuation run, so the Session must have finished its current turn. Any target other than cloud needs the devices:use scope.
- Option 1
- Option 2
- Option 3
- Option 4
Show child attributes
Show child attributes

