---
title: "Move a project to another workspace"
method: PUT
path: "/project/{id}/move"
tags: ["Projects"]
---

# Move a project to another workspace

`PUT /project/{id}/move`

## Request

- Base URL: `https://cloud.kaneo.app/api`
- URL: `https://cloud.kaneo.app/api/project/{id}/move`
- Auth: HTTP bearer

Move a project and its tasks. Requires update and delete permission in the source, plus project creation and workspace settings management permission in the destination. Remove cross-project task relationships before moving.

## Path parameters

- `id` string, required

## Request body

- object
  - `workspaceId` string, required

## Response `200`

Project moved

- MovedProject
  - `id` string, required
  - `workspaceId` string, required
  - `backgroundVersion` string, nullable, required
  - `slug` string, required: Short prefix used in task identifiers, e.g. KAN-12.
  - `icon` string, nullable, required
  - `name` string, required
  - `description` string, nullable, required
  - `createdAt` string, date-time, required
  - `isPublic` boolean, nullable, required: When true the project's board is readable without signing in, via /api/public-project/{id}.
  - `archivedAt` string, date-time, nullable, required: Non-null once archived; archived projects are hidden by default.
  - `position` number, required: Sidebar order, ascending.
  - `lastTaskNumber` number, required: Highest task number issued in this project; the next task gets this plus one.
  - `unassignedTaskCount` number, required

## Other responses

- `400`: Invalid destination or same workspace
- `401`: Unauthorized
- `402`: Destination workspace plan has expired
- `403`: No access to the project, or missing permission in the source or destination workspace
- `404`: Project or destination workspace not found
- `409`: Project key conflict or cross-project task relationships
- `429`: The API key exceeded its rate limit or usage quota. Wait the number of seconds in Retry-After before retrying. The X-RateLimit headers are sent only when the rate limit was hit.

## Changes

- **2026-10-08** `c7b8a842601b`: 7 breaking, 7 info
  - removed the media type `text/plain` for the response with the status `400`
  - removed the media type `text/plain` for the response with the status `401`
  - removed the media type `text/plain` for the response with the status `402`
  - removed the media type `text/plain` for the response with the status `403`
  - …10 more
- **2026-10-08** `2ed51b8af657`: 6 breaking, 7 info
  - removed the media type `application/json` for the response with the status `400`
  - removed the media type `application/json` for the response with the status `401`
  - removed the media type `application/json` for the response with the status `402`
  - removed the media type `application/json` for the response with the status `403`
  - …9 more
- **2026-10-07** `df1439c724ee`: 6 breaking, 6 info
  - removed the media type `text/plain` for the response with the status `400`
  - removed the media type `text/plain` for the response with the status `401`
  - removed the media type `text/plain` for the response with the status `402`
  - removed the media type `text/plain` for the response with the status `403`
  - …8 more
- **2026-09-26** `8972fa938891`: 1 info
  - added the required property `allOf[#/components/schemas/Project]/backgroundVersion` to the response with the `200` status
- **2026-09-25** `a77bca29d917`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/usekaneo/apis/kaneo-api/changes/project/:id/move/put.md)

---

[API](https://skmtc.dev/usekaneo/apis/kaneo-api.md) - [All operations](https://skmtc.dev/usekaneo/apis/kaneo-api/llms.txt) - [OpenAPI document](https://skmtc.dev/usekaneo/apis/kaneo-api/revisions/93f78789100c?raw)
