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

# Create a skill

`POST /skills`

## Request

- Base URL: `https://commareports.com/api/v1`
- URL: `https://commareports.com/api/v1/skills`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Three source paths: JSON with an inline `prompt`; JSON with `source_kind: "github"` and `source_ref: "owner/repo[@sha-or-branch][:path/to/SKILL.md]"` (public repos; the ref is pinned to a commit SHA); or `multipart/form-data` with a `file` field holding a .zip bundle (< 1 MB) that contains a SKILL.md. Also accepts a Supabase user-session JWT. Scope: `routines`.

## Request body

- union
  - SkillCreateInline
    - `name` string, required
    - `description` string, nullable
    - `prompt` string, required
    - `required_tools` RequiredTool[]
      - `kind` string, required
    - `source_kind` 'inline'
    - `source_ref` string, nullable
    - `model` string
  - SkillCreateGithub
    - `source_kind` 'github', required
    - `source_ref` string, required: 'owner/repo[@sha-or-branch][:path/to/SKILL.md]' — public repos; resolved and pinned to a commit SHA.
    - `name` string: Override the name parsed from SKILL.md frontmatter.
    - `description` string, nullable

## Response `201`

Skill created.

- Skill
  - `id` string, uuid, required
  - `name` string, required
  - `description` string, nullable
  - `prompt` string, required
  - `required_tools` RequiredTool[]
    - `kind` string, required
  - `source_kind` 'inline' | 'upload' | 'github', required
  - `source_ref` string, nullable: Storage path (upload) or pinned 'owner/repo@sha:path' (github).
  - `model` string, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `400`: Malformed body or invalid field.
- `401`: Missing, invalid, revoked, or expired token.
- `403`: Token missing the required scope, or no access to the resource.
- `429`: Rate limit exceeded. Rate limit: per-token sliding window (plan-aware — Free 60 req/min, Pro 600, Team/Enterprise 6000 by default); 429 responses carry a Retry-After header.
- `500`: Unexpected server error.

---

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