
Usage & billing: the plan, the two windows, and the wallet behind them
plan and subscription objects also carry their ids, the Stripe
price ids and timestamps.
GET /v1/billing/balance returns the quota object on its own, if that is all
you want.
What a window measures
Every call the platform pays for on your behalf — a model generating tokens, a tool doing work — is priced when it finishes and written to a ledger as one row. The window is the sum of those rows inside it, as a percentage of the cap your plan sets. Two consequences worth knowing:- The unit is money, not messages. A long turn on an expensive model moves the bar further than a short one on a cheap model. There is no message count to budget against.
- A call on your own key does not count. A model reached through a connection you added is paid by you to your provider. It is recorded for the usage graphs and nothing else — no ledger row, no window.
The windows are fixed, not sliding
A window is not a trailing sum over the last five hours. The first call opens a window, that window ends exactly five hours later, and at that moment the whole allowance comes back at once. Inside a window the percentage only ever climbs.resets_at is that moment, and it means exactly one thing everywhere it
appears: when used_percent next goes down. resets_in_seconds is the same
wait as a countdown, computed on the server’s clock — the app never subtracts
timestamps itself, which is why the reset line agrees with the refusal that
produced it.
When a window is not open at all — nothing has been spent since the last one
ended — the reset fields are absent. Nothing is being held against you, and the
honest line is no line.
Reading a row
Each row is one window: its name, how full it is, the bar, and when it frees up.
The refresh control at the right of Usage limits re-reads
/v1/subscriptions/me rather than waiting for the next poll.
The three statuses
used_percent is not clamped on the wire. Admission does not reserve an
estimate against the cap, so you get the whole cap and the last admitted call
can carry you slightly past it: 103.4 is a real value and means the window
went 3.4% over. The screen caps the display at 100% — a person is never shown
more than a full window — but a client reading the API sees the overshoot.
mode: what would fund the next call
string
plan — neither window is full.extra — the windows are full and the wallet can pay. See
Extra usage.blocked — the windows are full and there is nothing behind them. The next
call is refused.When it frees up
Wait forresets_at, and the whole window is yours again — there is no gradual
thaw. Two other things change the picture:
- Moving up a plan raises the cap immediately. What you have already spent is frozen in the ledger; the number it is measured against is the new plan’s, so a window that read 100% reads a fraction of that as soon as the subscription is active.
- Money in the wallet does not raise the cap, but it does pay for calls past
a full window, at list prices. That is what
mode: "extra"is.
When a window fills
The 429, the message in a chat, and what does not lift it.
Extra usage
The wallet, and when it is used instead of the plan.

