Get Billing Config
const url = 'https://example.com/api/billing/config';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/billing/configThe public price list — no auth required (§13.6, S42).
Mirrors app/api/health.py’s fully-public posture: this is read-only, pre-signup pricing data with no per-org state, the same information a marketing pricing page needs to render for an anonymous visitor.
tiers (plan_kind=‘tier’, features.hidden not true, tier_rank ascending)
is the new single source for the console tier picker and the marketing
pricing page. plans is now DEPRECATED but still served unchanged in
shape for the S42 release: its selection rule widens from “is_active”
to “plan_kind=‘alacarte’ AND (plan_code IN ADDON_PLAN_CODES OR
is_active)” so soft-retiring the four grandfathered à la carte rows does
not empty this array out from under existing consumers, and the live
addon_mcu_ota row (sold out of band, no checkout path) keeps appearing
exactly as it does today. No row this endpoint returns today disappears —
with ONE launch exception (TODO-088): the addon_mcu_ota row is omitted
from plans unless MCU_OTA_PUBLIC_CATALOG is on (MCU OTA is not sold at
launch); the row itself and existing entitlements are untouched.
Also the console’s only source for Stripe’s publishable key (§8.1), which is public by design — it can only tokenize a card, never read or charge. The key is withheld unless stripe is an enabled gateway, so the console never mounts Elements against a deployment whose checkout would 503.
Responses
Section titled “ Responses ”Successful Response
GET /api/billing/config — the public plan catalog.
Also carries the gateway’s PUBLISHABLE identifier (§8.1): this endpoint is the console’s only source for it, and it is designed by Stripe to be public (it can mint payment methods, never read or charge). Secret keys and the webhook secret must never appear here.
object
The deployment-wide default overage rates from pricing_tiers.yaml’s
top-level overage: block (§13.6) — informational only; per-tier
overage_device_cents/overage_datapoints_per_million_cents are
authoritative for any actual price quote.
object
One row of the (deprecated, §13.6) public à la carte plan catalog.
object
One row of the public tier catalog (§13.6) — plan_kind=‘tier’, features.hidden not true, ordered by tier_rank ascending.
object
plans.features_json verbatim (§13.4/§13.5) for a plan_kind='tier' row.
object
Example
{ "plans": [ { "is_active": true, "purchasable": false } ], "stripe_tax_enabled": false, "tiers": [ { "features": { "contact_sales": false, "hidden": false, "support": "community" } } ]}