# The subscription plans

`GET /v1/console/plans` (operation id `listPlans`)

The monthly plans (Base, Hot, Fierce) with their price excluding VAT, weekly token allowance, effective rate
and reset price, plus the standard pay-as-you-go rate. Values come from `gateway/config/pricing.json`
(docs/pricing-v2.md); the console and the app render this list, never their own copy of the prices. Each plan
also carries its founding-round seats (`seats_total`, `seats_taken`, `seats_left`, `available`); the same list
without a session is `listPublicPlans`.

Authentication: Console session cookie (`__Host-dex_session`), or an app session token (`Authorization: Bearer dex_ses_...`). With the cookie, state-changing routes also need the `x-dex-csrf` header.

## Responses

### 200

The plans, cheapest first.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | (always "list") |
| `standard_unit_price_micro_cents` | integer | yes | The pay-as-you-go rate per token, used without a plan and beyond the weekly allowance (100 is EUR 1.00 per million). |
| `data` | array of Plan | yes |  |
| `data[].id` | PlanId | yes | A subscription plan (docs/pricing-v2.md). New plans may appear within v1. (one of "base", "hot", "fierce") |
| `data[].object` | string | yes | (always "plan") |
| `data[].name` | string | yes | Display name (Base, Hot, Fierce). |
| `data[].price_cents` | integer | yes | Monthly price in euro cents, excluding VAT. |
| `data[].currency` | string | yes | (always "EUR") |
| `data[].interval` | string | yes | (always "month") |
| `data[].included_multiple` | integer | yes | The plan includes usage worth this multiple of its price at the standard rate. |
| `data[].week_allowance_tokens` | integer | yes | Input tokens included per 7-day week; unused tokens do not roll over. (format int64) |
| `data[].effective_unit_price_micro_cents` | integer | yes | The plan price divided by its monthly included tokens, in micro-cents per token (50 is EUR 0.50 per million). |
| `data[].reset_price_cents` | integer | yes | Price excluding VAT of refilling the current week's allowance at once (25% of the monthly price). |
| `data[].seats_total` | integer \| null | yes | Founding round. How many accounts can hold this plan at the same time; null when the plan has no seat limit. (at least 0) |
| `data[].seats_taken` | integer | yes | Seats in use: accounts with an active, past_due or incomplete subscription on the plan (a scheduled downgrade also holds its seat on the cheaper plan), plus seats held for an open plan checkout (up to an hour) and for waiting-list invitations (72 hours). One per account. A cancelled or ended subscription frees its seat; an upgrade moves it to the new plan.  (at least 0) |
| `data[].seats_left` | integer \| null | yes | `seats_total` minus `seats_taken`, never below 0; null when the plan has no seat limit. (at least 0) |
| `data[].available` | boolean | yes | Whether a new subscription to the plan can start now. When false, `createSubscriptionCheckout` answers 409 `plan_sold_out`; join the waiting list with `joinWaitingList`. |
| `data[].prices` | object | yes | The plan's price and reset price in every checkout currency (owner decision 28 Sep 2026, "Region-based checkout"), excluding VAT, in the currency's minor unit (cents, pence, paise: INR 990 is 99000). EUR repeats `price_cents` and `reset_price_cents`. Stripe charges one of these, chosen from the buyer's location or fixed by the account's `billing_currency`; the plan, the weekly allowance and resets are the same in every currency. New currencies may appear within v1.  |
| `data[].prices.EUR` | PlanPrice | yes |  |
| `data[].prices.EUR.price_cents` | integer | yes | Monthly price excluding VAT, in the currency's minor unit. (at least 1) |
| `data[].prices.EUR.reset_price_cents` | integer | yes | Price excluding VAT of a weekly allowance reset (25%, rounded), in the currency's minor unit. (at least 1) |
| `data[].prices.USD` | PlanPrice | yes |  |
| `data[].prices.USD.price_cents` | integer | yes | Monthly price excluding VAT, in the currency's minor unit. (at least 1) |
| `data[].prices.USD.reset_price_cents` | integer | yes | Price excluding VAT of a weekly allowance reset (25%, rounded), in the currency's minor unit. (at least 1) |
| `data[].prices.GBP` | PlanPrice | yes |  |
| `data[].prices.GBP.price_cents` | integer | yes | Monthly price excluding VAT, in the currency's minor unit. (at least 1) |
| `data[].prices.GBP.reset_price_cents` | integer | yes | Price excluding VAT of a weekly allowance reset (25%, rounded), in the currency's minor unit. (at least 1) |
| `data[].prices.INR` | PlanPrice | yes |  |
| `data[].prices.INR.price_cents` | integer | yes | Monthly price excluding VAT, in the currency's minor unit. (at least 1) |
| `data[].prices.INR.reset_price_cents` | integer | yes | Price excluding VAT of a weekly allowance reset (25%, rounded), in the currency's minor unit. (at least 1) |
| `data[].prices.<key>` | PlanPrice | no |  |
| `data[].prices.<key>.price_cents` | integer | yes | Monthly price excluding VAT, in the currency's minor unit. (at least 1) |
| `data[].prices.<key>.reset_price_cents` | integer | yes | Price excluding VAT of a weekly allowance reset (25%, rounded), in the currency's minor unit. (at least 1) |
| `currencies` | array of string | yes | The checkout currencies, EUR first (the reference: the balance, the ledger and usage are in EUR). The regions: India INR, the United Kingdom GBP, the EU, EEA and Switzerland EUR, everyone else USD. New currencies may appear within v1.  (each item: one of "EUR", "USD", "GBP", "INR") |
| `top_up_packs` | array of TopUpPack | yes | Prepaid top-up packs, smallest first: each credits its EUR value and is sold at a rounded regional price. Buy one with `createCheckoutSession` and `amount_cents` = `credit_cents`. Accounts billed in EUR (or not yet fixed) can also top up any EUR amount from EUR 10.  |
| `top_up_packs[].credit_cents` | integer | yes | The EUR credit the balance gets, in euro cents (1000 is EUR 10), whatever the currency paid. |
| `top_up_packs[].prices` | object | yes | The pack's price excluding VAT per checkout currency, in the currency's minor unit (INR 990 is 99000). New currencies may appear within v1. (values: integer) |
| `top_up_packs[].prices.EUR` | integer | yes |  |
| `top_up_packs[].prices.USD` | integer | yes |  |
| `top_up_packs[].prices.GBP` | integer | yes |  |
| `top_up_packs[].prices.INR` | integer | yes |  |
| `top_up_packs[].prices.<key>` | integer | no |  |

### 401

Missing, unknown, revoked or expired credentials.

### 403

The credentials are valid but not allowed to do this (missing scope, suspended account or failed CSRF check).

### 500

An unexpected error. Any charge was refunded. Retry with the same idempotency key.

### 503

`maintenance`: the console's database, sign-in or payments are unavailable for a moment (for
`createGoogleSession` also: Google sign-in is not configured, or Google's signing keys cannot be fetched).
Retry after `retry-after`. Nothing was changed.


## Examples

Illustrative values. Examples show the shape of requests and responses; the numbers in them are not measured results.

Response: The three plans with their regional prices, the founding-round seats, the standard rate and the top-up packs (docs/pricing-v3.md)

```json
{
  "object": "list",
  "standard_unit_price_micro_cents": 100,
  "data": [
    {
      "id": "base",
      "object": "plan",
      "name": "Base",
      "price_cents": 999,
      "currency": "EUR",
      "interval": "month",
      "included_multiple": 2,
      "week_allowance_tokens": 4611000,
      "effective_unit_price_micro_cents": 50,
      "reset_price_cents": 250,
      "seats_total": 200,
      "seats_taken": 37,
      "seats_left": 163,
      "available": true,
      "prices": {
        "EUR": {
          "price_cents": 999,
          "reset_price_cents": 250
        },
        "USD": {
          "price_cents": 1199,
          "reset_price_cents": 299
        },
        "GBP": {
          "price_cents": 899,
          "reset_price_cents": 229
        },
        "INR": {
          "price_cents": 99000,
          "reset_price_cents": 24900
        }
      }
    },
    {
      "id": "hot",
      "object": "plan",
      "name": "Hot",
      "price_cents": 2400,
      "currency": "EUR",
      "interval": "month",
      "included_multiple": 5,
      "week_allowance_tokens": 27692000,
      "effective_unit_price_micro_cents": 20,
      "reset_price_cents": 600,
      "seats_total": 100,
      "seats_taken": 100,
      "seats_left": 0,
      "available": false,
      "prices": {
        "EUR": {
          "price_cents": 2400,
          "reset_price_cents": 600
        },
        "USD": {
          "price_cents": 2799,
          "reset_price_cents": 699
        },
        "GBP": {
          "price_cents": 2099,
          "reset_price_cents": 529
        },
        "INR": {
          "price_cents": 239000,
          "reset_price_cents": 59900
        }
      }
    },
    {
      "id": "fierce",
      "object": "plan",
      "name": "Fierce",
      "price_cents": 3900,
      "currency": "EUR",
      "interval": "month",
      "included_multiple": 11,
      "week_allowance_tokens": 99000000,
      "effective_unit_price_micro_cents": 9,
      "reset_price_cents": 975,
      "seats_total": 20,
      "seats_taken": 1,
      "seats_left": 19,
      "available": true,
      "prices": {
        "EUR": {
          "price_cents": 3900,
          "reset_price_cents": 975
        },
        "USD": {
          "price_cents": 4599,
          "reset_price_cents": 1149
        },
        "GBP": {
          "price_cents": 3399,
          "reset_price_cents": 849
        },
        "INR": {
          "price_cents": 389000,
          "reset_price_cents": 97900
        }
      }
    }
  ],
  "currencies": [
    "EUR",
    "USD",
    "GBP",
    "INR"
  ],
  "top_up_packs": [
    {
      "credit_cents": 1000,
      "prices": {
        "EUR": 1000,
        "USD": 1199,
        "GBP": 899,
        "INR": 99000
      }
    },
    {
      "credit_cents": 2500,
      "prices": {
        "EUR": 2500,
        "USD": 2899,
        "GBP": 2199,
        "INR": 249000
      }
    },
    {
      "credit_cents": 5000,
      "prices": {
        "EUR": 5000,
        "USD": 5799,
        "GBP": 4399,
        "INR": 495000
      }
    },
    {
      "credit_cents": 10000,
      "prices": {
        "EUR": 10000,
        "USD": 11499,
        "GBP": 8699,
        "INR": 990000
      }
    }
  ]
}
```
