billing

GET /v1/catalog/plan-moves

For a product line I am already on, which plans can I move to?

All billing endpoints

All developer docs

Authentication

Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.

Where your organisation id goes

This endpoint takes org_id as a query parameter. Leave it out and the call covers your whole tenancy subtree; send it to narrow the call to one organisation.

Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X GET https://api.zinndigital.com/v1/catalog/plan-moves?product_line=<product_line> \
  -H "Authorization: Bearer zdk_live_…"

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

The ladder from the plan the organization currently holds on one product line — every purchasable tier on that line, marked upgrade, downgrade or current, priced in the organization's own currency and term. It exists because a customer already on a plan is not shopping: offering them the whole catalogue as fresh purchases, the tier they are on included, is what the buy screen must not do. A tier above theirs is an upgrade and a tier below is a downgrade, and only one of those can be refused by what the account already uses. blocked_by is empty when a move is offerable. It is populated only on a downgrade, and only with limits the account is already over — a smaller plan cannot be moved to while seven sites will not fit five slots. Limits that could not be measured are deliberately not reported as blockers: "no evidence" and "over the limit" are different facts, and rendering the first as the second refuses a legitimate downgrade because a stored sample went stale. Direction comes from the catalogue's own ordering, not from price — a promotional price or an annual term can invert the ladder, and a plan with no price in the caller's currency has no direction at all. Price is the tiebreak within one rung. current: null with an empty moves means the organization holds no plan on that line, so there is nothing to move from and the ordinary catalogue applies.

Parameters

NameTypeRequiredWhat it is
org_id (query)UuidNoThe organization to answer for. Required when the caller can see billing for more than one; otherwise defaults to theirs.
product_line (query)stringYesThe product line to build the ladder for.

Response

NameTypeRequiredWhat it is
currentPlanMoveCurrentYesThe plan they are on. Null when they hold none on this line, in which case moves is empty — there is nothing to move from.
movesPlanMove[]Yes
handle_site_idstringNoThe site to POST a plan change to. A handle, not a scopechange_plan applies the new entitlements to every site the subscription entitles, so which one is used changes…

Errors this endpoint can return

401 · 403 · 422