curl --request GET \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary', 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}/usage/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"models": [
{
"model": "<string>",
"billing": "reason",
"provider": "<string>",
"unit": "requests",
"requests": 123,
"input_tokens": 123,
"output_tokens": 123,
"cached_input_tokens": 123,
"cache_write_input_tokens": 123,
"reasoning_tokens": 123,
"total_tokens": 123,
"rcu": 123
}
],
"agents": [
{
"agent_role": "lead",
"model": "<string>",
"billing": "reason",
"provider": "<string>",
"unit": "requests",
"requests": 123,
"input_tokens": 123,
"output_tokens": 123,
"cached_input_tokens": 123,
"cache_write_input_tokens": 123,
"reasoning_tokens": 123,
"total_tokens": 123,
"rcu": 123,
"runs": 123
}
],
"machines": [
{
"rate_id": "<string>",
"provider": "<string>",
"os": "<string>",
"size": "<string>",
"memory_gb": 123,
"machines": 123,
"runtime_seconds": 123,
"rcu": 123
}
],
"totals": {
"total_tokens": 123,
"runtime_seconds": 123,
"rcu": 123
},
"start_date": "2023-11-07T05:31:56Z",
"end_date": "2023-11-07T05:31:56Z"
}{
"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"
}
}Get usage summary
Returns a window’s model usage per model and per agent (a Session’s lead agent, or the helper agents it spawned), and cloud machine usage per size, with tokens and the RCU charged. These are the totals the Usage settings page shows. Every member may read it. Returns 400 invalid_user_id when user_id is not a UUID.
analytics:readcurl --request GET \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary', 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}/usage/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/usage/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"models": [
{
"model": "<string>",
"billing": "reason",
"provider": "<string>",
"unit": "requests",
"requests": 123,
"input_tokens": 123,
"output_tokens": 123,
"cached_input_tokens": 123,
"cache_write_input_tokens": 123,
"reasoning_tokens": 123,
"total_tokens": 123,
"rcu": 123
}
],
"agents": [
{
"agent_role": "lead",
"model": "<string>",
"billing": "reason",
"provider": "<string>",
"unit": "requests",
"requests": 123,
"input_tokens": 123,
"output_tokens": 123,
"cached_input_tokens": 123,
"cache_write_input_tokens": 123,
"reasoning_tokens": 123,
"total_tokens": 123,
"rcu": 123,
"runs": 123
}
],
"machines": [
{
"rate_id": "<string>",
"provider": "<string>",
"os": "<string>",
"size": "<string>",
"memory_gb": 123,
"machines": 123,
"runtime_seconds": 123,
"rcu": 123
}
],
"totals": {
"total_tokens": 123,
"runtime_seconds": 123,
"rcu": 123
},
"start_date": "2023-11-07T05:31:56Z",
"end_date": "2023-11-07T05:31:56Z"
}{
"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 keys. 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.
Query Parameters
Beginning of the window. Omit it to start 30 days before end_date. A window longer than 92 days is cut to its latest 92 days.
End of the window, excluded. Omit it, or pass a later time, to end the window now.
Counts only this member's usage. Omit it for the whole workspace.
Response
Usage summary.
Usage per model, billing and provider, most tokens first.
Show child attributes
Show child attributes
The same usage split by agent role: per role, model, billing and provider. Leads first, then helpers, each most tokens first.
Show child attributes
Show child attributes
Cloud machine usage per rate and provider, longest running first.
Show child attributes
Show child attributes
Totals over the window.
Show child attributes
Show child attributes
Start of the window that was read.
End of the window that was read.

