---
title: "List plans"
method: GET
path: "/api/billing/tiers"
---

# List plans

`GET /api/billing/tiers`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/billing/tiers`
- Auth: one of:
  - none
  - HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Lists Base44's plans with their limits, prices, and the IDs you need to change one.

You can call this without credentials. Then `currency` follows the country the request comes from. With a token, it follows your workspace: a paid workspace sees the currency it pays in, and a free one the currency it can check out in. An invalid or read-only token is ignored, and you get the answer for no credentials.

Prices are in the smallest currency unit, such as cents, and can be `null` while Base44 can't load them. Retry later rather than treating a `null` price as free.

Use `price_ids` with [Change plan](/api-reference/change-plan) on a Stripe-billed workspace, and `wix_product_id` with [Change Wix plan](/api-reference/change-wix-plan) on a Wix-billed one.

Plans come in `hierarchy` order, and the default `limit` of 100 returns every plan on one page. To page through them, pass a smaller `limit` and send each `next_cursor` back as `cursor`. A cursor carries the rest of the query, so send it alone. `hierarchy` always lists every plan.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>

## Query parameters

- `limit` integer: Plans per page, 1 to 100. Defaults to 100, which fits every plan.
- `cursor` string: `next_cursor` from the previous page. Send it alone.

## Response `200`

Every plan, with its limits and prices.

- PlanList: Base44's plans.
  - `tiers` Plan[], required: The plans on this page, in `hierarchy` order. With the default `limit`, every plan.
    - `name` string, required: ID of the plan. Compare it with the workspace's plan, or with `hierarchy`.
    - `display_name` string, required: Name of the plan to show people.
    - `rank` integer, required: Position in `hierarchy`, starting at 0 for `free`. A higher rank is a bigger plan.
    - `hidden` boolean, required: `true` for plans Base44 doesn't offer in its plan picker, such as `lite`.
    - `limits` PlanLimits, required: What a plan includes.
      - `monthly_message_credits` integer, required: Message credits the plan grants each month.
      - `monthly_integration_credits` integer, required: Integration credits the plan grants each month.
      - `daily_message_limit` integer, nullable, required: Most messages a day, or `null` for no daily limit.
      - `max_apps` integer, nullable, required: Most apps the plan allows, or `null` for no limit.
    - `features` string[], required: Feature bullets for the plan. Empty while Base44 can't load pricing details.
    - `pricing` object, required: Price per billing period in the smallest currency unit, such as cents, keyed `<period>_<currency>`, such as `monthly_usd` or `yearly_eur`. A value is `null` while Base44 can't load prices, or when the plan isn't sold that way.
    - `price_ids` object, required: Price ID per billing period, keyed like `pricing`. Pass one to [Change plan](/api-reference/change-plan) or [Preview plan change](/api-reference/preview-plan-change) on a Stripe-billed workspace. `null` when the plan isn't sold that way.
    - `wix_product_id` string, nullable, required: Wix product for the plan in `currency`. Pass it as `new_product_id` to [Change Wix plan](/api-reference/change-wix-plan) on a Wix-billed workspace. `null` when Wix doesn't sell the plan in that currency.
  - `hierarchy` string[], required: Plan IDs from smallest to largest.
  - `free_tier` string, required: ID of the free plan.
  - `recommended_tier` string, required: ID of the plan Base44 recommends.
  - `currency` 'usd' | 'ils' | 'eur' | 'gbp' | 'brl', required: Currency you're shown and charged in. `wix_product_id` is for this currency.
  - `next_cursor` string, nullable, required: Send as `cursor` to get the next page. `null` on the last page.

## Other responses

- `400`: `cursor` is invalid or expired, or was sent with `limit`.
- `422`: Validation Error
- `429`: Rate limit exceeded. The base rate limit is 120 requests per minute per user, or per IP address without credentials. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 66 revisions in range; 1 not diffed.

- **2026-10-26** `395a6758864a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/billing/tiers/get.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/d877a932dc19?raw)
