catalog
GET /v1/catalog/plans
List the sellable plans with their prices.
Doğrulama
Bu nöqtə açıqdır. O, heç bir etimadnamə və təşkilat tələb etmir — bu, öz marketinq saytımızın və süni intellekt cavab mühərriklərimizin oxuduğu hissədir.
Bu endpoint heç bir təşkilat ID-si tələb etmir. Sizin açarınız artıq aid olduğu təşkilatı müəyyən edir və cavab həmin təşkilat üçün məhdudlaşdırılır.
Sınaqdan keçir
Bucaqlı mötərizələrdə olan hór şeyi öz qiymətlərinizlə, açar yertutucusunu isə idarə panelinizdən bir açarla əvəz edin.
curl -X GET https://api.zinndigital.com/v1/catalog/plansSistemə daxil olmusunuz? İdarə panelinizdəki API konsolu real təşkilatınızın identifikatorunu və öz açarınızı avtomatik doldurur, sorğunu canlı API-yə qarşı icra edir ki, siz faktiki cavabı görə biləsiniz. Bu son nöqtəni API konsolunda açın
Təfərrüatlar
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).
Parametrlər
| Ad | Tip | Tələb olunur | Nədir |
|---|---|---|---|
product_line (query) | string | Xeyr | Restrict to one product line by its code (e.g. footprint_free). Unknown code → empty list. |
currency (query) | string | Xeyr | Narrow 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… |
If-None-Match (header) | string | Xeyr | A previously returned ETag; a match responds 304. |
Cavab
| Ad | Tip | Tələb olunur | Nədir |
|---|---|---|---|
data | CatalogPlan[] | Bəli | — |
Bu son nöqtənin qaytara biləcəyi xətalar
422 · 429