Skip to main content

Skills API

Manage skills in the Skill Library. Skills are reusable knowledge packages (markdown instructions) that teach agents how to handle specific tasks.

Skills are separate from Prompts — prompts are templates for LLM messages, while skills are behavioral instructions for agents.

Authentication

All endpoints require a valid API key via the Authorization header:

Authorization: Bearer sk-prod-...

Skill Object

FieldTypeDescription
idstringUnique skill ID
namestringSkill name
descriptionstringWhat the skill does and when to use it
contentstringFull skill content (markdown with optional YAML frontmatter)
variablesarrayTemplate variables extracted from {{name}} syntax
tagsarrayTags for categorization and discovery
categorystringSkill category (e.g., "tools", "agent", "support")
currentVersionnumberCurrent version number
ownerIdstringOwner user ID
ownerNamestringOwner display name
sharedWitharrayUser IDs with read access
isPublicbooleanWhether the skill is publicly visible
sourcestringOrigin: user, marketplace, github:owner/repo
mcpToolsarrayMCP tool names this skill references
githubUrlstringGitHub source URL (if imported)
usageCountnumberHow many times the skill has been used
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last update timestamp

Version Object

FieldTypeDescription
idstringVersion ID
skillIdstringParent skill ID
versionNumbernumberSequential version number
contentstringFull content snapshot at this version
variablesarrayVariables at this version
changeNotestringDescription of what changed
createdAtstringISO 8601 timestamp
createdBystringUser ID who created this version
createdByNamestringDisplay name

Endpoints

List Skills

GET /api/v1/skills

Query Parameters:

ParameterTypeDescription
searchstringSearch by name or description
tagsstringComma-separated tags to filter by
categorystringFilter by category
limitnumberMax results per page (default: 20, max: 100)
offsetnumberPagination offset

Response:

{
"data": [
{
"id": "abc123",
"name": "Product Search",
"description": "Semantic search across product catalog",
"tags": ["search", "milvus"],
"category": "tools",
"currentVersion": 3,
"ownerName": "Admin",
"isPublic": false,
"source": "marketplace",
"usageCount": 42,
"updatedAt": "2026-03-27T00:00:00.000Z"
}
],
"total": 15,
"limit": 20,
"offset": 0
}

Create Skill

POST /api/v1/skills

Request Body:

{
"name": "Product Search",
"description": "Semantic search across the product catalog",
"content": "# Product Search\n\n## When to Use\nUser asks to find products...\n\n## Instructions\n...",
"tags": ["search", "milvus"],
"category": "tools",
"mcpTools": ["product_search"]
}
FieldTypeRequiredDescription
namestringYesSkill name
contentstringYesMarkdown content (supports {{variables}})
descriptionstringNoDescription
tagsarrayNoTags for discovery
categorystringNoCategory
mcpToolsarrayNoMCP tool names this skill uses
sourcestringNoSource identifier (default: "user")

Response: 201 Created

{
"data": { "skillId": "abc123" }
}

Get Skill

GET /api/v1/skills/:id

Returns the full skill with content (excluding embedding vector).

Response:

{
"data": {
"id": "abc123",
"name": "Product Search",
"content": "# Product Search\n\n## When to Use\n...",
"variables": [
{ "name": "limit", "required": true }
],
"tags": ["search"],
"category": "tools",
"currentVersion": 3,
"mcpTools": ["product_search"]
}
}

Update Skill

PUT /api/v1/skills/:id

Content changes automatically create a new version.

Request Body:

{
"content": "# Updated Product Search\n\n...",
"changeNote": "Added error handling instructions"
}

Delete Skill

DELETE /api/v1/skills/:id

Deletes the skill and all its versions. Cannot be undone.

List Versions

GET /api/v1/skills/:id/versions

Returns all versions, newest first.

Restore Version

POST /api/v1/skills/:id/restore

Creates a new version with the restored content.

Request Body:

{
"versionNumber": 2
}

Update Scope

PATCH /api/v1/skills/:id/scope

Re-scope an existing skill (per-agent isolation Phase 4). Owner-only. The owner can move a skill between user-global / agent-scoped / app-scoped / workflow-scoped without rewriting any content.

Request Body (either nested or flat top-level)

{
"scope": { "agentId": "agent-123" }
}

Empty / whitespace values collapse to null. Sending {"scope": {}} is the explicit opt-out to user-global. Cross-app rows return 404 (existence- leak prevention).

Response 200 OK

{
"success": true,
"scope": { "agentId": "agent-123", "appId": null, "workflowId": null }
}

Duplicate Skill

POST /api/v1/skills/:id/duplicate

Creates a copy owned by the current user with " (Copy)" suffix.

Render Skill

POST /api/v1/skills/:id/render

Renders the skill content with variable substitution.

Request Body:

{
"variables": {
"limit": "10",
"category": "Handguns"
}
}

Response:

{
"data": {
"content": "Rendered content with variables replaced...",
"skillId": "abc123",
"name": "Product Search"
}
}

Record Usage

POST /api/v1/skills/:id/usage

Increment the usage counter for analytics.

Assess Skill

POST /api/v1/skills/:id/assess

Runs the quality ruleset over the skill's current content and returns a score plus recommendations. Modeled after Anthropic's skill-building guide — checks structure, presence of "When to Use", instruction clarity, variable usage, etc.

Path Parameters:

NameTypeRequiredDescription
idstringYesSkill ID

Request Body: None.

Response:

{
"data": {
"score": 82,
"maxScore": 100,
"grade": "B",
"checks": [
{
"id": "has-when-to-use",
"label": "Includes a 'When to Use' section",
"passed": true,
"weight": 10
},
{
"id": "instructions-actionable",
"label": "Instructions are concrete and actionable",
"passed": false,
"weight": 15,
"recommendation": "Replace abstract guidance with step-by-step actions."
}
],
"recommendations": [
"Add a 'When to Use' section so agents know when to invoke this skill.",
"Document each variable's expected type and example value."
]
}
}

Required Scope: skills:read

Import from GitHub

POST /api/v1/skills/import-github

Imports a skill from a GitHub repository containing a SKILL.md file with YAML frontmatter.

Request Body:

{
"githubUrl": "https://github.com/owner/repo-name"
}

Python SDK

from strongly import Strongly

client = Strongly(api_key="sk-prod-...")

# List skills
for skill in client.skills.list(category="tools"):
print(f"{skill.name} (v{skill.current_version})")

# Create a skill
result = client.skills.create({
"name": "My Skill",
"content": "# My Skill\n\nInstructions...",
"tags": ["custom"],
})
skill_id = result["data"]["skillId"]

# Get skill content
skill = client.skills.retrieve(skill_id)
print(skill.content)

# Update with versioning
client.skills.update(skill_id, {
"content": "# Updated content",
"changeNote": "Improved instructions",
})

# Render with variables
rendered = client.skills.render(skill_id, {"limit": "10"})
print(rendered.content)

# Import from GitHub
client.skills.import_from_github("https://github.com/owner/my-skill")

# List versions
versions = client.skills.list_versions(skill_id)
for v in versions:
print(f"v{v.version_number}: {v.change_note}")

Scopes

ScopeEndpoints
skills:readGET /skills, GET /skills/:id, GET /skills/:id/versions, POST /skills/:id/render, POST /skills/:id/usage, POST /skills/:id/assess
skills:writePOST /skills, PUT /skills/:id, DELETE /skills/:id, POST /skills/:id/restore, POST /skills/:id/duplicate, POST /skills/import-github