---
title: "Grant Pro"
method: POST
path: "/api/v1/admin/users/{user_id}/grant"
tags: ["admin"]
---

# Grant Pro

`POST /api/v1/admin/users/{user_id}/grant`

## Request

- Base URL: `https://api.peil.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.peil.app/api/v1/admin/users/{user_id}/grant`
- Auth: OAuth 2 (password, token URL `/api/v1/auth/jwt/login`)

Confer Pro on an account — a positive, deliberate operator action.

Two kinds, both reusing the existing grant machinery rather than adding a new
entitlement path:
  - `pro`   → an indefinite free comp. pro_source='admin', no expiry; never
              touched by the trial/founder nudge cron, and revocable from the
              deck (REVOCABLE_SOURCES).
  - `trial` → a time-boxed Pro window (default 30 days, 1–90). pro_source='trial'
              + pro_expires_at, so the whole reverse-trial lifecycle applies for
              free: the countdown banner, the T-3 heads-up and the T-0 lapse +
              'ended' email all fire with no extra code — the retention hook.

Refuses only on a live paid subscription: that account already has Pro through
Mollie, and layering a comp on top creates a confusing dual state the next
reconcile would fight. Handle billing (cancel) instead. `is_founder` is never
set — that marker means 'registered in the launch window', which a comp is not.

## Path parameters

- `user_id` integer, required

## Request body

- GrantRequest
  - `kind` string, required
  - `days` integer, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

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