from decimalai.skill_router import SkillRouter
router = SkillRouter(api_key="dai_sk_...")
menu = router.get_menu(category="tools")curl --request GET \
--url https://api.decimal.ai/api/v1/skills/menu \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.decimal.ai/api/v1/skills/menu', 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.decimal.ai/api/v1/skills/menu",
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.decimal.ai/api/v1/skills/menu"
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.decimal.ai/api/v1/skills/menu")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/skills/menu")
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{
"skills": [
{
"name": "search-flights",
"category": "tools",
"description": "Search available flights",
"is_active": true
},
{
"name": "book-flights",
"category": "tools",
"description": "Book a flight by ID",
"is_active": true
}
],
"total": 8,
"prompt_fragment": "You have access to 8 skills..."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get the skill menu (Free tier)
Get the full skill menu for prompt injection (Free tier).
Returns the agent’s active skills with name + description and a
ready-to-use prompt fragment, scoped by the Use/Fork resolver. When
agent_name is supplied, that agent’s agent-scope Use rows are included.
Owned candidates are visibility-scoped to the caller when their identity
is known, so a personal or workspace skill never appears in another
org member’s menu. When the caller is an API key with no user identity,
only org-wide skills are eligible.
With as_agent=true the list is the one agent_name’s runs receive:
resolved as the user behind the API key of its latest run, without
recording a routing decision. Each row then says why the skill is on the
list, the rows cut by the row and token limits come back under
not_sent, and last_run holds the list that run reported.
With evaluation, prompt_version or exclude_skills the call is an
evaluation run: one run’s own prompt version and skill list, without
changing what the agent serves.
from decimalai.skill_router import SkillRouter
router = SkillRouter(api_key="dai_sk_...")
menu = router.get_menu(category="tools")curl --request GET \
--url https://api.decimal.ai/api/v1/skills/menu \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.decimal.ai/api/v1/skills/menu', 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.decimal.ai/api/v1/skills/menu",
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.decimal.ai/api/v1/skills/menu"
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.decimal.ai/api/v1/skills/menu")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/skills/menu")
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{
"skills": [
{
"name": "search-flights",
"category": "tools",
"description": "Search available flights",
"is_active": true
},
{
"name": "book-flights",
"category": "tools",
"description": "Book a flight by ID",
"is_active": true
}
],
"total": 8,
"prompt_fragment": "You have access to 8 skills..."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Enter your API key (e.g. dai_sk_test_key_001)
Headers
Query Parameters
Filter by category (e.g. 'tools', 'policies').
"tools"
Filter to a single project.
Scope the menu to one agent (Use/Fork resolver) — agent-scope Use rows for that agent are included.
Dashboard view of agent_name's list: resolve it with the identity the agent's own API key carries (taken from its latest run) instead of the caller's, record no routing decision, and return why each skill is on the list, the rows the caps cut, and the list the last run reported.
this_run when this answer shapes the run that asked: while the agent runs an experiment, the call gets an arm (a skill held out, or prompt B) and the response names the experiment. capable for a call that can route first but whose answer is not this run's: no arm, the experiment is named. Sent by decimalai 0.25+; leave it out to get the configured setup.
^(this_run|capable)$An evaluation run (decimalai.evaluate()): no experiment arm, the run is kept out of the agent's own results, and the response echoes evaluation. Implied by prompt_version and exclude_skills. Needs agent_name.
An evaluation run on this saved version of the agent's prompt instead of the served one: its text comes back under prompt. 422 when the agent has no such version.
x >= 1An evaluation run without these skills (repeat the parameter per name): left out of every list, and refused to the run's load_skill calls. 422 for a name the agent does not have.
Cookies
Response
Successful Response