curl --request POST \
--url https://api.sidenet.ai/v1/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds\n\n1. Full refund within 14 days of purchase…"
}
'import requests
url = "https://api.sidenet.ai/v1/skills"
payload = {
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds
1. Full refund within 14 days of purchase…"
}
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: 'refund-policy',
description: 'How refunds are decided and worded. Load before answering any refund or cancellation question.',
instructions: '## Refunds\n\n1. Full refund within 14 days of purchase…'
})
};
fetch('https://api.sidenet.ai/v1/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.sidenet.ai/v1/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' => 'refund-policy',
'description' => 'How refunds are decided and worded. Load before answering any refund or cancellation question.',
'instructions' => '## Refunds
1. Full refund within 14 days of purchase…'
]),
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.sidenet.ai/v1/skills"
payload := strings.NewReader("{\n \"name\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\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.sidenet.ai/v1/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sidenet.ai/v1/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\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\n}"
response = http.request(request)
puts response.read_body{
"skill": {
"id": "9a4e2c71-5b08-4f3d-a6c2-1e7d8b0f4c23",
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"status": "draft",
"active_version_id": null,
"latest_version_id": "3c8f1d26-7e94-4a05-b2d7-6f0a9c5e8b41",
"dirty": true,
"created_at": "2026-10-01T09:12:44.881Z",
"updated_at": "2026-10-14T08:30:20.517Z"
},
"latest": {
"id": "3c8f1d26-7e94-4a05-b2d7-6f0a9c5e8b41",
"skill_id": "9a4e2c71-5b08-4f3d-a6c2-1e7d8b0f4c23",
"version_number": 1,
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds\n\n1. Full refund within 14 days of purchase…",
"change_message": "Initial version",
"changed_fields": [
"instructions"
],
"created_at": "2026-10-14T08:30:20.517Z",
"active": false
},
"active": null
}Create skill
Creates a skill with its first version. A skill is a named block of instructions an agent loads on demand (through its skill tool) instead of carrying it in every prompt: a refund policy, a reporting format, a long procedure. The description is what tells the agent WHEN to load it, so write it as a rule (“Load before answering any refund question”). The skill is not live until POST /v1/skills/{id}/publish; attach it to an agent with skills: [{ skill_id }] on the agent draft.
curl --request POST \
--url https://api.sidenet.ai/v1/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds\n\n1. Full refund within 14 days of purchase…"
}
'import requests
url = "https://api.sidenet.ai/v1/skills"
payload = {
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds
1. Full refund within 14 days of purchase…"
}
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: 'refund-policy',
description: 'How refunds are decided and worded. Load before answering any refund or cancellation question.',
instructions: '## Refunds\n\n1. Full refund within 14 days of purchase…'
})
};
fetch('https://api.sidenet.ai/v1/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.sidenet.ai/v1/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' => 'refund-policy',
'description' => 'How refunds are decided and worded. Load before answering any refund or cancellation question.',
'instructions' => '## Refunds
1. Full refund within 14 days of purchase…'
]),
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.sidenet.ai/v1/skills"
payload := strings.NewReader("{\n \"name\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\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.sidenet.ai/v1/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sidenet.ai/v1/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\": \"refund-policy\",\n \"description\": \"How refunds are decided and worded. Load before answering any refund or cancellation question.\",\n \"instructions\": \"## Refunds\\n\\n1. Full refund within 14 days of purchase…\"\n}"
response = http.request(request)
puts response.read_body{
"skill": {
"id": "9a4e2c71-5b08-4f3d-a6c2-1e7d8b0f4c23",
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"status": "draft",
"active_version_id": null,
"latest_version_id": "3c8f1d26-7e94-4a05-b2d7-6f0a9c5e8b41",
"dirty": true,
"created_at": "2026-10-01T09:12:44.881Z",
"updated_at": "2026-10-14T08:30:20.517Z"
},
"latest": {
"id": "3c8f1d26-7e94-4a05-b2d7-6f0a9c5e8b41",
"skill_id": "9a4e2c71-5b08-4f3d-a6c2-1e7d8b0f4c23",
"version_number": 1,
"name": "refund-policy",
"description": "How refunds are decided and worded. Load before answering any refund or cancellation question.",
"instructions": "## Refunds\n\n1. Full refund within 14 days of purchase…",
"change_message": "Initial version",
"changed_fields": [
"instructions"
],
"created_at": "2026-10-14T08:30:20.517Z",
"active": false
},
"active": null
}Authorizations
Organization API key, generated in studio.sidenet.ai. Backend only — never in a browser.
Body
1-64 chars: lowercase letters, digits and hyphens. Two skills on one agent may not share a name.
"refund-policy"
What the skill covers and when the agent should load it. Shown to the agent on every turn.
1024"How refunds are decided and worded. Load before answering any refund or cancellation question."
Markdown the agent receives when it loads the skill. Positive, imperative rules work best.
60000"## Refunds\n\n1. Full refund within 14 days of purchase…"