Create a plan
Requires billing:write. Adds a plan to one environment’s catalogue. Build it in test and the live catalogue is untouched.
key is yours and permanent: it is the handle your own code compares against and the value promoting a catalogue to live matches on, so it cannot be changed afterwards — renaming it would detach every gate from the plan it names without reporting anything. A plan under a new key is a new plan, and archiving the old one costs nothing.
A plan created here has no price and carries no features yet. Price it with POST /v1/organization/catalogue/plans/{id}/prices and fill the matrix with PUT /v1/organization/catalogue/plans/{planId}/features/{featureId}.
Authorizations
A staff session token, uk_st_…. Minted by sign-up, sign-in or the two-factor exchange.
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. Absent, the session's default organization answers.
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
Lowercase letters, digits, _, - and .. Unique within the environment. Narrow on purpose: it ends up in your source, in a URL and in a payment provider's metadata, and a key that gets escaped differently in three places stops matching in one of them.
64"pro"
What the pricing table draws.
Where the plan sits on a pricing table. Yours to decide rather than inferred from the price.
Response
The plan. prices and features are absent — it has none yet.
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.