catalog
GET /v1/catalog/plans
List the sellable plans with their prices.
Նույնականացում
Այս վերջնակետը հանրային է: Այն չի պահանջում որևէ հավատարմագիր կամ կազմակերպություն. դա այն է, ինչ կարդում են մեր սեփական մարքեթինգային կայքը և արհեստական բանականության պատասխանների շարժիչները:
Այս վերջնակետը կազմակերպության ID չի ընդունում: Ձեր բանալին արդեն իսկ նույնականացնում է այն կազմակերպությունը, որին պատկանում է, և պատասխանը սահմանափակված է դրանով:
Փորձել
Փոխարինեք անկյունային փակագծերում գտնվող ցանկացած բան ձեր սեփական արժեքներով, և բանալու տեղապահը՝ ձեր վահանակի բանալիով:
curl -X GET https://api.zinndigital.com/v1/catalog/plansՄուտք գործե՞լ եք: Ձեր վահանակի API վահանակը լրացնում է ձեր իրական կազմակերպության ID-ն և ձեր սեփական բանալին և գործարկում է հարցումը ուղիղ API-ի դեմ, որպեսզի կարողանաք տեսնել փաստացի պատասխանը: Բացեք այս վերջնակետը API վահանակում
Մանրամասներ
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).
Պարամետրեր
| Անուն | Տեսակ | Պահանջվում է | Ինչ է դա |
|---|---|---|---|
product_line (query) | string | Ոչ | Restrict to one product line by its code (e.g. footprint_free). Unknown code → empty list. |
currency (query) | string | Ոչ | 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 | Ոչ | A previously returned ETag; a match responds 304. |
Պատասխան
| Անուն | Տեսակ | Պահանջվում է | Ինչ է դա |
|---|---|---|---|
data | CatalogPlan[] | Այո | — |
Այս վերջնակետի կողմից վերադարձվող սխալները
422 · 429