---
title: "Upload a skill"
method: POST
path: "/skills/upload"
tags: ["Skills"]
---

# Upload a skill

`POST /skills/upload`

## Request

- Base URL: `https://api.crevio.co/v1`
- URL: `https://api.crevio.co/v1/skills/upload`
- Auth: API key in header `Authorization`

Creates a private skill from an upload and installs it for your account. Send one `file` (a `.zip` bundle or a lone `SKILL.md`), or a folder as repeated `files` with `paths` in the same order to preserve subdirectories. As JSON, send the manifest's text as `skill_md`, and any other files as `resources`. The skill is stored exactly as sent. Private skills are visible to your account only; they never enter the public catalog.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `skill_md` string, required: The full SKILL.md text, frontmatter included, exactly as the skill's author wrote it.
  - `resources` object: Other files of the skill as text, keyed by path relative to the skill's folder (e.g. `references/checklist.md`).

## Response `201`

The skill, installed for your account

- AiSkill
  - `object` string, required
  - `id` string, required
  - `slug` string, required
  - `name` string, required
  - `description` string, nullable, required
  - `category` string, nullable, required
  - `tags` string[], nullable, required
  - `version` string, required
  - `creator_name` string, nullable, required
  - `creator_avatar_url` string, nullable, required
  - `install_count` integer, required
  - `status` 'draft' | 'published' | 'archived', required
  - `visibility` 'public' | 'private', required: `private` is a skill this account uploaded: only this account sees it, and it is not in the public catalog.
  - `install_status` string, nullable, required
  - `installed_version` string, nullable, required: The version this account installed. Null unless installed.
  - `update_available` boolean, required: True when the catalog `version` is newer than `installed_version`: POST /skills/{slug}/update installs it.
  - `external_source` string, nullable, required
  - `external_url` string, nullable, required
  - `created_at` string, date-time, required

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `422`: Validation error
- `429`: Rate limit exceeded — 600 requests per minute per credential. Retry after the number of seconds in `Retry-After`.
- `500`: Internal server error

---

[API](https://skmtc.dev/crevio/apis/crevio-api-v1.md) · [All operations](https://skmtc.dev/crevio/apis/crevio-api-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/crevio/apis/crevio-api-v1/revisions/2219f18ad651?raw)
