---
title: "Upload a copilot skill from a SKILL.md file"
method: POST
path: "/api/skills"
tags: ["v1", "skills"]
---

# Upload a copilot skill from a SKILL.md file

`POST /api/skills`

Create a user-distilled skill from an uploaded ``SKILL.md`` file.

Parses the canonical frontmatter + body, then reuses
:func:`backend.copilot.tools.skills.store_user_skill` so an uploaded skill
is validated, capped, and persisted exactly like one the copilot distils
via ``store_skill``.  Malformed files return 400, the per-user cap returns
409, and an existing slug is overwritten (upsert).

## Request body

- UploadCopilotSkillRequest — Body for the library UI's "upload skill" action. Carries the raw ``SKILL.md`` text (YAML frontmatter + markdown body) the user picked from disk; the server parses + validates it so the upload and the copilot's ``store_skill`` tool share one source of truth.
  - `content` string, required

## Response `201`

Successful Response

- CopilotSkillInfo — User-distilled copilot skill metadata for the library UI. Defaults (built-in agent-building / MCP-tool guides) are intentionally excluded — they cannot be edited or deleted, so surfacing them in the user-facing list would add noise without affordances.
  - `name` string, required
  - `description` string, required
  - `triggers` string[]

## Other responses

- `400` — Malformed SKILL.md or validation error
- `401` — Authentication required
- `409` — Per-user skill limit reached
- `422` — Validation Error

---

[API](https://skmtc.net/significant-gravitas/apis/autogpt-agent-server.md) · [All operations](https://skmtc.net/significant-gravitas/apis/autogpt-agent-server/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/significant-gravitas/autogpt-agent-server/versions/382041c7ecb2/schema)
