The Skills API allows you to create and manage custom skills that extend Claude's capabilities with reusable, versioned components.
Skills enable:
Beta Feature: Requires betas: ['skills-2025-10-02']
class Skills extends APIResource {
create(params: SkillCreateParams): APIPromise<SkillCreateResponse>;
retrieve(skillID: string, params?: SkillRetrieveParams): APIPromise<SkillRetrieveResponse>;
list(params?: SkillListParams): SkillListResponsesPageCursor;
delete(skillID: string, params?: SkillDeleteParams): APIPromise<SkillDeleteResponse>;
// Sub-resource
versions: Versions;
}
class Versions extends APIResource {
create(skillID: string, params: VersionCreateParams): APIPromise<VersionCreateResponse>;
retrieve(skillID: string, versionID: string, params?: VersionRetrieveParams): APIPromise<VersionRetrieveResponse>;
list(skillID: string, params?: VersionListParams): VersionListResponsesPageCursor;
delete(skillID: string, versionID: string, params?: VersionDeleteParams): APIPromise<VersionDeleteResponse>;
}Access via:
client.beta.skills.*
client.beta.skills.versions.*interface SkillCreateResponse {
id: string;
type: 'skill';
name: string;
description: string;
created_at: string;
}
interface SkillRetrieveResponse {
id: string;
type: 'skill';
name: string;
description: string;
created_at: string;
versions: VersionListResponse[];
}
interface SkillListResponse {
id: string;
type: 'skill';
name: string;
description: string;
created_at: string;
}
interface SkillDeleteResponse {
id: string;
type: 'skill';
deleted: boolean;
}
interface VersionCreateResponse {
id: string;
skill_id: string;
version: string;
created_at: string;
}
interface VersionRetrieveResponse {
id: string;
skill_id: string;
version: string;
definition: any; // Skill definition
created_at: string;
}client.beta.skills.create(
params: SkillCreateParams
): APIPromise<SkillCreateResponse>;
interface SkillCreateParams {
name: string;
description: string;
definition: any; // Skill implementation
betas: ['skills-2025-10-02'];
}Example:
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const skill = await client.beta.skills.create({
name: 'data_analyzer',
description: 'Analyze structured data and provide insights',
definition: {
// Skill implementation details
type: 'analysis',
capabilities: ['statistics', 'visualization', 'trend_detection'],
},
betas: ['skills-2025-10-02'],
});
console.log('Skill ID:', skill.id);
console.log('Name:', skill.name);const message = await client.beta.messages.create({
model: 'claude-sonnet-4-5-20250929',
max_tokens: 2048,
betas: ['skills-2025-10-02'],
skills: [
{
type: 'skill',
skill_id: skill.id,
},
],
messages: [
{
role: 'user',
content: 'Analyze this dataset and provide insights.',
},
],
});client.beta.skills.retrieve(
skillID: string,
params?: SkillRetrieveParams
): APIPromise<SkillRetrieveResponse>;
interface SkillRetrieveParams {
betas: ['skills-2025-10-02'];
}Example:
const skill = await client.beta.skills.retrieve('skill_abc123', {
betas: ['skills-2025-10-02'],
});
console.log('Skill:', skill.name);
console.log('Description:', skill.description);
console.log('Versions:', skill.versions.length);client.beta.skills.list(
params?: SkillListParams
): SkillListResponsesPageCursor;
interface SkillListParams {
limit?: number;
next_page?: string;
betas: ['skills-2025-10-02'];
}Example:
const skills = await client.beta.skills.list({
limit: 20,
betas: ['skills-2025-10-02'],
});
for (const skill of skills.data) {
console.log(`${skill.name}: ${skill.description}`);
}
// Auto-pagination
for await (const skill of client.beta.skills.list({ betas: ['skills-2025-10-02'] })) {
console.log(skill.id);
}client.beta.skills.delete(
skillID: string,
params?: SkillDeleteParams
): APIPromise<SkillDeleteResponse>;
interface SkillDeleteParams {
betas: ['skills-2025-10-02'];
}Example:
const deleted = await client.beta.skills.delete('skill_abc123', {
betas: ['skills-2025-10-02'],
});
console.log('Deleted:', deleted.deleted); // trueSkills support versioning for controlled updates:
client.beta.skills.versions.create(
skillID: string,
params: VersionCreateParams
): APIPromise<VersionCreateResponse>;
interface VersionCreateParams {
version: string;
definition: any;
betas: ['skills-2025-10-02'];
}Example:
// Create new version
const version = await client.beta.skills.versions.create('skill_abc123', {
version: '2.0.0',
definition: {
// Updated skill definition
type: 'analysis',
capabilities: ['statistics', 'visualization', 'trend_detection', 'forecasting'],
},
betas: ['skills-2025-10-02'],
});
console.log('Version created:', version.version);client.beta.skills.versions.retrieve(
skillID: string,
versionID: string,
params?: VersionRetrieveParams
): APIPromise<VersionRetrieveResponse>;Example:
const version = await client.beta.skills.versions.retrieve(
'skill_abc123',
'2.0.0',
{ betas: ['skills-2025-10-02'] }
);
console.log('Version:', version.version);
console.log('Definition:', version.definition);client.beta.skills.versions.list(
skillID: string,
params?: VersionListParams
): VersionListResponsesPageCursor;Example:
const versions = await client.beta.skills.versions.list('skill_abc123', {
betas: ['skills-2025-10-02'],
});
for (const version of versions.data) {
console.log(`Version ${version.version} - ${version.created_at}`);
}client.beta.skills.versions.delete(
skillID: string,
versionID: string,
params?: VersionDeleteParams
): APIPromise<VersionDeleteResponse>;Example:
await client.beta.skills.versions.delete(
'skill_abc123',
'1.0.0',
{ betas: ['skills-2025-10-02'] }
);import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
// 1. Create skill
const skill = await client.beta.skills.create({
name: 'sentiment_analyzer',
description: 'Analyze sentiment in text',
definition: {
type: 'text_analysis',
models: ['sentiment'],
},
betas: ['skills-2025-10-02'],
});
// 2. Use skill
const message = await client.beta.messages.create({
model: 'claude-sonnet-4-5-20250929',
max_tokens: 1024,
betas: ['skills-2025-10-02'],
skills: [
{
type: 'skill',
skill_id: skill.id,
},
],
messages: [
{
role: 'user',
content: 'Analyze the sentiment of this review: "This product is amazing!"',
},
],
});
console.log('Analysis:', message.content[0].text);
// 3. Create new version
const version = await client.beta.skills.versions.create(skill.id, {
version: '1.1.0',
definition: {
type: 'text_analysis',
models: ['sentiment', 'emotion'], // Added emotion detection
},
betas: ['skills-2025-10-02'],
});
// 4. Use specific version
const message2 = await client.beta.messages.create({
model: 'claude-sonnet-4-5-20250929',
max_tokens: 1024,
betas: ['skills-2025-10-02'],
skills: [
{
type: 'skill',
skill_id: skill.id,
version: '1.1.0', // Specific version
},
],
messages: [
{
role: 'user',
content: 'Analyze sentiment and emotions.',
},
],
});
// 5. Cleanup (optional)
// await client.beta.skills.delete(skill.id, { betas: ['skills-2025-10-02'] });// ✅ Good: Descriptive names and organization
const skills = {
dataAnalysis: await client.beta.skills.create({
name: 'data_analysis',
description: 'Statistical analysis and visualization',
definition: { /* ... */ },
betas: ['skills-2025-10-02'],
}),
textSummarization: await client.beta.skills.create({
name: 'text_summarization',
description: 'Extract key points from documents',
definition: { /* ... */ },
betas: ['skills-2025-10-02'],
}),
};// ✅ Good: Semantic versioning
await client.beta.skills.versions.create(skillId, {
version: '2.1.0', // major.minor.patch
definition: { /* ... */ },
betas: ['skills-2025-10-02'],
});
// ❌ Bad: Unclear versioning
await client.beta.skills.versions.create(skillId, {
version: 'v2',
definition: { /* ... */ },
betas: ['skills-2025-10-02'],
});try {
const skill = await client.beta.skills.create({ /* ... */ });
} catch (error) {
if (error instanceof Anthropic.BadRequestError) {
console.error('Invalid skill definition');
} else if (error instanceof Anthropic.ConflictError) {
console.error('Skill with this name already exists');
}
throw error;
}