---
title: "Deny a pending tier request"
method: POST
path: "/api/tier/deny"
tags: ["membership"]
---

# Deny a pending tier request

`POST /api/tier/deny`

## Request

- Base URL: `https://www.immersivecommons.com`
- URL: `https://www.immersivecommons.com/api/tier/deny`
- Auth: one of:
  - API key in cookie `__session`
  - HTTP bearer

Clerk operator session OR an agt_ token carrying `admin:tier_review`, live tier re-checked. Clears the pending request and its KV snapshot; the member's current tier is unchanged. `was_pending: false` means there was nothing to deny — a success, not an error.

## Request body

- TierDenyRequest
  - `user_id` string, required: Clerk user id of the member whose request is being denied.
  - `reason` string: Free text for the audit trail; trimmed to 400 characters.

## Response `200`

The request was cleared.

- TierDenyResponse
  - `ok` boolean, required
  - `user_id` string, required
  - `tier` string, required: The member's tier, unchanged by a deny.
  - `was_pending` boolean, required: False when there was nothing to deny.

## Other responses

- `400`: Invalid JSON or missing user_id.
- `401`: No auth.
- `403`: Not an operator / scope not authorized.
- `500`: Clerk write failed.

---

[API](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api.md) · [All operations](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/revisions/be67c1f67c27?raw)
