---
title: "Update a project"
method: PATCH
path: "/api/v1/projects/{projectId}"
tags: ["Projects"]
---

# Update a project

`PATCH /api/v1/projects/{projectId}`

## Request

- Base URL: `https://app.khotan.com`
- URL: `https://app.khotan.com/api/v1/projects/{projectId}`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`

Updates a project's Khotan-owned attributes. An omitted field, including `tags`, stays unchanged; a sent `tags` list replaces the stored list. The slug is immutable, and execution state is never writable here — the tracker owns it.

## Path parameters

- `projectId` string, required

## Request body

- object
  - `name` string
  - `description` string, nullable
  - `lifecycle` 'active' | 'archived'
  - `tags` string[]: Full tag list; it replaces the stored list. Each tag is trimmed, lowercased, and has whitespace runs replaced with "-", and repeats are removed. After that, each tag is 1-32 lowercase letters, digits, or single hyphens, with at most 10 tags. Presets: test, live, uat, dev, demo, deprecated.

## Response `200`

The updated project.

- object
  - `id` string, required
  - `slug` string, required
  - `name` string, required
  - `description` string, nullable, required
  - `lifecycle` string, required
  - `linearProjectId` string, nullable, required
  - `latestSpecRevision` number, required
  - `memberCount` number, required
  - `tags` string[], required
  - `createdAt` string, required
  - `updatedAt` string, required

## Other responses

- `401`: Authentication is missing or invalid.
- `403`: The caller is not permitted to perform this action.
- `404`: The resource was not found.
- `422`: Response.
- `429`: Too many requests; retry after the indicated delay.

---

[API](https://skmtc.dev/khotan/apis/khotan-api.md) - [All operations](https://skmtc.dev/khotan/apis/khotan-api/llms.txt) - [OpenAPI document](https://skmtc.dev/khotan/apis/khotan-api/revisions/90b512a53e42?raw)
