curl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": {
"kind": "mac",
"device_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"root_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover"
payload = {
"expected_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": {
"kind": "mac",
"device_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"root_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
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({
expected_user_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
target: {
kind: 'mac',
device_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
root_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
}
})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover', 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/import/prepare-takeover",
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([
'expected_user_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'target' => [
'kind' => 'mac',
'device_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'root_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
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/import/prepare-takeover"
payload := strings.NewReader("{\n \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\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/import/prepare-takeover")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover")
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 \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n}"
response = http.request(request)
puts response.read_body{
"ready": true
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}Check storage and Mac target readiness before an explicit session takeover
Preflight an explicitly requested continuation on the original Mac before stopping its native session. Supply the currently authenticated user ID and an accessible Mac device/root. This read-only check validates import storage and target admission; it does not stop a process, import history, or start execution. A ready response is not a reservation: revalidate the account and target when importing. Leave the original session running if this check fails.
Scope:runcurl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"expected_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": {
"kind": "mac",
"device_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"root_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover"
payload = {
"expected_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"target": {
"kind": "mac",
"device_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"root_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
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({
expected_user_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
target: {
kind: 'mac',
device_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
root_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
}
})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover', 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/import/prepare-takeover",
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([
'expected_user_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'target' => [
'kind' => 'mac',
'device_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'root_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
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/import/prepare-takeover"
payload := strings.NewReader("{\n \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\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/import/prepare-takeover")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/sessions/import/prepare-takeover")
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 \"expected_user_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"target\": {\n \"kind\": \"mac\",\n \"device_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"root_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n}"
response = http.request(request)
puts response.read_body{
"ready": true
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"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, 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.
Body
Response
The current account and target are ready.

