curl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to": "<string>",
"message": "<string>",
"reply_to": "<string>",
"notify": true
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send"
payload = {
"to": "<string>",
"message": "<string>",
"reply_to": "<string>",
"notify": True
}
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({to: '<string>', message: '<string>', reply_to: '<string>', notify: true})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send', 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}/agent-network/send",
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([
'to' => '<string>',
'message' => '<string>',
'reply_to' => '<string>',
'notify' => true
]),
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}/agent-network/send"
payload := strings.NewReader("{\n \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\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}/agent-network/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send")
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 \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\n}"
response = http.request(request)
puts response.read_body{
"from": "<string>",
"ids": [
"<string>"
],
"recipients": [
{
"address": "<string>",
"state": "<string>",
"note": "<string>"
}
],
"unread": {
"count": 123,
"from": [
"<string>"
]
},
"note": "<string>"
}{
"from": "<string>",
"ids": [
"<string>"
],
"recipients": [
{
"address": "<string>",
"state": "<string>",
"note": "<string>"
}
],
"unread": {
"count": 123,
"from": [
"<string>"
]
},
"note": "<string>"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}Send a message on the workspace's Reason Network
Reason Network’s send_message. It goes out from one of the caller’s own computers that is online with Reason running, as <person>/<agent> (the agent named after the calling app), and returns once that computer reports the engine’s delivery state per recipient; replies come back to from and land in check_inbox. Answers 409 when nothing went out at all: agent_network_no_computer (none of the user’s computers is running Reason), agent_network_not_taken (the computer didn’t take it in time; sending again is safe) or agent_network_send_failed (the engine refused it, as it refuses an agent’s message to a group). 202 means the computer took it and hasn’t reported yet.
runcurl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to": "<string>",
"message": "<string>",
"reply_to": "<string>",
"notify": true
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send"
payload = {
"to": "<string>",
"message": "<string>",
"reply_to": "<string>",
"notify": True
}
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({to: '<string>', message: '<string>', reply_to: '<string>', notify: true})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send', 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}/agent-network/send",
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([
'to' => '<string>',
'message' => '<string>',
'reply_to' => '<string>',
'notify' => true
]),
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}/agent-network/send"
payload := strings.NewReader("{\n \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\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}/agent-network/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/agent-network/send")
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 \"to\": \"<string>\",\n \"message\": \"<string>\",\n \"reply_to\": \"<string>\",\n \"notify\": true\n}"
response = http.request(request)
puts response.read_body{
"from": "<string>",
"ids": [
"<string>"
],
"recipients": [
{
"address": "<string>",
"state": "<string>",
"note": "<string>"
}
],
"unread": {
"count": 123,
"from": [
"<string>"
]
},
"note": "<string>"
}{
"from": "<string>",
"ids": [
"<string>"
],
"recipients": [
{
"address": "<string>",
"state": "<string>",
"note": "<string>"
}
],
"unread": {
"count": 123,
"from": [
"<string>"
]
},
"note": "<string>"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}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, network:read, network:write, automations:read, automations:write, agent_auth:read. network:read and network:write are opt-in, excluded from default keys. network:read reads the saved workspace network policy; network:write replaces custom allowed hosts and requires a current organization owner/admin. Legacy project PATCH requests containing network_allowed_hosts also require network:write plus their existing run scope and project management permission; saved project hosts do not affect current session egress. Only owners/admins can mint or manage keys with network:write; keys cannot grant themselves more authority. See /docs/network-policies for replacement semantics and runtime applicability. 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.
Body
"person/session" (or just "session").
1 - 300The message, with the point in the first line.
1 - 30000Id of the message you are replying to.
1 - 100Also pop it up on that person's screen, for when they must act themselves (an approval, a decision). to may then be your own user's name, to reach them.
Response
What the network did with it, per recipient.
The address it went out from, which replies reach and land in check_inbox.
The network's id for the message; a reply names it as reply_to.
Show child attributes
Show child attributes
Messages to the caller's agent it hasn't read, and who sent them, as check_inbox returns them; null when there are none.
Show child attributes
Show child attributes

