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

# Create a Skill

`POST /context/skills`

## Request

- Base URL: `https://api.adcrunch.dev`
- URL: `https://api.adcrunch.dev/context/skills`
- Auth: HTTP bearer

Creates a Skill in your organization. The body is the playbook itself, and the description is what an agent reads to choose it. AdCrunch makes the slug from the name. To set a different slug, send one. The answer is `409` if the slug already exists in your organization.

## Request body

- object
  - `body` string, required: The playbook instructions (markdown).
  - `description` string, required: When to use this Skill — what agents read to discover it.
  - `name` string, required: Display name.
  - `slug` string: Optional explicit slug handle; normalized to kebab-case. Defaults to one derived from the name.

## Response `201`

The Skill as created, at `revision` 1. Send that revision back as `base_revision` on your first edit.

- object
  - `body` string, required: The agent instructions themselves — the `SKILL.md`-equivalent, in markdown.
  - `createdAt` number, required: Milliseconds since the Unix epoch, UTC.
  - `createdBy` string, required
  - `description` string, required
  - `id` string, required
  - `name` string, required
  - `revision` number, required: Increments on every write. Send it back as `base_revision` to edit; a stale one answers 409.
  - `slug` string, required
  - `source` object, nullable, required: The Catalog Skill and the version that this Skill was imported from. It is `null` for a Skill that your organization wrote. An edit keeps it.
    - `slug` string, required: The slug of the Catalog Skill that the Skill was imported from.
    - `version` string, required: The version of the Catalog Skill that the Skill was last imported from, `YYYY-MM-DD`.
  - `updatedAt` number, nullable, required: Milliseconds since the Unix epoch, UTC.

## Other responses

- `400`: The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. `error` is `invalid_request`, and `issues` names each field. Nothing was changed.
- `401`: No API key, or one that does not resolve. See the security scheme. `error` is `unauthorized`.
- `402`: The organization has no active subscription. An owner subscribes at `paywallUrl`. `error` is `organization_unentitled`.
- `403`: The caller does not hold `skill:write`. `error` is `forbidden`.
- `409`: Another Skill in this organization already holds that slug. `error` is `slug_conflict`.
- `422`: The name and slug together contain no letter or digit, so no handle can be derived. `error` is `invalid_slug`. A body that fails the schema answers with the framework shape instead.

---

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