> ## Documentation Index
> Fetch the complete documentation index at: https://feather.mupeni.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Approve Proposal

> Approves a pending proposal, creates a new flag version, and updates the edge cache.

On approval, a new flag version is created atomically and the environment's edge cache is updated.

<Note>
  The approver must be a different actor than the proposer (four-eyes principle). Self-approval
  returns `403 SELF_APPROVAL_FORBIDDEN`.
</Note>

## Path parameters

<ParamField path="proposalId" type="string" required />

## Body

<ParamField body="note" type="string">
  Optional approval note, visible in the audit log and proposal record.
</ParamField>

<RequestExample>
  ```bash theme={null}
  curl -X POST https://nest.feather.mupeni.dev/v1/proposals/prop_01hx.../approve \
    -H "Authorization: Bearer <reviewer_key>" \
    -H "Content-Type: application/json" \
    -d '{ "note": "Looks good, approved for production." }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "prop_01hx...",
    "status": "approved",
    "reviewedBy": "key_02hx...",
    "reviewedAt": "2024-04-11T09:00:00.000Z",
    "reviewNote": "Looks good, approved for production."
  }
  ```

  ```json 403 theme={null}
  {
    "error": { "code": "SELF_APPROVAL_FORBIDDEN", "message": "You cannot approve your own proposal." }
  }
  ```

  ```json 409 theme={null}
  {
    "error": { "code": "PROPOSAL_NOT_PENDING", "message": "Proposal is not in pending state." }
  }
  ```

  ```json 207 theme={null}
  {
    "id": "prop_01hx...",
    "status": "approved",
    "reviewedBy": "key_02hx...",
    "reviewedAt": "2024-04-11T09:00:00.000Z",
    "syncWarning": "Edge cache sync failed: timeout. Config saved but evaluations may serve stale data."
  }
  ```
</ResponseExample>
