Skip to content
/api/v1/plans/

List all active subscription plans with pricing, features, and Stripe price IDs.

List all active subscription plans with pricing, features, and Stripe price IDs. PUBLIC — NO authentication required. EXEMPT (`cost: 0`).

Why use this

Public catalogue of active subscription plans — drives the marketing pricing page and the in-app upgrade modal. PUBLIC (no auth required) and EXEMPT (`cost: 0`). Filters to `is_active=true` and orders by `price ASC`. Each row carries `stripe_price_id` (the Stripe Price object ID) which the frontend passes to [POST /api/v1/payment/create-checkout-session](/docs/account/billing-and-subscription/post-payment-create-checkout-session) via `?plan_id=N` to initiate a Stripe-hosted upgrade flow. Prices are in CENTS (integer) — divide by 100 for USD display. Currency defaults to `USD`. The `features` JSON column is plan-specific (e.g. an array of feature bullets for the pricing card UI).

Common use case

Marketing pricing page renders this once on page load → maps each row to a pricing card → 'Upgrade' button on each card POSTs to /api/v1/payment/create-checkout-session with the plan's `id`.

Public subscription-plan catalogue. PUBLIC — NO authentication required. EXEMPT (cost: 0). Filtered to is_active=true and sorted by price ASC. Each plan carries the Stripe Price object ID (stripe_price_id) needed by POST /api/v1/payment/create-checkout-session to initiate the Stripe-hosted upgrade flow. PRICES ARE IN CENTS — divide by 100 for USD display (e.g. price: 2900 = $29.00/month). The features array is rendered as bullet points on the pricing cards. To check a user's current plan use GET /api/v1/billing/subscription. For the canonical Phase 56+ token-balance surface (the live counter shown on the customer dashboard) use GET /api/v1/account/balance.

Response schema

FieldTypeNullableDescription
statusstringnoApiResponse envelope status — `success` on 200.
request_idstringyesPer-request correlation ID.
timestampstringnoISO-8601 UTC timestamp.
dataarraynoArray of active plans, sorted by `price ASC` (cheapest first). Empty array only if all plans are inactive (operational issue — plans are seeded at deployment).
data[].idintegernoPlan database ID. Pass to [POST /api/v1/payment/create-checkout-session](/docs/account/billing-and-subscription/post-payment-create-checkout-session) via `?plan_id=N` to initiate the Stripe-hosted upgrade flow.
data[].namestringnoPlan display name (e.g. `Free`, `Paid`, `Pro`). Casing follows brand guidelines — use verbatim in pricing-card UIs rather than lowercasing client-side.
data[].stripe_price_idstringyesStripe Price object ID in `price_XXXXX` format. Null for the Free plan (no Stripe price — checkout for Free is rejected at create-checkout-session). Used server-side to construct the Stripe Checkout `line_items[].price`.
data[].priceintegernoPlan price in CENTS (integer). E.g. `2900` = $29.00/month. 0 for the Free plan. Divide by 100 for USD display: `(price / 100).toFixed(2)`.
data[].currencystringnoISO-4217 currency code. Defaults to `USD` server-side. Use to render currency symbol ($ / € / £).
data[].intervalstringnoBilling interval — `month` (default), `week`, `year`. Drives '/month' vs '/year' suffix on pricing cards.
data[].featuresarraynoJSON array of feature-bullet strings for the pricing-card UI (`features: ["2,000 tokens/month", "Community support", ...]`). Empty array on plans that haven't been content-populated yet (operational gap).
data[].is_activebooleannoAlways true in the response (the query filter is `is_active=True`). Inactive plans are hidden from the public catalog by default. Inactive plans still service existing subscribers — they're just not offered to new signups.

Sample response

·
  • "status": "success"
  • "request_id": "req_3OqK2jK9L8pQ4xZ4"
  • "timestamp": "2026-05-02T15:51:00.000Z"
  • "data":
    ]
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/plans/" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).