A valid request URL is required to generate request examples{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "pro",
"name": "<string>",
"description": "<string>",
"display_order": 123,
"archived": true,
"seat_feature_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prices": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "recurring",
"currency": "BRL",
"amount_minor": 123,
"currency_exponent": 123,
"interval_unit": "day",
"interval_count": 123,
"trial_days": 123,
"per_seat": true,
"tax_behavior": "inclusive",
"archived": true,
"providers": [
{
"provider": "stripe",
"provider_account_id": "<string>",
"provider_price_id": "<string>",
"provider_product_id": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}
],
"features": [
{
"feature_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"feature_key": "<string>",
"kind": "boolean",
"limit": 123,
"unlimited": true,
"included_quantity": 123,
"rollover": "none",
"rollover_cap": 123,
"overdraft_limit": 123,
"overage_meter_ref": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}Update a plan
Requires billing:write. Changes what a plan says about itself, and whether it is still sold. Send only the fields you are changing.
There is no separate archive endpoint: archived is a state a plan can come back from, so true withdraws it from the pricing table and false puts it back. Archiving is idempotent — the date it stopped being sold does not move if you archive it twice. Nothing is deleted, because subscriptions point at plans and a deleted plan is a subscription that cannot say what it is for.
key is refused rather than ignored: a caller sending it believes it will change, and dropping it in silence is how your own gate stops matching a plan nobody told you was renamed.
A valid request URL is required to generate request examples{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "pro",
"name": "<string>",
"description": "<string>",
"display_order": 123,
"archived": true,
"seat_feature_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prices": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "recurring",
"currency": "BRL",
"amount_minor": 123,
"currency_exponent": 123,
"interval_unit": "day",
"interval_count": 123,
"trial_days": 123,
"per_seat": true,
"tax_behavior": "inclusive",
"archived": true,
"providers": [
{
"provider": "stripe",
"provider_account_id": "<string>",
"provider_price_id": "<string>",
"provider_product_id": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}
],
"features": [
{
"feature_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"feature_key": "<string>",
"kind": "boolean",
"limit": 123,
"unlimited": true,
"included_quantity": 123,
"rollover": "none",
"rollover_cap": 123,
"overdraft_limit": 123,
"overage_meter_ref": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}{
"error": {
"code": "forbidden",
"message": "your role does not allow this action"
}
}Authorizations
A staff session token, uk_st_…. Minted by sign-up, sign-in or the two-factor exchange. Only a 401 means it is spent; not_a_member (403) is about the organization named in X-Organization-Id and leaves the token good for the others.
Headers
The organization the caller is acting on — the org_… code that appears in the panel URL. It identifies; the membership JOIN is what authorizes, so a forged code reads nothing: the answer is not_a_member (403), which does not mean the session is over. Absent, the session's default organization answers, or — if that membership was revoked while the session was open — any other one the caller still holds.
Path Parameters
The plan.
Query Parameters
Which environment to act in. A view parameter, valid only on the staff surface — a machine credential never chooses its environment, it is resolved from the key.
live, test Body
true withdraws the plan from sale, false puts it back.
Which of this environment's metered features counts this plan's seats. Absent leaves it alone; an empty string clears it — no seat limit is a real offer, not a missing field.
Response
The plan as it now stands. prices and features are not included — re-read the catalogue for those.
A plan you sell. Its prices and the features it carries come with it, because a pricing table needs all of them at once.
Your own stable handle for the plan — lowercase letters, digits, _, - and .. Unique within an environment, and what promoting a catalogue to live matches on.
"pro"
Where the plan sits on a pricing table.
No longer sold. Archived rather than deleted, because subscriptions point at it.
Which of this environment's metered features counts this plan's seats. The seat limit is that feature's allowance — the plan's cell, then any per-customer override — and invitations onto teams subscribed to this plan are checked against it. null is no seat limit.
Show child attributes
Show child attributes
Show child attributes
Show child attributes