curl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"frequency": "0 3 * * *"
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers"
payload = { "frequency": "0 3 * * *" }
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({frequency: '0 3 * * *'})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers', 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}/automations/{automationId}/triggers",
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([
'frequency' => '0 3 * * *'
]),
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}/automations/{automationId}/triggers"
payload := strings.NewReader("{\n \"frequency\": \"0 3 * * *\"\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}/automations/{automationId}/triggers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"frequency\": \"0 3 * * *\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers")
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 \"frequency\": \"0 3 * * *\"\n}"
response = http.request(request)
puts response.read_body{
"id": "trigger_example",
"kind": "schedule",
"enabled": true,
"schedule": {
"kind": "cron",
"expression": "0 9 * * *",
"every_seconds": null,
"next_run_at": "2026-09-24T09:00:00Z"
},
"github": null,
"webhook": null,
"run_kind": null,
"last_fired_at": null,
"created_at": "2026-09-01T00:00:00Z",
"updated_at": "2026-09-01T00:00:00Z"
}{
"error": "prompt_required"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": "session_not_found"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}Add a trigger to an automation
Provide exactly one schedule: a frequency cron expression for recurring runs, every_seconds for a fixed interval, or a scheduled_at timestamp for a one-time run. More than one returns 400 schedule_conflict. every_seconds must be a positive integer (400 invalid_every_seconds); values from 1 to 59 are raised to the 60-second minimum, returned as every_seconds: 60 with a schedule_interval_raised entry in warnings. Only the automation’s creator can change it; workspace owners and admins can pause or delete it. Anyone else receives 403 automation_owner_only. A system automation (include=system) is changed only by workspace owners and admins (403 workspace_agent_admin_only); any member may add a trigger to it, which runs as that member, and remove their own triggers.
automations:writecurl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"frequency": "0 3 * * *"
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers"
payload = { "frequency": "0 3 * * *" }
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({frequency: '0 3 * * *'})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers', 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}/automations/{automationId}/triggers",
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([
'frequency' => '0 3 * * *'
]),
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}/automations/{automationId}/triggers"
payload := strings.NewReader("{\n \"frequency\": \"0 3 * * *\"\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}/automations/{automationId}/triggers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"frequency\": \"0 3 * * *\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/automations/{automationId}/triggers")
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 \"frequency\": \"0 3 * * *\"\n}"
response = http.request(request)
puts response.read_body{
"id": "trigger_example",
"kind": "schedule",
"enabled": true,
"schedule": {
"kind": "cron",
"expression": "0 9 * * *",
"every_seconds": null,
"next_run_at": "2026-09-24T09:00:00Z"
},
"github": null,
"webhook": null,
"run_kind": null,
"last_fired_at": null,
"created_at": "2026-09-01T00:00:00Z",
"updated_at": "2026-09-01T00:00:00Z"
}{
"error": "prompt_required"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": "session_not_found"
}{
"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: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
Adds a schedule trigger to the automation. Provide exactly one of frequency, every_seconds, or scheduled_at; more than one returns 400 schedule_conflict, none returns 400 schedule_required.
Cron expression, e.g. 0 3 * * *, for a recurring trigger.
Fixed interval in seconds, a positive integer. Alternative to frequency. The scheduler's minimum is 60 seconds: values from 1 to 59 are stored and returned as 60 with a schedule_interval_raised warning; zero or less returns 400 invalid_every_seconds.
Run-at time for a one-time trigger. Alternative to frequency.
Response
Created.
A condition that fires the automation. The webhook secret is never returned.
schedule, github_event, webhook Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Present only when the request was accepted but something is not as sent or not usable yet. Codes: schedule_interval_raised, app_tool_not_connected.
Show child attributes
Show child attributes

