curl --request GET \
--url https://api.checkfu.com/v1/skill-proposals/{id} \
--header 'Authorization: Bearer <token>' \
--header 'checkfu-version: <checkfu-version>'import requests
url = "https://api.checkfu.com/v1/skill-proposals/{id}"
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'checkfu-version': '<checkfu-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.checkfu.com/v1/skill-proposals/{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/skill-proposals/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.checkfu.com/v1/skill-proposals/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("checkfu-version", "<checkfu-version>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.checkfu.com/v1/skill-proposals/{id}")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/skill-proposals/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "authoring",
"source_session_ids": [
"<string>"
],
"agent": "<string>",
"model_routing_profile_key": "<string>",
"instructions": "<string>",
"skill": {
"name": "<string>",
"description": "<string>",
"kind": "instructional",
"entry": "<string>",
"content_sha256": "<string>"
},
"verification_material": {
"task": "<string>",
"rubric": "<string>"
},
"verifications": [
{
"session": "<string>",
"started_at": "<string>",
"result": {
"verdict": "satisfied",
"explanation": "<string>",
"cost_tokens": 1,
"completed_at": "<string>"
},
"source_version": 1,
"principal": "<string>",
"launched_at": "<string>"
}
],
"submission": {
"skill_source": "<string>",
"branch": "<string>",
"commit_sha": "<string>",
"submitted_at": "<string>"
},
"adoption": {
"skill_id": "<string>",
"skill_version": 1,
"observed_at": "<string>"
},
"error": "input_session_unavailable",
"usage": {
"input_tokens": 1,
"cached_input_tokens": 1,
"cache_write_input_tokens": 1,
"output_tokens": 1,
"reasoning_output_tokens": 1,
"total_tokens": 1
},
"created_at": "<string>",
"updated_at": "<string>",
"version": 1,
"submission_attempt": {
"source_version": 1,
"skill_source": "<string>",
"acted_as": "<string>",
"branch": "<string>",
"base_commit_sha": "<string>",
"base_content_sha256": "<string>",
"expected_base_digest": "<string>",
"prepared_commit_sha": "<string>",
"started_at": "<string>"
}
}{
"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": "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"
}
}Get a Skill proposal
Read one SkillProposal: its authored skill, verification material, every recorded verification, and its submission and adoption records. Reads reconcile a verification’s terminal verdict from its owned Session event log and adoption from the Skill catalog, so the returned version may advance. Adoption is detected content-addressed — a Workspace Skill whose canonical digest equals the proposal’s is that proposal, merged.
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 GET \
--url https://api.checkfu.com/v1/skill-proposals/{id} \
--header 'Authorization: Bearer <token>' \
--header 'checkfu-version: <checkfu-version>'import requests
url = "https://api.checkfu.com/v1/skill-proposals/{id}"
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'checkfu-version': '<checkfu-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.checkfu.com/v1/skill-proposals/{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/skill-proposals/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.checkfu.com/v1/skill-proposals/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("checkfu-version", "<checkfu-version>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.checkfu.com/v1/skill-proposals/{id}")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/skill-proposals/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "authoring",
"source_session_ids": [
"<string>"
],
"agent": "<string>",
"model_routing_profile_key": "<string>",
"instructions": "<string>",
"skill": {
"name": "<string>",
"description": "<string>",
"kind": "instructional",
"entry": "<string>",
"content_sha256": "<string>"
},
"verification_material": {
"task": "<string>",
"rubric": "<string>"
},
"verifications": [
{
"session": "<string>",
"started_at": "<string>",
"result": {
"verdict": "satisfied",
"explanation": "<string>",
"cost_tokens": 1,
"completed_at": "<string>"
},
"source_version": 1,
"principal": "<string>",
"launched_at": "<string>"
}
],
"submission": {
"skill_source": "<string>",
"branch": "<string>",
"commit_sha": "<string>",
"submitted_at": "<string>"
},
"adoption": {
"skill_id": "<string>",
"skill_version": 1,
"observed_at": "<string>"
},
"error": "input_session_unavailable",
"usage": {
"input_tokens": 1,
"cached_input_tokens": 1,
"cache_write_input_tokens": 1,
"output_tokens": 1,
"reasoning_output_tokens": 1,
"total_tokens": 1
},
"created_at": "<string>",
"updated_at": "<string>",
"version": 1,
"submission_attempt": {
"source_version": 1,
"skill_source": "<string>",
"acted_as": "<string>",
"branch": "<string>",
"base_commit_sha": "<string>",
"base_content_sha256": "<string>",
"expected_base_digest": "<string>",
"prepared_commit_sha": "<string>",
"started_at": "<string>"
}
}{
"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": "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-27 Path Parameters
^skp_[0-9a-f]{32}$Response
an error exactly on authoring failure, an artifact exactly past authoring, a pending submission while submitting and optionally retained after submission for recovery, a completed submission exactly on submitted, adoption only after submission, and verification states only with a recorded attempt
^skp_[0-9a-f]{32}$authoring, drafted, authoring_failed, verifying, verified, verification_failed, submitting, submitted, discarded 1 - 8 elements^sess_[0-9a-f]{32}$^agent_[0-9a-f]{32}$^[a-z0-9](?:[a-z0-9._-]{0,93})$4096Show child attributes
Show child attributes
Show child attributes
Show child attributes
8Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
input_session_unavailable, input_sessions_too_large, authoring_failed, internal Show child attributes
Show child attributes
x > 0Show child attributes
Show child attributes