---
title: "Update a skill"
method: PATCH
path: "/skills/{id}"
tags: ["Skills"]
---

# Update a skill

`PATCH /skills/{id}`

## Request

- Base URL: `https://app.gc.ai/api/external/v1`
- URL: `https://app.gc.ai/api/external/v1/skills/{id}`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/gc-ai/apis/gc-ai-external-api/docs/skills/:id/patch.ts> (a function with typed inputs; its response is checked against the schema)

Partially update a skill's name, instructions, description, attached files, or legal category.

Requires write access to the skill. Official skills cannot be edited via the API. Visibility is not editable here; manage skill sharing in the GC AI app.

## Path parameters

- `id` string, uuid, required: Skill ID from `GET /skills`.

## Request body

- UpdateSkillRequest
  - `name` string: Updated skill name (1-255 chars)
  - `content` string: Updated skill instructions (1-100000 chars)
  - `description` string, nullable: Updated description (max 1000 chars). Pass `null` or an empty string to clear it.
  - `file_ids` string[]: Replacement set of attached file IDs (max 50). When provided, the skill's attachments are reconciled to exactly this list. Omit to leave attachments unchanged.
  - `legal_category` 'commercial_contracts' | 'privacy_compliance' | 'employment' | 'procurement' | 'governance' | 'product_and_ip_counsel' | 'legal_operations' | 'real_estate_and_insurance' | 'litigation_and_disputes' | 'regulatory_and_compliance' | 'other' | 'null', nullable: Updated area of law to group the skill under. Pass `null` to clear it. Omit to leave it unchanged.

## Response `200`

The updated skill

- Skill
  - `id` string, uuid, required: Unique skill identifier
  - `name` string, required: Skill name
  - `description` string, nullable, required: Short description of what the skill does, or null if unset
  - `content` string, required: The skill instructions: the prompt text the model receives when the skill runs
  - `visibility` 'private' | 'organization', required: `private` (only the creator and users it has been explicitly shared with) or `organization` (visible to everyone in the org). Official skills report `organization`.
  - `is_official` boolean, required: Whether this is an official GC AI skill. Official skills are read-only and cannot be edited or deleted via the API.
  - `files` SkillFile[], required: Files attached to the skill as reference context
    - `id` string, uuid, required: Attached file identifier
    - `name` string, required: Attached file name
  - `legal_category` 'commercial_contracts' | 'privacy_compliance' | 'employment' | 'procurement' | 'governance' | 'product_and_ip_counsel' | 'legal_operations' | 'real_estate_and_insurance' | 'litigation_and_disputes' | 'regulatory_and_compliance' | 'other' | 'null', nullable, required: The area of law the skill is grouped under, or null when it is uncategorized
  - `created_at` string, nullable, required: ISO 8601 creation timestamp
  - `updated_at` string, nullable, required: ISO 8601 last-updated timestamp

## Other responses

- `400`: Invalid request body or skill ID
- `401`: Missing or malformed API key
- `403`: Caller has read-only access to the skill
- `404`: Skill not found or not accessible to the caller
- `422`: One or more `file_ids` were not found in the organization, or `legal_category` was sent while Legal Categories are not available yet
- `429`: Rate limit exceeded. See [Rate Limits](https://docs.gc.ai/api-reference/concepts/rate-limits) for the tiers, limits, and how to back off.
- `500`: Internal server error
- `503`: Service temporarily unavailable

---

[API](https://skmtc.dev/gc-ai/apis/gc-ai-external-api.md) - [All operations](https://skmtc.dev/gc-ai/apis/gc-ai-external-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gc-ai/apis/gc-ai-external-api/revisions/2bbdfddf7107?raw)
