---
title: "Move concluded work sessions (hours) to another project, across workspaces."
method: POST
path: "/work-sessions/move"
tags: ["work-sessions"]
---

# Move concluded work sessions (hours) to another project, across workspaces.

`POST /work-sessions/move`

## Request

- Base URL: `https://restivity.ai/api/v1`
- URL: `https://restivity.ai/api/v1/work-sessions/move`
- Auth: OAuth 2 (authorization code, authorization URL `https://restivity.ai/oauth/authorize`, token URL `https://restivity.ai/api/oauth/token`, scopes: `pomodoro:write`)

The one way priced hours leave the workspace they were earned in. Who loses money decides: an owner/admin of the origin moves at once; the hours’ owner moves at once from their own personal workspace or within one workspace; a plain member taking hours OUT of a company workspace gets 202 — the move is recorded as a request (`request_id`) and the origin’s owner/admins decide (`POST /work-sessions/move/requests/{id}/decide`). The destination must be a project the hours’ owner can track time in. A moved session is re-priced with the destination’s rates in the same statement, its task kept only when it belongs to the destination project, and the origin’s money history records it (an Undo is a move back). Call `POST /work-sessions/move/preview` first to show the price before and after.

## Request body

- MoveWorkSessionsInput
  - `session_ids` string[], required: The ids of the concluded work sessions to move (1–500) — one person’s, from one workspace.
  - `destination_project_id` string, uuid, required: The project the hours go to; they are priced again with the rates of its workspace.
  - `note` string: Optional: why the hours move — shown to whoever approves the request.

## Response `200`

The hours moved: each session’s anchors and price before and after.

- WorkSessionMoveResult
  - `status` 'moved' | 'pending' | 'declined' | 'undone', required
  - `code` 'move_needs_approval': On 202: the move waits for the owner/admins of the workspace the hours leave.
  - `message` string
  - `request_id` string, uuid, nullable, required
  - `origin_workspace_id` string, uuid, required
  - `destination_workspace_id` string, uuid, required
  - `approver_ids` string[]
  - `session_ids` string[]
  - `moved` object[]
    - `session_id` string, uuid, required
    - `before` object, required: The anchors and price before the move (an Undo — `POST /work-sessions/move/undo` — puts it back there). Money as the preview shows it: a rate or amount the caller may not read is null.
    - `after` object, required
  - `undone` object[]: On an undo (status `undone`): per session the anchors and price before the undo (`before`, where the move had left it) and after (`after`, back where it was earned, priced again there). Money the caller may not read is null.
    - `session_id` string, uuid, required
    - `before` object, required: The anchors and price before the move (an Undo — `POST /work-sessions/move/undo` — puts it back there). Money as the preview shows it: a rate or amount the caller may not read is null.
    - `after` object, required

## Other responses

- `202`: `code: move_needs_approval` — the move waits for the origin’s owner/admins (`approver_ids`); nothing has moved yet.
- `400`: Invalid request shape.
- `401`: Missing or invalid access token.
- `403`: Token lacks the required scope.
- `404`: No such session among those the caller can see, or no such project.
- `409`: `sessions_frozen` — billed or invoiced sessions never move (`session_ids` names them; nothing moved); `move_already_requested` — a session already waits in another pending request; `move_request_stale` — the request was decided already or its sessions changed; a Trash code (`session_in_trash`, `project_in_trash`, …) — restore it first.
- `422`: Request body failed schema validation.
- `429`: Rate-limit exceeded for this tier.

---

[API](https://skmtc.dev/restivity/apis/restivity-rest-api.md) · [All operations](https://skmtc.dev/restivity/apis/restivity-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/restivity/apis/restivity-rest-api/revisions/5764e41ebb3a?raw)
