---
title: "Advance, hold, or unhold a proposal"
method: PUT
path: "/proposals/{id}/stage"
tags: ["proposals"]
---

# Advance, hold, or unhold a proposal

`PUT /proposals/{id}/stage`

## Request

- Base URL: `https://api.onplana.com/api`
- URL: `https://api.onplana.com/api/proposals/{id}/stage`
- Auth: one of:
  - HTTP bearer
  - API key in header `Authorization`

State machine transition. `action: hold` stores previousStage; `action: unhold` restores it.

## Path parameters

- `id` string, required

## Headers

- `X-Organization-Id` string, required

## Request body

- object
  - `action` 'advance' | 'reject' | 'hold' | 'unhold' | 'restart', required
  - `reason` string: Optional reason, recorded on the audit log.

## Response `200`

Updated Proposal

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT
- `402`: Plan gate - feature not available on current plan
- `403`: Forbidden - insufficient role
- `409`: Stage transition not allowed

---

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