---
title: "Grant the request at a chosen level"
method: POST
path: "/access-requests/{id}/approve"
tags: ["access-requests"]
---

# Grant the request at a chosen level

`POST /access-requests/{id}/approve`

## Request

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

Decider-gated (re-checked at decide time). Grants ONLY through the existing rails: project membership at MANAGER / MEMBER / CONTRIBUTOR / VIEWER, or a workspace grant at VIEW / CONTRIBUTE / MANAGE; request-access mints no new authority. Approving a NON-project-member on a project-scoped library/list/page ALSO adds them to the owning project as VIEWER (the members-only boundary: a grant alone is dead for a non-member); the inbox row flags this via willAddToProject, and the audit row records addedToProjectId. 409 NOT_PENDING when another decider (or a withdraw) got there first. The requester is notified.

## Path parameters

- `id` string, required

## Headers

- `X-Organization-Id` string, required

## Request body

- object
  - `level` string, required: A level from the inbox row's `levels` for this resource family.

## Response `200`

{ id, status: APPROVED }

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT
- `403`: Forbidden - insufficient role

---

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