Create a skill
curl --request POST \
--url https://api.usenotra.com/v1/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "humanizer",
"description": "Polish near-final drafts so they sound natural and specific.",
"content": "# Humanizer\n\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details."
}
'import requests
url = "https://api.usenotra.com/v1/skills"
payload = {
"name": "humanizer",
"description": "Polish near-final drafts so they sound natural and specific.",
"content": "# Humanizer
Rewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details."
}
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: 'humanizer',
description: 'Polish near-final drafts so they sound natural and specific.',
content: '# Humanizer\n\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.'
})
};
fetch('https://api.usenotra.com/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.usenotra.com/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' => 'humanizer',
'description' => 'Polish near-final drafts so they sound natural and specific.',
'content' => '# Humanizer
Rewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.'
]),
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.usenotra.com/v1/skills"
payload := strings.NewReader("{\n \"name\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\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.usenotra.com/v1/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/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\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\n}"
response = http.request(request)
puts response.read_body{
"skill": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"isSystem": true,
"updatedAt": "<string>",
"content": "<string>",
"createdAt": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}Create a skill
Creates a custom skill. Names must be unique within the organization.
POST
https://api.usenotra.com
/
v1
/
skills
Create a skill
curl --request POST \
--url https://api.usenotra.com/v1/skills \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "humanizer",
"description": "Polish near-final drafts so they sound natural and specific.",
"content": "# Humanizer\n\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details."
}
'import requests
url = "https://api.usenotra.com/v1/skills"
payload = {
"name": "humanizer",
"description": "Polish near-final drafts so they sound natural and specific.",
"content": "# Humanizer
Rewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details."
}
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: 'humanizer',
description: 'Polish near-final drafts so they sound natural and specific.',
content: '# Humanizer\n\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.'
})
};
fetch('https://api.usenotra.com/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.usenotra.com/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' => 'humanizer',
'description' => 'Polish near-final drafts so they sound natural and specific.',
'content' => '# Humanizer
Rewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.'
]),
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.usenotra.com/v1/skills"
payload := strings.NewReader("{\n \"name\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\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.usenotra.com/v1/skills")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/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\": \"humanizer\",\n \"description\": \"Polish near-final drafts so they sound natural and specific.\",\n \"content\": \"# Humanizer\\n\\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details.\"\n}"
response = http.request(request)
puts response.read_body{
"skill": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"isSystem": true,
"updatedAt": "<string>",
"content": "<string>",
"createdAt": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}Authorizations
Send your API key in the Authorization header as Bearer API_KEY.
Body
application/json
Skill name. Lowercase letters, digits, and hyphens only.
Required string length:
1 - 64Pattern:
^[a-z0-9]+(?:-[a-z0-9]+)*$Example:
"humanizer"
Short description of when the skill should be used.
Required string length:
1 - 1000Example:
"Polish near-final drafts so they sound natural and specific."
Full skill instructions, typically Markdown.
Required string length:
1 - 200000Example:
"# Humanizer\n\nRewrite the draft so it reads like a person wrote it. Remove filler, vary sentence length, and keep concrete details."
Response
Skill created successfully
Show child attributes
Show child attributes
Last modified on October 2, 2026
Was this page helpful?