# Max Billing

**Max Billing** is the account's Max subscription: plan, seats, and capability licenses. A **seat** is what lets someone use Max at all. Add-ons sit on top of a seat as licenses:

- `MAX_MEETINGS` — Meeting Intelligence (the notetaker). See [Max Meetings](/docs/concepts/max/meetings).
- `MAX_EMAIL_AGENT` — inbox labeling, drafting, and follow-ups.


This is separate from [Studio Billing](/docs/concepts/admin/studio-billing) (account-level credits and agents).

Buying, resizing, or cancelling the subscription moves money and is **app-only**. The Public API reads what the account already pays for and lets an OWNER/ADMIN hand seats and licenses out. Requires a USER API key belonging to an OWNER or ADMIN.

## Assignments

`GET /billing/max/seats/matrix` is the read side: one row per account user with their seat and each capability license, plus purchased-versus-assigned pool counters.

`PUT /billing/max/assignments` is declarative:

- `seatUserIds` is the **complete** set of seat holders — any user left out loses their seat.
- Inside `licenses`, an omitted capability is left untouched; an explicit empty array revokes it for everyone.
- A license cannot be given to a user without a seat.
- You cannot assign more seats or licenses than purchased.


The CLI wrappers (`seats assign` / `unassign`, `licenses grant` / `revoke`) update one user at a time against that same matrix.

On the free trial every field on usage is `null` except `limits`.

## Operations

| Verb | Path | Purpose |
|  --- | --- | --- |
| `GET` | `/public/v1/billing/max/usage` | Plan, seats, add-on pools, limits, scheduled change |
| `GET` | `/public/v1/billing/max/plans` | Plans that can be bought, with their prices |
| `GET` | `/public/v1/billing/max/catalog` | Plans, capability add-ons and additional credit bags |
| `GET` | `/public/v1/billing/max/seats/matrix` | Per-user seat + license grid |
| `PUT` | `/public/v1/billing/max/assignments` | Set the complete assignment |


Every plan and add-on lists its `prices`, each with its `interval`, Stripe `amount` and `currency`, and an `internalKey` — the price key used for pricing. Legacy prices only appear to accounts already paying for them. Purchasing still happens in the app.

Full list in the **[API Reference](/reference/openapi)** under the `Billing` tag.

## CLI

```bash
frontline billing max usage --pretty
frontline billing max plans --table
frontline billing max catalog --table
frontline billing max seats matrix --table
frontline billing max seats assign <userId>
frontline billing max licenses grant MAX_MEETINGS <userId>
```

Resolve user IDs with `frontline users list`.