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

# Create a skill

`POST /skills`

## Request

- Base URL: `https://api.parley.so/v1`
- URL: `https://api.parley.so/v1/skills`
- Auth: HTTP bearer

Create a skill from its SKILL.md (content) or from an upload of the whole skill with its bundled documents (uploadId). A new skill is on as soon as it's created. Returns 409 SLUG_TAKEN if the slug belongs to another skill, including one you can't see, and 400 RESERVED_SLUG for a built-in skill's slug. Returns 400 INVALID_REFERENCE when uploadId isn't an upload or nothing was uploaded to it, and 400 INVALID_SKILL when the SKILL.md or archive can't be read.

## Request body

- object
  - `slug` string, required: The new skill's slug: lowercase letters, numbers, and hyphens, up to 64 characters, such as intake-checklist. It can't be changed later.
  - `content` string: The skill's SKILL.md: YAML frontmatter with a name (up to 120 characters) and a description (up to 2,000), then the instructions in markdown, 100,000 characters in all. For an auto skill, the description is what the assistant matches tasks against, so say when to use it. Refer to a bundled document by its path, such as references/engagement-letter.docx.
  - `uploadId` string: The id of an upload, once its bytes have been PUT to its url, holding the whole skill, its SKILL.md and every bundled document: a .skill or .zip archive with SKILL.md at its root or inside one top-level folder, plus any documents under references/ (pdf, doc, docx, md, txt, json, csv, html, pptx, xls, xlsx; up to 100 files and 25 MB), or a single .md file used as SKILL.md. A manifest.yaml in the archive is ignored.
  - `scope` 'organization' | 'personal': Who can use the skill. personal (default): only you. organization: everyone in the organization; needs an owner or admin. It can't be changed later.
  - `activation` 'auto' | 'on-demand': When the skill is used. auto (default): Parley's assistant uses it whenever its description fits the task. on-demand: only when someone runs it, from a project's Run Skill list or by typing /<slug> in a message.
  - `enabled` boolean: Whether the skill is on. Defaults to true.

## Response `201`

Created.

- Skill
  - `id` string, required: The skill ID.
  - `slug` string, required: The skill's folder name, chosen when the skill is created. It is how the skill is addressed, and the name the assistant loads it by.
  - `name` string, required: The skill name, from its SKILL.md.
  - `description` string, required: What the skill is for, from its SKILL.md.
  - `scope` 'organization' | 'personal', required: Who can use the skill. organization: everyone in the organization. personal: only the person who created it.
  - `activation` 'auto' | 'on-demand', required: When the skill is used. auto: Parley's assistant uses it whenever its description fits the task. on-demand: only when someone runs it, from a project's Run Skill list or by typing /<slug> in a message.
  - `enabled` boolean, required: Whether the skill is on. Parley never uses a skill that is off.
  - `createdAt` string, date-time, required: When the skill was created.
  - `updatedAt` string, date-time, required: When the skill was last changed.

## Other responses

- `400`: The request was invalid. VALIDATION_FAILED, INVALID_REFERENCE, INVALID_SKILL, RESERVED_SLUG.
- `401`: Missing or invalid credentials. UNAUTHORIZED.
- `403`: You don't have permission. FORBIDDEN.
- `409`: The request conflicts with the current state. SLUG_TAKEN.
- `429`: Too many requests, or a usage limit was reached. TOO_MANY_REQUESTS.

---

[API](https://skmtc.dev/parley/apis/parley-api.md) - [All operations](https://skmtc.dev/parley/apis/parley-api/llms.txt) - [OpenAPI document](https://skmtc.dev/parley/apis/parley-api/revisions/6b78aeee07bc?raw)
