Skip to content

The history of one subject’s tier

GET
/v1/admin/tier-grants
curl --request GET \
--url 'https://beta-api.plune.ai/v1/admin/tier-grants?subject=company%3A6f1c2b3a-0000-4000-8000-0000000000a5' \
--cookie plune_session=<plune_session>

Every grant of one account or company, newest first (up to 200), with the standing worked out from them now. A subject with no grant is Free and has an empty list. Owner-only and session-only, as GET /v1/admin/tiers; everyone else gets 404. Ten calls a minute.

subject
required
string
Example
company:6f1c2b3a-0000-4000-8000-0000000000a5

user:<id> or company:<id>

The standing and the history

Media type application/json
object
standing
required
object
tier
required

Free and Personal are an account’s, Team and Enterprise a company’s; Free may also be a company’s, as the row that cancels its Team.

string
Allowed values: free personal team enterprise
state
required

Worked out from the grants at the database’s clock, never stored. active: a paid grant covers now. grace: it ended or was cancelled less than 14 days ago, and the limits are still the tier’s. expired: the 14 days are over — Free. disabled: the operator switched it off — Free at once, and nothing is deleted for 14 days. No grant ever is plain Free, active.

string
Allowed values: active grace expired disabled
options
required

What a grant carries besides its tier. A free grant carries none.

object
saml
boolean
extra_storage_packs
integer
<= 1000
extra_full_months
integer
<= 120
validUntil
required

When the paid period ends — or ended, in grace. null without an end, and on Free.

string format: date-time
nullable
graceEndsAt
required

Only in grace and disabled: when the 14 days end.

string format: date-time
nullable
grants
required
Array<object>

One row of the append-only history. A cancellation is a later row with tier: free, not a change to this one.

object
id
required
string format: uuid
subject
required
object
kind
required
string
Allowed values: user company
id
required
string
tier
required

Free and Personal are an account’s, Team and Enterprise a company’s; Free may also be a company’s, as the row that cancels its Team.

string
Allowed values: free personal team enterprise
options
required

What a grant carries besides its tier. A free grant carries none.

object
saml
boolean
extra_storage_packs
integer
<= 1000
extra_full_months
integer
<= 120
validFrom
required
string format: date-time
validUntil
required
string format: date-time
nullable
source
required
string
Allowed values: manual payment
grantedBy
required

The application owner who granted it; null for a payment.

string
nullable
grantedByEmail
required

The address of grantedBy; deleted account once the purge has made that account nobody; null for a payment.

string
nullable
note
required
string
disabled
required
boolean
createdAt
required
string format: date-time
Example
{
"standing": {
"tier": "team",
"state": "active",
"options": {
"saml": true
},
"validUntil": "2099-12-31T23:59:59.000Z",
"graceEndsAt": null
},
"grants": [
{
"id": "6f1c2b3a-0000-4000-8000-0000000000a6",
"subject": {
"kind": "company",
"id": "6f1c2b3a-0000-4000-8000-0000000000a5"
},
"tier": "team",
"options": {
"saml": true
},
"validFrom": "2026-09-16T09:12:04.151Z",
"validUntil": "2099-12-31T23:59:59.000Z",
"source": "manual",
"grantedBy": "u-shop",
"grantedByEmail": "[email protected]",
"note": "annual invoice 2026-114",
"disabled": false,
"createdAt": "2026-09-16T09:12:04.151Z"
}
]
}

subject is not user:<id> or company:<id>

Media type application/json
object
error
required
string
Example
{
"error": "subject: must be user:<id> or company:<id>"
}

No / invalid session

The caller does not own the application

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

Rate-limited: the per-route throttle, or the per-minute request limit of the plan an API token counts by (#1442; the body names the plan, #2092). Retry-After carries the seconds until the window rolls over.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over