---
title: "Approve or reject a workflow approval step"
method: POST
path: "/workflows/approvals/{id}/decide"
tags: ["workflows"]
---

# Approve or reject a workflow approval step

`POST /workflows/approvals/{id}/decide`

## Request

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

Only the assigned approver can decide. 409 ALREADY_DECIDED when the approval was already decided, including when two decisions arrive together (exactly one lands). 400 APPROVAL_STALE when the run has moved past this step, finished or been cancelled.

## Path parameters

- `id` string, required

## Headers

- `X-Organization-Id` string, required

## Request body

- object
  - `decision` 'APPROVED' | 'REJECTED', required
  - `note` string

## Response `200`

Decision recorded; workflow resumes downstream steps

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT
- `402`: Plan gate - feature not available on current plan
- `403`: Forbidden - insufficient role
- `404`: Approval row not found
- `409`: ALREADY_DECIDED

---

[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)
