---
title: "Creates an independent user-owned copy of a readable skill and its supporting content."
method: POST
path: "/agents/skills/{skillId}/duplicate"
tags: ["agentSkills"]
---

# Creates an independent user-owned copy of a readable skill and its supporting content.

`POST /agents/skills/{skillId}/duplicate`

## Request

- Base URL: `https://api.awork.com/api/v1`
- URL: `https://api.awork.com/api/v1/agents/skills/{skillId}/duplicate`
- Auth: HTTP bearer

<Check title="Required Permissions" icon="key">Any authenticated user.</Check>

## Path parameters

- `skillId` string, uuid, required

## Query parameters

- `agentId` string, uuid

## Request body

- DuplicateSkillRequestModel: Names an independent copy of a skill.
  - `key` string, nullable: The stable key for the copy.
  - `name` string, required: The display name for the copy.

## Response `200`

OK

- SkillResponseModel: Describes a reusable skill.
  - `id` string, uuid: The skill identifier.
  - `createdBy` string, uuid: The user who created the skill.
  - `createdOn` string, date-time: When the skill was created.
  - `updatedOn` string, date-time, nullable: When the skill was last updated.
  - `key` string, nullable: The stable key used to reference the skill.
  - `name` string, nullable: The name shown in the skill library.
  - `description` string, nullable: A short explanation of what the skill does.
  - `instructions` string, nullable: The Markdown instruction body from `SKILL.md`.
  - `instructionsSource` string, nullable: The source from which the instructions were created.
  - `type` 'user' | 'agent': The ownership type.
  - `userId` string, uuid, nullable: The owning user for a user-owned skill.
  - `agentId` string, uuid, nullable: The owning agent for an agent-owned skill.
  - `accessLevel` 'read' | 'manage': The requesting user's resolved access level.
  - `isOwner` boolean: Whether the requesting user owns the skill.
  - `hasAdminAccessOnly` boolean: Whether the skill is visible only through workspace administration access.
  - `workspaceAccessLevel` 'read' | 'manage': The workspace-wide access level.
  - `linkedAgentCount` integer: The number of linked agents.
  - `metadata` string, nullable: The skill frontmatter as a JSON object.
  - `hasFiles` boolean: Whether the skill includes bundled files.
  - `secretRequirements` SkillSecretRequirementResponseModel[], nullable: The secrets that the skill declares.
    - `id` string, uuid: The secret requirement identifier.
    - `envVarName` string, nullable: The environment variable name the secret is injected as.
    - `description` string, nullable: The description shown to users when providing the secret.
    - `scope` 'workspace' | 'user': Who must provide the secret value.
    - `isRequired` boolean: Whether the secret is required for the skill to work.
    - `hasValue` boolean: Whether a value is available for the requesting user.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

## Changes

- **2026-10-16** `81151fac7e79`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/awork-io/apis/api-v1-reference/changes/agents/skills/:skillId/duplicate/post.md)

---

[API](https://skmtc.dev/awork-io/apis/api-v1-reference.md) · [All operations](https://skmtc.dev/awork-io/apis/api-v1-reference/llms.txt) · [OpenAPI document](https://skmtc.dev/awork-io/apis/api-v1-reference/revisions/81151fac7e79?raw)
