---
title: "Partial update skill"
method: PATCH
path: "/v1/skills/{id}"
tags: ["skills", "skills"]
---

# Partial update skill

`PATCH /v1/skills/{id}`

## 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/skills/{id}`
- Auth: HTTP bearer

Partial update (PATCH) of a skill.

## Path parameters

- `id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- ModelsBrainSkillMergeValidator: PATCH body: every field optional; only those set are written. ``created_by`` is declared but never written: it is in ``readonly_fields``, so the repository accepts and DISCARDS it, exactly as PUT does. That was the hole this branch closed: PATCH used to write every field it was given, which let a tenant rewrite an existing skill's provenance to ``patricia`` after the fact. The fix belongs in the repository, not here. Forbidding the field instead would 422 every client that round-trips a GET body back, and read-modify-write is at least as common on PATCH as on PUT.
  - `name` string, nullable
  - `description` string, nullable
  - `content` string, nullable
  - `category` string, nullable
  - `version` integer, nullable
  - `status_code` 'proposed' | 'active' | 'retired'
  - `eval_score` number, nullable
  - `created_by` string, nullable
  - `updated_at` string, date-time, nullable

## Response `200`

The updated skill.

- ModelsBrainSkillFullValidator: Response shape for GET / POST / PUT / PATCH.
  - `id` string, uuid, required
  - `tenant_id` string, uuid, nullable
  - `name` string, required
  - `description` string, nullable
  - `content` string, required
  - `category` string, nullable
  - `version` integer, required
  - `status_code` 'proposed' | 'active' | 'retired', required
  - `eval_score` number, nullable
  - `created_by` string, required
  - `hit_count` integer, required
  - `last_used_at` string, date-time, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, 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)
- `404`: Not found
- `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)
