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

# Update project

`PATCH /projects/{projectId}`

## Request

- Base URL: `https://studio.weaverse.io/api/v1/content`
- URL: `https://studio.weaverse.io/api/v1/content/projects/{projectId}`
- Auth: HTTP bearer

Renames a project. This endpoint does not create, delete or reconfigure projects.

- Only `name` is writable: a non-empty string of at most 191 characters.
- Unknown fields are rejected with `400 INVALID_PARAMS` rather than silently ignored.
- Send `expectedUpdatedAt` (the `revision` from GET) to fence the rename: if the project changed since that read, the call returns `409 STALE_PROJECT` instead of overwriting a newer name. Shop API keys may omit it; delegated (MCP OAuth) tokens must send it or get `428 PRECONDITION_REQUIRED`.
- Hierarchy, shop linkage and market settings belong to Studio and the Dashboard and are not writable with an API key.
- No cache invalidation happens: `name` does not affect rendered storefront content.
- Clients or proxies that cannot send `PATCH` may send `POST` to the same URL with the same body.

Required scope: `content:write`

## Path parameters

- `projectId` string, required

## Request body

- object
  - `name` string, required: New project name.
  - `expectedUpdatedAt` string, date-time: The project `revision` from your last GET, sent back unchanged. When it no longer matches, the rename is refused with `409 STALE_PROJECT`. Optional for shop API keys; required for delegated (MCP OAuth) tokens, which get `428 PRECONDITION_REQUIRED` without it.

## Response `200`

The updated project

- object
  - `object` 'project'
  - `id` string
  - `name` string, nullable
  - `parentProjectId` string, nullable
  - `createdAt` string, date-time, nullable
  - `revision` string, date-time, nullable: The project's revision (its `updatedAt`). Send it back as `expectedUpdatedAt` on project-fenced writes such as a rename.

## Other responses

- `400`: Invalid body (missing/empty `name`, unknown fields, or invalid JSON)
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Project not found
- `405`: Method not allowed (use PATCH or POST)
- `409`: STALE_PROJECT: the project changed after `expectedUpdatedAt` was read. Re-read the project and retry with its current `revision`.
- `428`: PRECONDITION_REQUIRED: a delegated (MCP OAuth) token omitted `expectedUpdatedAt`.

---

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