catalog

GET /v1/catalog/plans

List the sellable plans with their prices.

Dhammaan catalog bixiyayaasha

Xaqiijinta aqoonsiga

Bankigan (endpoint) waa mid dadweyne. Ma qaato wax aqoonsi ah ama urur ah — waa waxa ay site-keenna suuqgeynta iyo matoorada jawaabaha ee AI ay akhriyaan.

Boggan ma qaato aqoonsiga ururka. Furahaagu wuxuu horay u aqoonsanayaa ururka uu ka tirsan yahay, jawaabtuna waxay ku kooban tahay halkaas.

Isku day

Ku beddel wax kasta oo ku dhex jira qeebaha xaglaha ah qiimayaashaada, sidoo kalena haystaaha furaha ku beddel fure ka dhex muuqda dashboordigaaga.

curl -X GET https://api.zinndigital.com/v1/catalog/plans

Ma sign-garaysay? Qalabka API ee ku jira dashboard-kaagu wuxuu buuxiyaa aqoonsigaaga ururka ee dhabta ah iyo furahaaga gaarka ah, wuxuuna ku shaqeysiiyaa codsiga API-ga nool si aad u aragto jawaabta dhabta ah. Kani ka fur barta kontoroolka ee API

Faahfaahin

Returns every active plan with its current version's **resolved entitlements** (product-line defaults overlaid with the plan's own) and its list prices, in the stored currency and interval. Prices are integer minor units + an ISO currency code (CLAUDE.md §2.8); USD is the base, and a derived, charm-rounded row is served for every enabled currency once the FX refresh has run (docs/29 §2). **Public** (docs/35 #19). **`prices` is a multi-row array, one entry per (interval, currency)** — never a single pre-converted row. A client selects the entry matching the customer's chosen currency AND interval, and must render **nothing** rather than fall back to an amount in a different currency: a number in the wrong currency, or the right number under the wrong symbol, is worse than an absent price (#471). **Each plan carries `plan_version_id`, the identifier that makes it purchasable.** A `hosting_plan` cart line pins a plan *version*, not a plan, so before this field existed a customer could browse the catalogue and had no way to buy anything in it (#463). The full self-serve path is `POST /v1/carts` → `POST /v1/carts/{cartId}/lines` with `{kind: hosting_plan, plan_version_id, metadata: {interval}}` → `POST /v1/carts/{cartId}/checkout`. An **internal** plan is never listed here and the cart refuses it, so the unlimited staff plan cannot be self-served. Returned **whole, not cursor-paginated** — a deliberate, documented deviation matching `getTranslationBundle`: the catalogue is our own bounded content, and a pricing page or the pricing slider needs every tier at once, not 50 at a time. The response is bounded by a hard server-side cap; a catalogue that would exceed it is a `422` (it never silently truncates), which cannot happen with today's catalogue and exists only so unbounded future growth fails loudly. Cacheable exactly like `listProductLines` (strong `ETag` + `max-age=60`).

Cabiraha

MagacaNoocLoo baahan yahayMaxay tahay
product_line (query)stringMayaRestrict to one product line by its code (e.g. `footprint_free`). Unknown code → empty list.
currency (query)stringMayaNarrow each plan's `prices` array to a single ISO 4217 currency. **Optional and additive**: omitting it returns every currency exactly as before, so no existing client changes b…
If-None-Match (header)stringMayaA previously returned `ETag`; a match responds `304`.

Jawaab

MagacaNoocLoo baahan yahayMaxay tahay
dataCatalogPlan[]Haa

Cilladaha ay bartaani soo celin karto

422 · 429