---
title: "✨ Move a saved interface to another workspace"
method: POST
path: "/api/interfaces/{id}/move/"
tags: ["Interfaces"]
---

# ✨ Move a saved interface to another workspace

`POST /api/interfaces/{id}/move/`

## Request

- Base URL: `http://localhost:8000`
- URL: `http://localhost:8000/api/interfaces/{id}/move/`
- Auth: API key in header `Authorization`

<Card href="https://humansignal.com/goenterprise">
        <img style="pointer-events: none; margin-left: 0px; margin-right: 0px;" src="https://docs.humansignal.com/images/badge.svg" alt="Label Studio Enterprise badge"/>
        <p style="margin-top: 10px; font-size: 14px;">
            This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
        </p>
    </Card>
Move a saved interface to a workspace, your Personal Sandbox, or Shared (`workspace: null`). A workspace-scoped interface can only be used by projects in its workspace, so connected projects move with it when needed. Send `dry_run: true` first to get the move plan, then confirm with `dry_run: false` and the `expected_project_ids` from that plan. The response is the plan in every case; a blocked move or a changed plan returns 409 with the fresh plan.

## Path parameters

- `id` integer, required

## Request body

- LseInterfaceMoveRequestRequest
  - `dry_run` boolean: Return the move plan without changing anything.
  - `expected_project_ids` integer[]: Required when dry_run is false: IDs of the projects in workspace groups with outcome "move" from the dry run you confirmed. If the server computes a different set, it responds with 409 "interface_move_plan_changed" and the fresh plan.
  - `workspace` integer, nullable, required: Target workspace ID, or null to make the interface Shared.

## Response `200`

- LseInterfaceMovePlan: Move plan returned by dry runs, executed moves and move-related 409 responses. Inaccessible connected projects only ever appear as ``inaccessible_projects_count``.
  - `allowed` boolean, required
  - `blockers` InterfaceMoveBlockerEnum[], required
  - `cannot_move_projects_count` integer, required
  - `code` 'interface_move_blocked' | 'interface_move_plan_changed' | 'interface_move_requires_confirmation': * `interface_move_blocked` - Interface move blocked * `interface_move_plan_changed` - Interface move plan changed * `interface_move_requires_confirmation` - Interface move requires confirmation
  - `connected_projects_count` integer, required: All connected projects, inaccessible ones included.
  - `detail` string: Present on 409 responses.
  - `inaccessible_projects_count` integer, required
  - `moving_projects_count` integer, required
  - `notices` InterfaceMoveNoticeEnum[], required
  - `published_projects_count` integer, required
  - `target` LseInterfaceMoveWorkspace, required
    - `color` string, nullable, required
    - `id` integer, required
    - `is_personal` boolean, required
    - `title` string, required
  - `workspaces` LseInterfaceMoveWorkspaceGroup[], required: Accessible connected projects grouped by workspace.
    - `outcome` 'move' | 'already_in_target' | 'stay' | 'cannot_move', required: * `move` - Move * `already_in_target` - Already in target * `stay` - Stay * `cannot_move` - Cannot move
    - `outside_interface_workspace` boolean, required: The projects sit in a different workspace from the interface's workspace.
    - `projects` LseInterfaceMoveProject[], required
      - `blocking_reasons` InterfaceMoveBlockingReasonEnum[], required: Why this project stops the move. Empty when it does not.
      - `id` integer, required
      - `is_published` boolean, required
      - `title` string, nullable, required
    - `published_projects_count` integer, required: Published projects in this workspace group that stop a move into a Personal Sandbox.
    - `workspace` LseInterfaceMoveWorkspace, required
      - `color` string, nullable, required
      - `id` integer, required
      - `is_personal` boolean, required
      - `title` string, required

## Changes

> 142 revisions in range; 1 not diffed.

- **2026-10-16** `04dae10dc373`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/humansignal/apis/label-studio-api/changes/api/interfaces/:id/move/post.md)

---

[API](https://skmtc.dev/humansignal/apis/label-studio-api.md) - [All operations](https://skmtc.dev/humansignal/apis/label-studio-api/llms.txt) - [OpenAPI document](https://skmtc.dev/humansignal/apis/label-studio-api/revisions/b3a81da7c74a?raw)
