Skip to content

Plans

GET /plans returns the public plan catalog. No authentication required — this powers the marketing site’s pricing table.

GET /plans
[
{ "slug": "free", "name": "Free", "tier": 0, "monthly_limit": 100, "stripe_price_id": null },
{ "slug": "hobby", "name": "Hobby", "tier": 1, "monthly_limit": 5000, "stripe_price_id": "price_..." },
{ "slug": "pro", "name": "Pro", "tier": 2, "monthly_limit": 25000, "stripe_price_id": "price_..." },
{ "slug": "scale", "name": "Scale", "tier": 3, "monthly_limit": 150000, "stripe_price_id": "price_..." }
]

Ordered by tier ascending. Free plans (no stripe_price_id), private plans (public: false), and archived plans (archived_at set) are not returned.

FieldNotes
slugStable identifier; use this in POST /billing/checkout.
nameDisplay name.
tierInteger hierarchy. Higher = more capable. Used for “requires Pro tier or higher” feature gates.
monthly_limitSend limit per billing period.
stripe_price_idStripe Price object the Checkout session subscribes to. null for free plans.

Plans with public: false (e.g., one-off custom deals) are not listed here. They’re assigned manually by an admin and visible only via GET /billing/subscription for the account they belong to.