---
title: "Grant/revoke platform admin"
method: PUT
path: "/v1/admin/staff/{user_id}/internal"
tags: ["admin"]
---

# Grant/revoke platform admin

`PUT /v1/admin/staff/{user_id}/internal`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/admin/staff/{user_id}/internal`
- Auth: HTTP bearer

Grant or revoke a user's is_internal flag. Admin-user only: a service key cannot change staff access (that would let a leaked key mint a permanent human admin). You cannot revoke your own access.

## Path parameters

- `user_id` string, uuid, required

## Request body

- SetInternalRequest
  - `is_internal` boolean, required

## Response `200`

Successful Response

- StaffUserResponse
  - `id` string, uuid, required
  - `email` string, required
  - `first_name` string, nullable, required
  - `last_name` string, nullable, required
  - `is_internal` boolean, required
  - `created_at` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)
- `404`: Not found
- `409`: Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)
- `422`: Validation error

---

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