curl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"name": "Release checklist",
"description": "Use when preparing a production release, deploying changes, or applying the team's release checklist.",
"instructions": "Run the full test suite, update the changelog, then wait for a human approval before deploying.",
"activation_keywords": [
"release",
"deploy"
]
}
EOFimport requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/skills"
payload = {
"name": "Release checklist",
"description": "Use when preparing a production release, deploying changes, or applying the team's release checklist.",
"instructions": "Run the full test suite, update the changelog, then wait for a human approval before deploying.",
"activation_keywords": ["release", "deploy"]
}
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({
name: 'Release checklist',
description: 'Use when preparing a production release, deploying changes, or applying the team\'s release checklist.',
instructions: 'Run the full test suite, update the changelog, then wait for a human approval before deploying.',
activation_keywords: ['release', 'deploy']
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/skills', 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.ai/v3/organizations/{orgId}/skills",
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([
'name' => 'Release checklist',
'description' => 'Use when preparing a production release, deploying changes, or applying the team\'s release checklist.',
'instructions' => 'Run the full test suite, update the changelog, then wait for a human approval before deploying.',
'activation_keywords' => [
'release',
'deploy'
]
]),
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.ai/v3/organizations/{orgId}/skills"
payload := strings.NewReader("{\n \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\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.ai/v3/organizations/{orgId}/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/skills")
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 \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"skill_id": "<string>",
"name": "<string>",
"description": "<string>",
"instructions": "<string>",
"activation_keywords": [
"<string>"
],
"is_enabled": true,
"author": "<string>",
"provenance": "authored",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "prompt_required"
}Create a skill
skills:writecurl --request POST \
--url https://api.reasonmachines.ai/v3/organizations/{orgId}/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"name": "Release checklist",
"description": "Use when preparing a production release, deploying changes, or applying the team's release checklist.",
"instructions": "Run the full test suite, update the changelog, then wait for a human approval before deploying.",
"activation_keywords": [
"release",
"deploy"
]
}
EOFimport requests
url = "https://api.reasonmachines.ai/v3/organizations/{orgId}/skills"
payload = {
"name": "Release checklist",
"description": "Use when preparing a production release, deploying changes, or applying the team's release checklist.",
"instructions": "Run the full test suite, update the changelog, then wait for a human approval before deploying.",
"activation_keywords": ["release", "deploy"]
}
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({
name: 'Release checklist',
description: 'Use when preparing a production release, deploying changes, or applying the team\'s release checklist.',
instructions: 'Run the full test suite, update the changelog, then wait for a human approval before deploying.',
activation_keywords: ['release', 'deploy']
})
};
fetch('https://api.reasonmachines.ai/v3/organizations/{orgId}/skills', 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.ai/v3/organizations/{orgId}/skills",
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([
'name' => 'Release checklist',
'description' => 'Use when preparing a production release, deploying changes, or applying the team\'s release checklist.',
'instructions' => 'Run the full test suite, update the changelog, then wait for a human approval before deploying.',
'activation_keywords' => [
'release',
'deploy'
]
]),
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.ai/v3/organizations/{orgId}/skills"
payload := strings.NewReader("{\n \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\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.ai/v3/organizations/{orgId}/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.ai/v3/organizations/{orgId}/skills")
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 \"name\": \"Release checklist\",\n \"description\": \"Use when preparing a production release, deploying changes, or applying the team's release checklist.\",\n \"instructions\": \"Run the full test suite, update the changelog, then wait for a human approval before deploying.\",\n \"activation_keywords\": [\n \"release\",\n \"deploy\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"skill_id": "<string>",
"name": "<string>",
"description": "<string>",
"instructions": "<string>",
"activation_keywords": [
"<string>"
],
"is_enabled": true,
"author": "<string>",
"provenance": "authored",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "prompt_required"
}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
Describe what the skill does and when an agent should use it. Ara uses this description for semantic selection.
Optional search aliases retained for compatibility. They improve explicit search but do not activate the skill automatically.
Response
Created.
What the skill does and when an agent should use it. Ara uses this description for semantic selection.
Optional search aliases retained for compatibility. They do not activate the skill automatically.
authored, skills_sh, git, agent_plugin, curated_integration, builtin 
