curl --request PATCH \
--url https://api.checkfu.com/v1/skills/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'checkfu-version: <checkfu-version>' \
--data '
{
"expected_version": 1,
"display_name": "<string>",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>"
}
]
}
'import requests
url = "https://api.checkfu.com/v1/skills/{id}"
payload = {
"expected_version": 1,
"display_name": "<string>",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>"
}
]
}
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'checkfu-version': '<checkfu-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
expected_version: 1,
display_name: '<string>',
description: '<string>',
instructions: '<string>',
files: [{path: '<string>', content_base64: '<string>'}]
})
};
fetch('https://api.checkfu.com/v1/skills/{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.checkfu.com/v1/skills/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'expected_version' => 1,
'display_name' => '<string>',
'description' => '<string>',
'instructions' => '<string>',
'files' => [
[
'path' => '<string>',
'content_base64' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"checkfu-version: <checkfu-version>"
],
]);
$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.checkfu.com/v1/skills/{id}"
payload := strings.NewReader("{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("checkfu-version", "<checkfu-version>")
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.patch("https://api.checkfu.com/v1/skills/{id}")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/skills/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"kind": "instructional",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>",
"sha256": "<string>",
"bytes": 1
}
],
"version": 1,
"created_at": "<string>",
"updated_at": "<string>",
"display_name": "<string>",
"status": "active"
}{
"error": {
"type": "validation.malformed",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-malformed"
}
}{
"error": {
"type": "auth.invalid_key",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-invalid-key"
}
}{
"error": {
"type": "auth.disabled_tenancy",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-disabled-tenancy"
}
}{
"error": {
"type": "validation.not_found",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-not-found"
}
}{
"error": {
"type": "validation.conflict",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-conflict"
}
}{
"error": {
"type": "budget.exceeded",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#budget-exceeded"
}
}{
"error": {
"type": "runtime.internal",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#runtime-internal"
}
}Update a Skill
Replace a Skill’s optional non-unique display name, kind, description, instructions, or complete file set, passing expected_version in the body and committing a new immutable version. Set display_name to null to restore presentation from the immutable logical name. File paths follow the create rules: normalized relative POSIX paths, unique destinations, no generated SKILL.md collision, and no file/directory ancestor collision. An edit after Session admission never changes or strands the admitted release: the pinned version stays materializable and the next Session picks up the new content.
Checkfu support posture: alpha; hosted. Required evidence journey: skill-delivery. Deployment-specific readiness and the latest proven release are available from GET /v1/support/capabilities.
curl --request PATCH \
--url https://api.checkfu.com/v1/skills/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'checkfu-version: <checkfu-version>' \
--data '
{
"expected_version": 1,
"display_name": "<string>",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>"
}
]
}
'import requests
url = "https://api.checkfu.com/v1/skills/{id}"
payload = {
"expected_version": 1,
"display_name": "<string>",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>"
}
]
}
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'checkfu-version': '<checkfu-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
expected_version: 1,
display_name: '<string>',
description: '<string>',
instructions: '<string>',
files: [{path: '<string>', content_base64: '<string>'}]
})
};
fetch('https://api.checkfu.com/v1/skills/{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.checkfu.com/v1/skills/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'expected_version' => 1,
'display_name' => '<string>',
'description' => '<string>',
'instructions' => '<string>',
'files' => [
[
'path' => '<string>',
'content_base64' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"checkfu-version: <checkfu-version>"
],
]);
$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.checkfu.com/v1/skills/{id}"
payload := strings.NewReader("{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("checkfu-version", "<checkfu-version>")
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.patch("https://api.checkfu.com/v1/skills/{id}")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/skills/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_version\": 1,\n \"display_name\": \"<string>\",\n \"description\": \"<string>\",\n \"instructions\": \"<string>\",\n \"files\": [\n {\n \"path\": \"<string>\",\n \"content_base64\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"kind": "instructional",
"description": "<string>",
"instructions": "<string>",
"files": [
{
"path": "<string>",
"content_base64": "<string>",
"sha256": "<string>",
"bytes": 1
}
],
"version": 1,
"created_at": "<string>",
"updated_at": "<string>",
"display_name": "<string>",
"status": "active"
}{
"error": {
"type": "validation.malformed",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-malformed"
}
}{
"error": {
"type": "auth.invalid_key",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-invalid-key"
}
}{
"error": {
"type": "auth.disabled_tenancy",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-disabled-tenancy"
}
}{
"error": {
"type": "validation.not_found",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-not-found"
}
}{
"error": {
"type": "validation.conflict",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-conflict"
}
}{
"error": {
"type": "budget.exceeded",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#budget-exceeded"
}
}{
"error": {
"type": "runtime.internal",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#runtime-internal"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
2026-08-24 Path Parameters
^skl_[0-9a-f]{32}$Body
x > 0An optional non-unique Skill presentation label; clients fall back to the logical name when absent or null.
1 - 255instructional, executable 163841048576At most 256 files. Paths must be unique, may not be an ancestor of another path, and may not equal or descend from the generated SKILL.md entry.
256Show child attributes
Show child attributes
active, archived Response
Success
^skl_[0-9a-f]{32}$^wrkspc_[0-9a-f]{32}$^[a-z0-9](?:[a-z0-9._-]{0,93})$instructional, executable 16384Show child attributes
Show child attributes
x > 0An optional non-unique Skill presentation label; clients fall back to the logical name when absent or null.
1 - 255active, archived