> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orgo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Move computer

> Move a computer to a different workspace while preserving its state and ID.

Moves a computer to a different workspace. The computer keeps its state, configuration, and IDs. Only its parent workspace changes.

You must own both the source and the destination workspace. Being a member of either is not enough. A workspace-scoped API key can never move a computer, because a move always crosses a workspace boundary.

## Path parameters

<ParamField path="id" type="string" required>
  Computer UUID or `instance_id`. Both resolve to the same computer.
</ParamField>

## Body parameters

Send the destination workspace under `workspace_id`.

<ParamField body="workspace_id" type="string" required>
  ID of the destination workspace. Must be owned by the same user, and must differ from the computer’s current workspace.
</ParamField>

<Note>
  A request with no `workspace_id` returns `400`. The older name `project_id` is
  also accepted; `workspace_id` wins when you send both.
</Note>

## Response

<ResponseField name="success" type="boolean">
  `true` when the move succeeded.
</ResponseField>

<ResponseField name="workspace_id" type="string">
  The destination workspace ID, echoed back.
</ResponseField>

<ResponseField name="project_id" type="string">
  The same destination workspace ID under its legacy name, for older clients.
</ResponseField>

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X PATCH https://www.orgo.ai/api/computers/$COMPUTER_ID/move \
    -H "Authorization: Bearer $ORGO_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"workspace_id": "'"$WORKSPACE_ID"'"}'
  ```

  ```python Python theme={null}
  import requests

  response = requests.patch(
      f"https://www.orgo.ai/api/computers/{computer_id}/move",
      headers={
          "Authorization": f"Bearer {api_key}",
          "Content-Type": "application/json"
      },
      json={"workspace_id": target_workspace_id}
  )
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(`https://www.orgo.ai/api/computers/${computerId}/move`, {
    method: 'PATCH',
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ workspace_id: targetWorkspaceId })
  });

  console.log(await response.json());
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "success": true,
  "workspace_id": "550e8400-e29b-41d4-a716-446655440099",
  "project_id": "550e8400-e29b-41d4-a716-446655440099"
}
```

## Errors

| Status | Body | When |
| - | - | - |
| `400` | `{ "error": "workspace_id is required" }` | `workspace_id` is missing or empty. |
| `400` | `{ "error": "Already in this workspace" }` | The computer already belongs to the destination workspace. |
| `401` | `{ "error": "Invalid API key" }` | The Bearer token starts with `sk_` but is not a known Orgo key. |
| `401` | `{ "error": "Authentication required" }` | No `Authorization` header, or a Bearer token that is not an `sk_` key. |
| `401` | `{ "error": "You do not have access to this workspace." }` | You are not a member of the source or the destination workspace, or the destination does not exist. |
| `401` | `{ "error": "This workspace is view-only. Ask the owner for write access (workspace_read_only)." }` | You are a view-only member of the source or the destination workspace. |
| `401` | `{ "error": "This API key cannot access this workspace (workspace_scope_mismatch)." }` | The API key is scoped to a single workspace. A move always crosses a workspace boundary, so a scoped key can never perform one. |
| `401` | `{ "error": "Service temporarily unavailable. The database is not accepting requests. Retry shortly." }` | The credential store is unavailable. Retry; your key is not the problem. |
| `403` | `{ "error": "Access denied" }` | You can edit both workspaces but do not own both of them. |
| `404` | `{ "error": "Computer not found" }` | No computer matches the id. |
| `409` | `{ "error": "computer_busy" }` | Another operation holds the computer. Retry shortly. |
| `409` | `{ "error": "openclaw_enrollment_cleanup_required", "detail": "…" }` | The computer has an OpenClaw enrollment that the move would strand. Revoke and retire it first. |
| `409` | `{ "error": "latitude_monitoring_active", "detail": "Turn off Latitude monitoring for this computer first." }` | Latitude monitoring is on for this computer, or one of its monitoring jobs is still running. |
| `409` | `{ "error": "pool_mac_release_required", "message": "This Mac is managed by Orgo. Ask support to release it." }` | The computer is a Mac managed by Orgo. |
| `500` | `{ "error": "Failed to move computer" }` | The update failed, or the request body is not valid JSON. |


## OpenAPI

````yaml PATCH /computers/{id}/move
openapi: 3.1.0
info:
  title: Orgo API
  description: >-
    Launch cloud computers that AI agents can control and interact with. Create
    workspaces, provision computers, and control them programmatically.
  version: 2.0.0
  contact:
    name: Orgo Support
    email: spencer@orgo.ai
    url: https://orgo.ai
servers:
  - url: https://www.orgo.ai/api
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: >-
      Account capacity: how many computers an account may run, and adding or
      giving back more.
  - name: Clients
    description: >-
      Run Orgo for your clients from your own app: a workspace and scoped key
      each, billed to you or to them.
  - name: Workspaces
    description: Organize computers into named workspaces
  - name: Computers
    description: Provision and manage virtual computers
  - name: Computer Lifecycle
    description: Start, stop, and restart computers
  - name: Computer Actions
    description: Control mouse, keyboard, and execute commands
  - name: Screens
    description: >-
      More than one desktop on a single computer. Each screen is its own X
      server with its own cursor and window manager, so an agent working on one
      cannot disturb another.
  - name: Files
    description: Upload and download files
  - name: Templates
    description: Author, build, and launch reproducible computers from templates
paths:
  /computers/{id}/move:
    patch:
      tags:
        - Computers
      summary: Move computer to another workspace
      description: >-
        Moves a computer to a different workspace. You must own both the source
        and the destination workspace. A workspace-scoped key can never move a
        computer, because a move always crosses a workspace boundary; it is
        refused with `401`. The older body field `project_id` is also accepted;
        `workspace_id` wins when both are sent.
      operationId: moveComputer
      parameters:
        - name: id
          in: path
          required: true
          description: Computer ID
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: The destination workspace.
              properties:
                workspace_id:
                  type: string
                  description: >-
                    Destination workspace ID. Must be a workspace you own, and
                    must differ from the computer's current workspace.
                  example: 550e8400-e29b-41d4-a716-446655440000
              required:
                - workspace_id
            examples:
              workspace-id:
                summary: The documented field
                value:
                  workspace_id: 550e8400-e29b-41d4-a716-446655440000
      responses:
        '200':
          description: Computer moved
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  workspace_id:
                    type: string
                    description: The workspace the computer now belongs to.
                    example: 550e8400-e29b-41d4-a716-446655440000
                  project_id:
                    type: string
                    description: The same destination workspace ID under its legacy name.
                required: []
              example:
                success: true
                workspace_id: 550e8400-e29b-41d4-a716-446655440099
                project_id: 550e8400-e29b-41d4-a716-446655440099
        '400':
          description: >-
            `workspace_id` is missing or empty, or the computer is already in
            the destination workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                missing:
                  summary: No destination
                  value:
                    error: workspace_id is required
                same:
                  summary: Already there
                  value:
                    error: Already in this workspace
        '401':
          $ref: '#/components/responses/UnauthorizedWithAccess'
        '403':
          description: You can edit both workspaces but do not own both of them.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Access denied
        '404':
          description: No computer matches the id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Computer not found
        '409':
          description: The move was refused.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                  detail:
                    type: string
              examples:
                busy:
                  summary: Another operation holds the computer. Retry shortly.
                  value:
                    error: computer_busy
                openclaw:
                  summary: An OpenClaw enrollment the move would strand
                  value:
                    error: openclaw_enrollment_cleanup_required
                    detail: …
                latitude:
                  summary: Latitude monitoring is on
                  value:
                    error: latitude_monitoring_active
                    detail: Turn off Latitude monitoring for this computer first.
                pool-mac:
                  summary: A Mac managed by Orgo
                  value:
                    error: pool_mac_release_required
                    message: This Mac is managed by Orgo. Ask support to release it.
        '500':
          description: The update failed, or the request body is not valid JSON.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Failed to move computer
components:
  schemas:
    Error:
      type: object
      description: >-
        The base error body. Every failure carries `error`; individual endpoints
        add the fields named in the schemas below.
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable message.
          example: Access denied
        code:
          type: string
          description: >-
            Machine-readable reason. Present on the failures that define one,
            absent otherwise.
  responses:
    UnauthorizedWithAccess:
      description: >-
        No usable credential, or an access check failed. This endpoint runs its
        workspace access checks during authentication, so it answers a missing
        membership, view-only access, or a key scoped to another workspace with
        `401`, not `403`. A server-side fault while verifying the credential
        also returns `401`, with a `Service temporarily unavailable` message.
        Retry that one; the key is fine.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            invalid-key:
              summary: The key is not one of yours
              value:
                error: Invalid API key
            no-credential:
              summary: No key and no session
              value:
                error: Authentication required
            no-access:
              summary: Not the owner or a member of the workspace
              value:
                error: You do not have access to this workspace.
            view-only:
              summary: View-only member, and the request changes something
              value:
                error: >-
                  This workspace is view-only. Ask the owner for write access
                  (workspace_read_only).
            scope-mismatch:
              summary: The API key is scoped to another workspace
              value:
                error: >-
                  This API key cannot access this workspace
                  (workspace_scope_mismatch).
            service-unavailable:
              summary: Server-side fault while verifying the credential. Retry.
              value:
                error: >-
                  Service temporarily unavailable. The database is not accepting
                  requests. Retry shortly.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key authentication. Get your key at orgo.ai/workspaces

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.