---
title: "Approve or decline a pending move of someone’s hours (origin owner/admin)."
method: POST
path: "/work-sessions/move/requests/{id}/decide"
tags: ["work-sessions"]
---

# Approve or decline a pending move of someone’s hours (origin owner/admin).

`POST /work-sessions/move/requests/{id}/decide`

## Request

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

Only an owner or admin of the workspace the hours leave decides. Approve: the hours move exactly as a direct move would (every rule re-checked), recorded as moved by the person who asked and approved by the caller. Decline: nothing moves; the person who asked is told.

## Path parameters

- `id` string, uuid, required

## Request body

- DecideWorkSessionMoveInput
  - `approve` boolean, required: true moves the hours; false declines the request (nothing moves).
  - `note` string: Optional: a word for the person who asked.

## Response `200`

The decision: `moved` (with the sessions) or `declined`.

- 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

- `400`: Invalid request shape.
- `401`: Missing or invalid access token.
- `403`: Token lacks the required scope.
- `404`: No such request among those the caller can read.
- `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)
