---
title: "Submit a gate review for a proposal"
method: POST
path: "/proposals/{id}/reviews"
tags: ["proposals"]
---

# Submit a gate review for a proposal

`POST /proposals/{id}/reviews`

## Request

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

Records a ProposalReview row and updates Project.governanceScore via the avg-of-scores rollup. Multi-reviewer gates use quorum logic; see CLAUDE.md for the rules.

## Path parameters

- `id` string, required

## Headers

- `X-Organization-Id` string, required

## Request body

- object
  - `decision` 'APPROVED' | 'REJECTED' | 'NEEDS_MORE_INFO', required
  - `score` integer: Weighted gate-review score.
  - `comments` string
  - `criteriaScores` object[]: Per-criterion sub-scores. Each entry is `{ criteriaId, score }`.
    - `criteriaId` string, uuid, required
    - `score` integer, required

## Response `200`

Review submitted; response includes quorumPending flag

## 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`: Proposal or gate-approval row not found

---

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