---
title: "Public — active plans for an app, dynamic from Stripe"
method: GET
path: "/v1/billing/plans"
tags: ["Billing"]
---

# Public — active plans for an app, dynamic from Stripe

`GET /v1/billing/plans`

## Request

- Base URL: `https://api.algenta.ai`
- URL: `https://api.algenta.ai/v1/billing/plans`
- Auth: none declared

Plan titles/prices/descriptions/features straight from Stripe (no hardcoding). Public —
pricing is public (a pricing page renders before sign-in). Free + Enterprise (no Stripe price)
are added by the frontend as bookends.

A BRANDED host prices exactly one brand: its own, resolved from an authoritative signal
(`ALGENTA_PRODUCT`, else the request's own `Host` via the registry's `public_api_base`). A
request for a DIFFERENT brand on a branded host is refused rather than served: cross-brand
pricing stays possible only on the shared engine's own non-brand host, which is where a
multi-brand portal belongs. `?app=<own brand>` remains valid so existing callers keep working.

An unregistered `app` is rejected with an error rather than an empty plan list under a 200, so
the response distinguishes "this brand has no paid tiers" from "no such brand".

## Query parameters

- `app` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/codna/apis/algenta-api.md) · [All operations](https://skmtc.dev/codna/apis/algenta-api/llms.txt) · [OpenAPI document](https://skmtc.dev/codna/apis/algenta-api/revisions/35d30f84a5df?raw)
