curl --request PUT \
--url https://app.base44.com/api/workspace/skills/{skill_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": false
}
'import requests
url = "https://app.base44.com/api/workspace/skills/{skill_id}"
payload = {
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'brand-voice',
description: 'Use when writing any user-facing copy for our apps.',
body: JSON.stringify('Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.'),
enabled: false
})
};
fetch('https://app.base44.com/api/workspace/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://app.base44.com/api/workspace/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([
'name' => 'brand-voice',
'description' => 'Use when writing any user-facing copy for our apps.',
'body' => 'Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.',
'enabled' => false
]),
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://app.base44.com/api/workspace/skills/{skill_id}"
payload := strings.NewReader("{\n \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\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://app.base44.com/api/workspace/skills/{skill_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/workspace/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 \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "68d2a1f4c9e7b3001f2a5c88",
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": true,
"created_by": "dana@acme.com",
"created_date": "2026-08-01T09:15:00.123000Z",
"updated_date": "2026-08-03T14:02:10.456000Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Update workspace skill
Changes a skill’s name, description, or instructions, or turns it on or off. Send only the fields you want to change. A field you leave out, or send as null, keeps its value, and an empty body changes nothing.
Set enabled to false to stop the AI builder from using the skill without deleting it.
Skills belong to the workspace your credential is for. With a personal access token, that’s the token’s workspace, and there’s no parameter to choose another one.
Skills need the Builder plan or higher. Below it, this returns a 403.
This is limited to 60 requests per minute, shared with the other endpoints that change skills. A signed-in session has its own limit, and every personal access token for the workspace shares one. Some workspaces have a different limit.
curl --request PUT \
--url https://app.base44.com/api/workspace/skills/{skill_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": false
}
'import requests
url = "https://app.base44.com/api/workspace/skills/{skill_id}"
payload = {
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'brand-voice',
description: 'Use when writing any user-facing copy for our apps.',
body: JSON.stringify('Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.'),
enabled: false
})
};
fetch('https://app.base44.com/api/workspace/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://app.base44.com/api/workspace/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([
'name' => 'brand-voice',
'description' => 'Use when writing any user-facing copy for our apps.',
'body' => 'Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.',
'enabled' => false
]),
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://app.base44.com/api/workspace/skills/{skill_id}"
payload := strings.NewReader("{\n \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\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://app.base44.com/api/workspace/skills/{skill_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/workspace/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 \"name\": \"brand-voice\",\n \"description\": \"Use when writing any user-facing copy for our apps.\",\n \"body\": \"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.\",\n \"enabled\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "68d2a1f4c9e7b3001f2a5c88",
"name": "brand-voice",
"description": "Use when writing any user-facing copy for our apps.",
"body": "Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words.",
"enabled": true,
"created_by": "dana@acme.com",
"created_date": "2026-08-01T09:15:00.123000Z",
"updated_date": "2026-08-03T14:02:10.456000Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the skill to update. Get it from id in List workspace skills.
Body
New name. Name of the skill, up to 64 characters: lowercase letters and digits in words joined by single hyphens, such as code-review. Unique within the workspace.
1 - 64"brand-voice"
New description. When the skill applies, up to 1024 characters. The AI builder reads it to decide when to load the skill, so say what the skill is for.
1 - 1024"Use when writing any user-facing copy for our apps."
New instructions. The instructions the AI builder follows once it loads the skill, up to 15000 characters.
1 - 15000"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words."
true lets the AI builder use the skill, and false stops it.
false
Response
The updated skill.
ID of the skill.
"68d2a1f4c9e7b3001f2a5c88"
Name of the skill.
"brand-voice"
When the skill applies.
"Use when writing any user-facing copy for our apps."
The instructions the AI builder follows once it loads the skill.
"Write in a warm, plain-spoken voice. Use sentence case for headings and keep buttons to two words."
Whether the AI builder can use the skill.
true
Email of the member who created the skill.
"dana@acme.com"
Time the skill was created, in UTC, as an ISO 8601 timestamp.
"2026-08-01T09:15:00.123000Z"
Time the skill last changed, in UTC, as an ISO 8601 timestamp.
"2026-08-03T14:02:10.456000Z"
Was this page helpful?