commerce

GET /v1/order/config/{planCode}

Everything a signed-in customer configures for one plan.

All commerce endpoints

All developer docs

Authentication

Send an API key as a bearer token. The key must carry the billing.view permission; a key without it is refused with 403, not 404.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

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/order/config/{planCode} \
  -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 in-app twin of getPublicOrderConfig, and it reads the same function: two computations of "what can I configure on this plan" is how the public funnel and the console come to disagree about whether a plan includes a free domain. The one real difference is why this route exists: it includes the product lines the owner ruled sellable only inside the app (email for an external domain, 2026-08-16), which are absent from every anonymous surface. It is a separate authenticated route rather than a query parameter, because a parameter an anonymous caller can set is not a visibility control. Authenticated but not tenant-scoped: the answer is a statement about what the platform sells, not about the caller's estate. Requires billing.view.

Parameters

NameTypeRequiredWhat it is
planCode (path)stringYesThe catalogue code of the plan being configured.

Response

NameTypeRequiredWhat it is
plan_codestringYes
plan_namestringYes
plan_idstringYesThe plan's stable identity — what a URL or an analytics event refers to.
plan_version_idstringYesThe purchasable identifier: what a hosting_plan cart line pins. Not plan_id — a price change mints a new version rather than mutating the sold one, so this value changes…
plan_versionintegerYes
product_linestringYes
product_line_namestringYesThe line's display name from the engine's one source table, so a client never has to render a raw code to a customer.
currencystringYesWhat everything on this payload is priced in. It may differ from the currency asked for: a currency with no derived price row yet falls back to USD and says so here rather…
termsOrderTerm[]YesCheapest per month first, which is what default_interval names.
default_intervalstringYesThe cadence to select on first render — derived as the cheapest per month rather than typed beside the price table. A typed default is a comment that happens to run: correct…
trial_daysobjectYesThe free trial this plan offers, or null for none. A trial takes no card and starts immediately, so the button beneath the configuration has to say "start trial" rather than…
included_domainsintegerYesHow many domain registrations the plan includes free — the "use the free domain this plan includes" branch. 0 is the common case: render that branch only when the allowance is…
included_domain_tldsstring[]YesWhich extensions the free registration may be spent on. Empty alongside a non-zero included_domains means the plan grants any offered TLD.
domain_term_yearsinteger[]Yes
regionsOrderRegion[]YesThe data centres a site on this plan may be created in. Empty is a real answer — the Footprint-Free line offers no region by owner ruling, because a PBN customer is…
specOrderSpecItem[]YesThe read-only "what is included" panel, ordered for display. Not a filtered allow-list: every resolved entitlement appears, so a capability added to the catalogue tomorrow is…
addonsOrderAddon[]YesThe services offered on this product line and deliverable today — a PBN addon never appears on a mainstream plan, and an addon whose fulfilment handler has been withdrawn…

Errors this endpoint can return

401 · 403 · 404