from decimalai.skill_router import SkillRouter
router = SkillRouter(api_key="dai_sk_...")
router.update_skill(
skill_id="sk_abc123",
body_markdown="Updated skill content...",
change_summary="Tightened the retry guidance.",
)curl --request PUT \
--url https://api.decimal.ai/api/v1/skills/{skill_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "<string>",
"description": "<string>",
"body_markdown": "<string>",
"body": "<string>",
"stability": "<string>",
"is_active": true,
"category": "<string>",
"skill_type": "<string>",
"skill_scope": "<string>",
"invocation_mode": "<string>",
"offer_scope": "<string>",
"visibility": "<string>",
"trigger_phrases": [
"<string>"
],
"frontmatter": {},
"change_summary": "<string>",
"author": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
display_name: '<string>',
description: '<string>',
body_markdown: '<string>',
body: JSON.stringify('<string>'),
stability: '<string>',
is_active: true,
category: '<string>',
skill_type: '<string>',
skill_scope: '<string>',
invocation_mode: '<string>',
offer_scope: '<string>',
visibility: '<string>',
trigger_phrases: ['<string>'],
frontmatter: {},
change_summary: '<string>',
author: '<string>'
})
};
fetch('https://api.decimal.ai/api/v1/skills/{skill_id}', 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/{skill_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'display_name' => '<string>',
'description' => '<string>',
'body_markdown' => '<string>',
'body' => '<string>',
'stability' => '<string>',
'is_active' => true,
'category' => '<string>',
'skill_type' => '<string>',
'skill_scope' => '<string>',
'invocation_mode' => '<string>',
'offer_scope' => '<string>',
'visibility' => '<string>',
'trigger_phrases' => [
'<string>'
],
'frontmatter' => [
],
'change_summary' => '<string>',
'author' => '<string>'
]),
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.decimal.ai/api/v1/skills/{skill_id}"
payload := strings.NewReader("{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.decimal.ai/api/v1/skills/{skill_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/skills/{skill_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"skill_id": "sk_abc123",
"name": "search-flights",
"latest_version_id": "sv_v4"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Update a skill
Update a skill. Creates a new version if body content changes.
Enforces ownership: only the creator, owning workspace editors,
or org admins can modify. An Only-me (personal) skill is not open to its
team: only its creator, people it is shared with for editing, and org admins.
Stability must be one of: stable, experimental, deprecated.
visibility (personal, workspace, org) can be changed only by the
skill’s creator, its owning team’s admins and org admins; an Only-me skill’s,
only by its creator and org admins. Making a skill
public goes through POST /skills/{name}/publish; a published skill must be
unpublished before it can take another level.
from decimalai.skill_router import SkillRouter
router = SkillRouter(api_key="dai_sk_...")
router.update_skill(
skill_id="sk_abc123",
body_markdown="Updated skill content...",
change_summary="Tightened the retry guidance.",
)curl --request PUT \
--url https://api.decimal.ai/api/v1/skills/{skill_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"display_name": "<string>",
"description": "<string>",
"body_markdown": "<string>",
"body": "<string>",
"stability": "<string>",
"is_active": true,
"category": "<string>",
"skill_type": "<string>",
"skill_scope": "<string>",
"invocation_mode": "<string>",
"offer_scope": "<string>",
"visibility": "<string>",
"trigger_phrases": [
"<string>"
],
"frontmatter": {},
"change_summary": "<string>",
"author": "<string>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
display_name: '<string>',
description: '<string>',
body_markdown: '<string>',
body: JSON.stringify('<string>'),
stability: '<string>',
is_active: true,
category: '<string>',
skill_type: '<string>',
skill_scope: '<string>',
invocation_mode: '<string>',
offer_scope: '<string>',
visibility: '<string>',
trigger_phrases: ['<string>'],
frontmatter: {},
change_summary: '<string>',
author: '<string>'
})
};
fetch('https://api.decimal.ai/api/v1/skills/{skill_id}', 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/{skill_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'display_name' => '<string>',
'description' => '<string>',
'body_markdown' => '<string>',
'body' => '<string>',
'stability' => '<string>',
'is_active' => true,
'category' => '<string>',
'skill_type' => '<string>',
'skill_scope' => '<string>',
'invocation_mode' => '<string>',
'offer_scope' => '<string>',
'visibility' => '<string>',
'trigger_phrases' => [
'<string>'
],
'frontmatter' => [
],
'change_summary' => '<string>',
'author' => '<string>'
]),
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.decimal.ai/api/v1/skills/{skill_id}"
payload := strings.NewReader("{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.decimal.ai/api/v1/skills/{skill_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decimal.ai/api/v1/skills/{skill_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"body_markdown\": \"<string>\",\n \"body\": \"<string>\",\n \"stability\": \"<string>\",\n \"is_active\": true,\n \"category\": \"<string>\",\n \"skill_type\": \"<string>\",\n \"skill_scope\": \"<string>\",\n \"invocation_mode\": \"<string>\",\n \"offer_scope\": \"<string>\",\n \"visibility\": \"<string>\",\n \"trigger_phrases\": [\n \"<string>\"\n ],\n \"frontmatter\": {},\n \"change_summary\": \"<string>\",\n \"author\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "ok",
"skill_id": "sk_abc123",
"name": "search-flights",
"latest_version_id": "sv_v4"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Enter your API key (e.g. dai_sk_test_key_001)
Headers
Path Parameters
The skill's stable ID (prefixed 'sk_').
"sk_abc123"
Cookies
Body
Validated request for PUT /skills/{id}.
All fields optional (partial update).
Human registry title shown instead of the slug name.
2001024100Taxonomy class: capability or preference (legacy model-gap/proprietary/convention still accepted).
Knowledge scope: public or private.
Who may fire the skill: model, user, or any.
Who the trigger router offers this skill to. 'workspace': every agent in the org. 'restricted': only agents it is explicitly assigned to via POST /agents/{name}/skills/{skill_id}. Leave it out to keep the skill's setting. Metadata only: changing it mints no new version.
Who can see the skill: 'personal' (its creator), 'workspace' (its owning team) or 'org' (everyone in the org). Share grants widen the first two, and org admins see every skill. Only the skill's creator, its owning team's admins and org admins may change it; an Only-me skill's, only its creator and org admins. 'public' is not settable here: publish with POST /skills/{name}/publish, and unpublish a published skill before choosing another level. Sending the current value is a no-op. Metadata only: changing it mints no new version, and agents the skill is explicitly assigned to keep it.
Optional label shown as the author of the version a body change creates (anyone can read it on a published skill). Who made the version is recorded separately.