Skip to main content

Move Project

POST 

/projects/:project_id/move

Move a project — and its entire dependent entity graph — to another workspace.

A move is metadata-only (object storage carries no workspace component), so every dependent row's workspace_id is restamped in one transaction; see services.project_move.reparent_project. Workspace-level SUTs the project's runs reference are copied or reused in the target rather than moved — see the 2026-07-22 ADR (docs/adr/2026-07-22_sut-follow-or-hash-dedup-copy-on-project-move.md).

A move also clears any test-plan pin and both locks, since plans are workspace-scoped (services.project_move), recording a released_on_move row alongside the ProjectMoveEvent.

Requires workspace_admin/workspace_editor on the source workspace (via the path-resolved RBAC dependency above) and the target workspace (checked explicitly below, since it comes from the request body) — with a platform admin bypassing both checks. Rejected: a target that doesn't exist, a personal-workspace target (no demotion), a name collision in the target, or any run still pending/claimed/running for this project.

Request​

Responses​

Successful Response