---
title: "Preview the skill a pasted SKILL.md describes"
method: POST
path: "/v1/authored-skills/from-markdown"
tags: ["authored-skills"]
---

# Preview the skill a pasted SKILL.md describes

`POST /v1/authored-skills/from-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/from-markdown`
- Auth: HTTP bearer

Paste a SKILL.md and see what it would become before anything is saved: the slug, title and description Patricia read out of it, and whether this caller's import activates, needs approval, or is refused. Creates nothing. Edit the returned manifest and post it to /authored-skills/from-markdown/author, which re-validates and re-compiles it from scratch.

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- MarkdownImportRequest: Preview the skill a pasted ``SKILL.md`` describes. Saves nothing. ``name`` is asked for rather than guessed. A paste is the one source with no container, and the folder path is where every other path takes the slug from — guessing it from the body's first heading would file the skill under whatever the author called their document, and the slug is the one derived field a person cannot correct afterwards without re-importing.
  - `name` string, required: What to call the skill. Its slug is derived from this.
  - `skill_md` string, required: The pasted SKILL.md, frontmatter and all.

## Response `200`

Successful Response

- ImportedSkillPreview: What an import WOULD create, shown before anything is saved. Every field here is derived, and the point of returning them is that a person sees what Patricia read out of their file before it becomes a skill. The client may edit the ``manifest`` and post that back; the author step re-validates and re-compiles from scratch, so nothing here is trusted. ``import_outcome`` is a fact about the CALLER, not the file or repository. It says whether the import activates, needs approval, or is refused without saving anything.
  - `valid` boolean, required
  - `errors` string[]
  - `slug` string, nullable
  - `title` string, nullable
  - `description` string, nullable
  - `delivery_mode` string, nullable
  - `manifest` object, nullable
  - `skill_md` string, nullable
  - `semver_is_derived` boolean, required: Whether Patricia derived the version. False means the source owns the version and the import details must stay unchanged.
  - `import_outcome` 'activates' | 'needs_approval' | 'refused', required: The result that an imported skill will have for the current caller.

## 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)
