---
title: "Author an instruction skill from a pasted SKILL.md (default editor)"
method: POST
path: "/v1/authored-skills/instructions/markdown"
tags: ["authored-skills"]
---

# Author an instruction skill from a pasted SKILL.md (default editor)

`POST /v1/authored-skills/instructions/markdown`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/authored-skills/instructions/markdown`
- Auth: HTTP bearer

Create or update an instruction skill from a single pasted (or imported) SKILL.md: optional YAML front matter (name, description) then plain-markdown instructions. Parsed server-side into the SAME 'instructions' archetype as the typed path. An owner or admin author's version is ready to enable immediately; a version authored without that authority needs an owner or admin's approval first. The version is managed automatically. The raw markdown is preserved verbatim for later editing.

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- MarkdownInstructionSkillBody: The DEFAULT "Build a skill" form: a single pasted (or imported) SKILL.md document. The teammate pastes standard SKILL.md markdown: an optional YAML front-matter block (``name`` + ``description``) then plain-markdown instructions. The server parses it (front matter → name/description, a leading ``# H1`` as the name fallback, the rest as the instruction body) and authors the SAME ``instructions`` archetype as the typed path, with no separate name/instructions fields. The raw markdown is preserved verbatim so re-editing shows the author their own document. ``recommended_integrations`` are optional app slugs a teammate enabling the skill is nudged to connect if missing. The parsed name is bounded to the same ``MAX_INSTRUCTIONS_TITLE_CHARS`` characters the typed form's ``title`` field allows (mirrors the ``skill_catalog.title`` column). A longer one is refused with a friendly validation error, the same way a missing name already is, so it never reaches the database.
  - `markdown` string, required: The skill's SKILL.md: optional `---` front matter (name, description) then markdown instructions.
  - `recommended_integrations` string[]: App slugs from the integrations catalog to recommend connecting for this skill.
  - `skill_id` string, uuid, nullable: When editing an existing instruction skill, its id. An edit targets this skill and keeps its identity even if the name changed. Omit when creating a new skill.

## Response `201`

Successful Response

- AuthorResponse: The outcome of authoring a version (manual / ZIP / a chosen GitHub candidate).
  - `skill_id` string, uuid, required
  - `manifest_version_id` string, uuid, required
  - `slug` string, required
  - `semver` string, required
  - `title` string, required
  - `status_code` string, required
  - `created` boolean, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `409`: Conflict
- `422`: Validation error

---

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