---
title: "One skill's title + rendered guide, for the run-timeline peek"
method: GET
path: "/v1/skill-catalog/{slug}"
tags: ["skill-hub"]
---

# One skill's title + rendered guide, for the run-timeline peek

`GET /v1/skill-catalog/{slug}`

## 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/skill-catalog/{slug}`
- Auth: HTTP bearer

Resolves a slug to a skill this caller may read: the audience-visible global catalog first, else a hidden global this workspace has installed and the runtime would actually load, else the workspace's own skill (fenced by the same occupancy rule every installation-id route uses). A slug the platform owns falls through to a same-slug tenant skill UNLESS this workspace has an installed, active, non-killed install of that global row — the same shadow rule the runtime resolves a run's skills by — in which case the GLOBAL is served instead of a 404, on the version the runtime actually runs. Every refusal — unknown, a dark global this workspace never installed shadowing an installed tenant skill's slug, an installed global the runtime would not admit (wrong archetype/provenance, archived, paused, or killed), another member's personal skill, or another tenant's — answers with the same 404, so the response never discloses which one it was.

## Path parameters

- `slug` string, required

## Headers

- `X-Tenant-Id` string, nullable

## Response `200`

Successful Response

- CatalogSkillDetail: One skill's title + rendered guide — the run timeline's "See skill" peek drawer. Resolved by slug GLOBAL-first (``GET /skill-catalog/{slug}``): an audience-visible global catalog skill first, else a hidden global this workspace has installed and the runtime would actually load, else the workspace's own skill (through the same occupancy fence every installation-id route uses). Global-first matches the runtime's own tie-break — ``_drop_shadowed_tenant_skills`` (``services.skill_platform.availability``) drops a tenant entry whose slug a platform-owned entry IN THE RUNTIME'S EFFECTIVE SET already holds (installed-and-active, or released-by-default), trusted wins the tie — so the drawer never shows tenant-authored content under a slug the platform actually shadows with, and describes the definition the run actually loaded, on the version the run actually used. A platform-owned row this workspace has NOT installed and that is not offered by default never shadows a same-slug tenant skill: the runtime never loaded it either, so refusing here would 404 a skill the run actually ran. Every refusal — unknown slug, an installed global the runtime would not admit (wrong archetype/provenance, archived, paused, or killed), another member's personal skill, an author's own uninstalled skill, or another tenant's — answers with the same 404, so the response never discloses which one it was. Display + guidance text only, never a personal fact (G4).
  - `slug` string, required
  - `title` string, required
  - `description` string, nullable
  - `listing_state` 'unlisted' | 'testing' | 'listed': Who can discover and install a global skill.
  - `body` string, nullable
  - `is_workspace_skill` boolean, required
  - `current_version_rating` SkillRatingSummary: A rating rate and the evidence count that gives the rate meaning.
    - `rated_count` integer, required
    - `rate` number, required
    - `ranking_score` number, nullable
  - `rating` SkillRatingSummary: A rating rate and the evidence count that gives the rate meaning.
    - `rated_count` integer, required
    - `rate` number, required
    - `ranking_score` number, nullable
  - `rating_history` SkillVersionRatingSummary[]
    - `manifest_version_id` string, uuid, required
    - `semver` string, required
    - `rating` SkillRatingSummary: A rating rate and the evidence count that gives the rate meaning.
      - `rated_count` integer, required
      - `rate` number, required
      - `ranking_score` number, nullable
  - `own_rating` OwnSkillRatingSummary: The calling actor's latest answered rating for this skill.
    - `id` string, uuid, required
    - `verdict` 'up' | 'down', required
    - `comment` string, nullable

## 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)
- `404`: Not found
- `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)
