n8vDocs

Quota

How n8v reads your Claude, OpenAI and Grok subscription quota, shows it on the Quota page, and lets you or an assistant switch accounts, layer by layer

When you connect more than one subscription, three questions come up: how much is left on each, which one your chats are using, and what happens when one runs out. Quota answers all three in one place. It shows every subscription's allowance and resets, lets you make another one the active account, lets chosen accounts take over by themselves when a limit is hit, and keeps a trail of everything that happened.

The same data and the same controls are available in the web app, the iOS app, the REST API and MCP.

The Quota page appears in the sidebar when it is on for your account. Switching accounts and auto-switch have their own switches; see Feature flags for what each one turns on.

  1. 1

    Readings

    Each provider reports use per window: 5 hours, a week, and a model family's own. n8v keeps one reading per subscription and treats an old one as updating.

  2. 2

    Rules

    One set of rules, in one place, decides health, the headroom ranking, the models each account serves and what a switch does to your chats.

  3. 3

    Controls

    Three changes: which account is active, which accounts may take over at a limit, and which model new chats start on.

  4. 4

    Surfaces

    The Quota page, the iOS app, the REST API and MCP read the same rules and call the same controls.

  5. 5

    Record

    Every change and every limit n8v sees is written to your activity log, with where it happened.

Five layers. Readings feed the rules, the rules feed the controls and the surfaces, and everything that changes is recorded.

What providers tell n8v

  • Claude usage

    5-hour, weekly and model windows

  • ChatGPT usage

    5-hour and weekly windows

  • Grok billing

    credits and usage

  • Limit messages

    from your own chats, when a provider refuses a turn

Inside n8v

  • Readings

    cached per subscription, refreshed on request

  • Rules

    health, headroom ranking, models, switch impact

  • Controls

    switch, auto-switch, default model: one write path

  • Record

    activity log, kept 90 days

Where you see and steer it

  • Quota page

    web, with labels as you named them

  • iOS app

    native API, bearer token

  • REST API

    API key, private labels

  • MCP

    assistants, private labels

Numbers flow left to right. Writes from every surface return through the same controls and land in the same record, so the page, the app, the API and an assistant never disagree.

Plan ahead

Planning is being rolled out per account with quotaPlanning, off by default. It also requires the existing quota permissions. Administrators can enable it at /internal/admin/feature-flags.

The web Quota page adds a Plan section for each provider. It shows billing renewal, recent pace, and allowance likely to go unused before its reported reset. Amber highlights at least 25% remaining or projected unused within 72 hours on a window longer than a day. Hover or tap for the exact date and calculation.

Use Set renewal date for a subscription whose provider gives no date. Enter any one billing date and choose weekly, monthly or yearly. n8v repeats that date, keeping the original day and using the last day of shorter months. You can edit or clear an entered date.

Billing renewal and quota reset are separate. A weekly allowance can reset on a different day from your payment. n8v uses the provider's reset time for expiry; entering a billing date never invents a quota reset. Claude documents independent weekly reset times, and OpenAI explains that quota resets can change without changing billing dates.

ProviderRenewal evidence available to n8v
ClaudeThe usage endpoint reports quota resets. Its profile has a subscription creation date, which is not a current renewal date. Enter billing renewal yourself.
OpenAIThe Codex usage endpoint reports quota resets. If a stored ID token includes paid-period start/end claims, n8v reads them; many tokens omit these. Otherwise enter billing renewal yourself. An expired claim is not rolled forward.
GrokThe billing response can include currentPeriod.start/end or billingPeriodStart/End and billingCycle. Missing dates remain unknown.

Pace comes from n8v's stored provider readings, measured in percentage points per hour. The response includes 24-hour and 7-day lookbacks with the hours actually observed. These readings can include usage outside n8v. There is no historical backfill: rates need at least two readings an hour apart. A lookback needs three observed hours before it drives a forecast; otherwise n8v uses the current window's average, when its start can be established. A gap across a reset is marked as a lower bound and does not drive a forecast.

A forecast is an estimate at unchanged pace. When pace is unknown, the plan reports today's remaining allowance with basis: remaining, not a predicted loss. Missing quota stays unknown. Readings older than three minutes never qualify as confirmed room.

Ask an assistant

subscriptions stays the compact current view. quota_plan returns the forward view, with private numbered labels, room now, expiring allowance, blocks and ranked model/account choices. Pass intent (coding, creative, video or general) for one ranking, or omit it for all four. Provider refreshes have an eight-second budget; a slow provider falls back to a dated cached reading.

For example, with fresh readings showing 100% of an OpenAI week unused and a reset in two days:

ChatGPT/Codex #2 has 100% left. At the observed pace, about 100% would go unused at the weekly reset in two days. It has room for a new coding task. Switch to this subscription first if it is not active.

With limits per model on, both tools also return usageWindows per subscription, every window with its scope (shared, or one model family), and quota_plan adds families: per Claude model, which subscription has what left, which window that number is from, and what blocks. A subscription's own "left" percentage (headroomPct) is a shared window; a recommendation for a model also counts a window the provider reports for that model.

If only the billing date is known, the answer names that renewal and says quota expiry is unknown. Model recommendations account for shared and model-family limits. Without measured capability data, they use your default and the model picker's order; they do not claim an intent-specific benchmark ranking.

set_renewal records a billing date, for example {"subscription":"Claude #2","renews_at":"2026-11-14","period":"month"}. Dates without a time use midnight UTC. Pass renews_at: null to clear it. The equivalent API routes are documented under Quota planning.

Planning is available on the web, REST and MCP. The native iOS quota contract is unchanged.

Forecast and purchase advice

The forecast is rolled out per account with quotaForecast, off by default, on top of quotaPlanning. It adds a Forecast section to the top of the Quota page, a forecast field to quota_plan, and a plan picker per subscription in Settings, Agent.

The Forecast section: pace and run-dry point per provider, the share of capacity in use, and two purchase options

  • Plan per subscription. Each subscription's plan comes from the provider (Claude's organization and rate-limit tier, ChatGPT's plan, Grok's tier) or from your choice in Settings, Agent; yours wins. A plan from n8v's plan catalog carries its price, its weekly capacity in units of the provider's base paid plan (Claude Pro, ChatGPT Plus, Google AI Pro, SuperGrok = 1), how much of it may run on Fable, and a source with the date it was read. A limit the provider does not publish stays unknown: such a subscription is named under Capacity unknown and left out of every number, never filled in.
  • Pace. Per subscription and per provider, a line through n8v's own readings over the last 7 and 30 days (readings are kept 35 days). Hours while every subscription of a provider sat at its limit are left out, so the pace is the pace while room was left. A provider at its limit throughout is named as short by an amount not yet measurable. Exponential growth is used only once five covered days show a significant trend, and a weekly pattern only once fourteen covered days include every weekday twice; until then the assumptions say why not.
  • Runs dry. Hour by hour over 30 days at the forecast pace, each window refilling at its own reset and use drawing from the window that resets soonest. Each provider shows when it first has no room, how many hours a week it would go without, and a range: the same simulation at the low and high end of the pace (two standard errors of the fit, never narrower than the margin either side). The chart shows the share of all capacity in use, weighted by plan price: readings solid, the pace ahead dashed.
  • Purchase advice. How many extra subscriptions of which plan keep the 7-day or 30-day pace with a safety margin (20% by default), at what monthly cost. Cheapest is the lowest-cost mix of buyable plans per provider. Most Fable-heavy runs every missing unit on Fable and moves other providers' shortfall to Fable at equal spend, since n8v cannot measure an exchange rate between providers. Units of different providers are never added together.

The advice is information only: nothing on this page buys, upgrades or switches anything. The i button lists every assumption behind the numbers. Ask an assistant with quota_plan and an optional margin in percent, for example {"margin": 30}; the answer ends with the forecast in a few plain lines. Choosing a plan is recorded in the activity trail as limit.plan_set.

How it works, layer by layer

1. Readings

n8v asks each provider how much of a subscription is used, and keeps the answer as a reading.

ProviderWhat the reading holds
ClaudeA 5-hour window, a weekly window every model shares, and weekly windows for a model family such as Opus or Sonnet
OpenAI (Codex)A 5-hour window and a weekly window, plus a family window for some models, such as Spark
GrokThe usage the provider reports; shown on the page, but a Grok subscription cannot take part in auto-switch
API keysNothing. Keys and compatible providers bill per request and have no subscription limits; they are listed under Usage based

How fresh a reading is:

  • The account you are using is read at most once a minute. An account you are not using is read at most every 15 minutes, because it only changes when it is used elsewhere.
  • The page asks again every minute and when you return to the tab. Refresh reads every subscription again, at most once every 30 seconds per account.
  • A reading older than 3 minutes is shown as Updating. It is never treated as proof that an account has room, and it ranks behind every account with a fresh reading.
  • A window whose reset time has passed shows 0% and reads "reset, refreshing" until the provider's next reading confirms it.

A second source outranks the readings: limit messages. When a chat runs into a provider's usage limit, n8v remembers that account as limited until the reset the provider named. When the provider named none, n8v holds the account for an hour and then lets it be tried again; otherwise the hold lasts from one minute to eight days. A limit message is ground truth, so it wins over a reading that may be a minute old.

2. Rules

One set of rules decides the following, and the page, the apps, the API and MCP all read it. A change to a rule changes it everywhere at once.

  • Health. One verdict per account: Available, Limit reached, Updating, Needs re-login or Not reported.
  • Headroom. What is left on the account's hottest window: 100 minus the highest use among the windows that apply. The page ranks without a model, so only the windows every model shares count. When n8v picks a replacement for a chat, it ranks for that chat's model, so a model's own family window counts too.
  • Ranking. Accounts with a known, fresh headroom come first, most headroom first. Then accounts with a known but old reading. Then accounts whose headroom is unknown. Exact ties are broken the same way every time: the account in use first, then by name.
  • Models served. The models of the provider that your account may use and that need no extra sign-in. Effort variants share their base model's limits, so the list shows the base model. The window that limits a model on an account is the hottest of the shared windows and the model's own family window.
  • Combined total. With two or more reporting subscriptions, the provider header adds one total, weighted by plan size as the provider publishes it. A plan n8v does not know counts every subscription the same, and the tooltip says so.
ProviderPlan weights
ClaudePro 1x, Max 5x counts 5x, Max 20x counts 20x
OpenAIPlus 1x, Pro Lite 5x, Pro 20x

3. Controls

There are three changes, and each has one implementation behind every surface.

ChangeWhat it doesWhen it applies
Active accountMakes one subscription the account every chat of its provider usesEach chat's next message
Auto-switchLets a subscription take over by itself when another of its provider hits a limitAt the next limit
Default modelSets the model new chats start onNew chats; running chats keep their own model

4. Surfaces

SurfaceReadsChangesNames accounts asAccess
Web appThe Quota pageAll threeThe account's own name, as the app always didYour sign-in
iOS appThe same, through the native APIAll threeThe account's own nameYour sign-in
REST APIGET /api/v1/subscriptionsAll threeA private label such as Claude #2An API key, scopes chats:read and chats:message
MCPThe subscriptions toolAll threeA private label such as Claude #2The same key and scopes

5. The record

Every change and every limit n8v sees is written to your activity log, with where it happened. The activity trail lists what is recorded.

The Quota page

  1. 1Provider header. The provider, how many subscriptions, how many chats a switch would touch (running, waiting on a limit), and one combined total across all of them, weighted by plan size.
  2. 2Name and health dot. The account's name as you know it, its plan, and one dot for its health: green, amber, red or grey.
  3. 3Badges. Active marks the account your chats use. Best marks the one with the most headroom when it is not already in use. A health pill appears when the account is not available.
  4. 4Meters. The 5-hour session and the shared weekly window: use so far, a bar with a tick at your warning level, and a countdown to the reset. Any other window above your warning level shows as a chip.
  5. 5Auto-switch. Opt this subscription in or out of taking over when another one hits a limit. Next #n is its place in line.
  6. 6Use. Make this the active account. It is disabled while the account is at a limit and hidden while it needs a new sign-in.
  7. 7Details. Every window with its reset, every model with the window that limits it and a Make default button, the health verdict, the plan's weight in the combined total and the account's recent events.
  8. 8Default model. The model new chats start on, shown on the provider that serves it. Account-wide, not per provider.
  9. 9Fallback line. Who takes over, in order, when the active account hits a limit, and who is held out until a reset.
  10. 10Recent activity. Limits hit, switches and settings changes, from every surface, with where each was done.
The Quota page for three Claude subscriptions, with the second row's details open. The numbers match the list below.

A few details the schematic leaves out:

  • Order. Subscriptions are ranked as in Rules: the account with the most headroom first.
  • Warning level. Meters turn amber at your warning level, 75% unless you changed it in Settings, and red at 100%. The tick on each bar marks the level.
  • A hidden window. A window other than the two shown, above your warning level, appears as a chip on the row so it never hides behind the fold.
  • Windows by scope. With limits per model on, a subscription's details list every window with its scope: Shared windows count every model, and each Claude model has a row that says whether n8v has seen its own limit reached. Claude reports no usage per model for these accounts, so a model's row never shows a made-up percentage.
The details of Claude #8 on the Quota page: two shared windows with what is left, a Fable row that says limit reached and when n8v asks again, and Opus, Sonnet and Haiku rows that say no limit was seen.
  • Usage based. API keys and compatible providers appear at the bottom as Active or Inactive. They have no limits to show.
  • Without a control. With switching off, rows have no Use button. With auto-switch off, they have no toggle and the provider has no fallback line. With the default model off, the provider has no model picker.
  • Nothing connected. The page offers Connect a subscription, or Add an API key when subscription sign-in is off for your account.

Switch the active subscription

  1. 1

    Press Use

    YouPage

    With chats running or waiting on a limit, a confirmation first says what happens to them. With none, the switch happens at once.

  2. 2

    Update optimistically

    PagePage

    The row shows Active before the server answers. If the server refuses, the page puts everything back.

  3. 3

    Ask the server

    PageServer

    It checks that the switcher is on for your account and that the account is one of your own subscriptions.

  4. 4

    Write under a lock

    ServerDatabase

    In one transaction it locks the provider's credential rows in a fixed order, clears the others and sets this one. Two switches at once queue, so exactly one account is active.

  5. 5

    Record it

    ServerActivity log

    After it answers, the server writes a limit.activate row with the old account, the new one and where it was done. It never delays or fails the switch.

  6. 6

    Answer with the old account

    ServerPage

    A toast says Claude now uses the account, with Undo. Undo is another switch back, recorded as its own event. Your other open apps update at once.

  7. 7

    Chats pick it up

    PageYour chats

    Each chat uses the new account from its next message. A chat in the middle of a turn finishes it on the old one.

The same write path serves the page, the iOS app, the API and MCP. Only the first two steps belong to the web page.

Switching is account-wide per provider: every chat of that provider uses the new account from its next message. What happens to chats already in flight:

A chat that isWhat happens
In the middle of a turnFinishes the turn on the old account, and uses the new one from its next message
IdleUses the new account the next time you send a message
Waiting on a limitContinues when you next message it or retry it. n8v's own scheduled retry at the reset also runs
Started after the switchUses the new account

The page counts the first and third rows before you confirm: "2 running, 1 waiting on a limit". With none in flight, the switch applies at once; with some, a confirmation says what happens first. Either way Undo puts the previous account back, when there was one.

The page disables Use for an account at its limit and hides it for one that needs a new sign-in. The API and MCP do not apply that rule: they switch to any of your own subscriptions. Read the account's health first.

Health states

Every account has exactly one of five states. The same words appear on the page, in the iOS app, and in the health field of the API and MCP.

  1. 1

    Did the provider reject the sign-in?

    Needs re-login

  2. 2

    Does the provider report no limits for it?

    Not reported

  3. 3

    Is a limit message in force, or does a fresh reading show 100%?

    Limit reached

  4. 4

    Is the last reading older than 3 minutes?

    Updating

  5. 5

    None of the above

    Available

The first check that says yes decides. A rejected sign-in beats everything, and a limit message from the provider beats a reading that may be a minute old.
State and labelDotCaused byWhat to do
ok, AvailableGreenNo limit message in force, no fresh reading at 100%, and a reading under 3 minutes oldNothing
limited, Limit reachedRedA limit message from the provider is in force, or a fresh reading shows a shared window at 100%. The detail reads "Resets in 2h 14m", or "Reset time not reported"Wait for the reset, or use another account. Use is disabled until then
stale, UpdatingAmberThe last reading is older than 3 minutes. The page keeps showing it, dimmedNothing, or Refresh. An account you are not using is read less often, so it can show this between readings
relogin, Needs re-loginRedThe provider rejected or revoked the sign-inSign in again in Settings, Agent. With subscription sign-in off, use an API key. Use is hidden
unavailable, Not reportedGreyThe provider reports no limits for the account right now, so n8v cannot say how much is leftTry Refresh. The account may still work; it ranks last

Two rules worth knowing:

  • An old reading is never Limit reached on its own. Only a limit message from the provider can mark an account limited while its reading is old.
  • A limit message with no reset time marks the account limited until it is tried again, about an hour. The page then says "Reset time not reported".

Auto-switch

With auto-switch, a subscription you opted in can take over when another of its provider hits a limit, so a chat continues instead of waiting for a reset.

  • Who can opt in. Claude and OpenAI subscriptions. Grok subscriptions and API keys cannot.
  • When it moves. Only when the account the chat was running on is itself opted in, and only to another opted-in account of the same provider. It never moves to an account that did not opt in. If you or another chat already moved the provider on, a chat follows an opted-in choice and otherwise stays: it never overrides a manual switch.
  • Who is tried, in what order. Opted-in accounts ranked by headroom for the chat's model, as in Rules.
  • Who is held out. An account with a limit message in force, one whose fresh reading is at 100% (until that window resets), and one that needs a new sign-in. A limited account is never switched to again before its reset, so the chat cannot loop.
  • What the chat shows. A note, "Claude limit reached on Claude #1. Continuing on Claude #2.", and a queued Continue message.
  • If nobody has room. Nothing moves. The chat waits on a limit until the earliest reset known across the opted-in accounts and the limit that was hit, and is retried then. If that retry meets a limit again, the same rules run again.

A worked example with three Claude subscriptions, all opted in:

  1. 14:00Everything has room

    • Claude #1Max 20x62% / 40%ActiveHeadroom 38
    • Claude #2Max 5x10% / 30%Best, next #1, headroom 70
    • Claude #3Pro80% / 20%Next #2, headroom 20

    If a limit is hit: #1, then #2, then #3. The order is most headroom first, where headroom is 100 minus the hottest window.

  2. 14:20A chat on Claude #1 meets its limit, resetting at 16:40

    • Claude #1Max 20x100% / 40%Held outHeld out until 16:40
    • Claude #2Max 5x15% / 31%ActiveHeadroom 69
    • Claude #3Pro80% / 20%Next #1, headroom 20

    n8v remembers the limit until 16:40, picks the opted-in account with the most headroom (#2), makes it active, notes it in the chat and sends Continue.

  3. 15:10Claude #2 meets its limit, resetting at 19:30

    • Claude #1Max 20x100% / 40%Held outHeld out until 16:40
    • Claude #2Max 5x100% / 36%Held outHeld out until 19:30
    • Claude #3Pro80% / 20%ActiveHeadroom 20

    #1 is held out, so #3 is the only account with room. The chat continues there.

  4. 15:50Claude #3 meets its limit, resetting at 20:15

    • Claude #1Max 20x100% / 40%Held outHeld out until 16:40
    • Claude #2Max 5x100% / 36%Held outHeld out until 19:30
    • Claude #3Pro100% / 24%Held outHeld out until 20:15

    Nobody has room, so nothing moves. The chat waits on a limit until the earliest reset, 16:40, and is retried then. The page says so: no other opted-in subscription has room, chats wait for the first reset.

Three Claude subscriptions, all opted in. Use is shown as 5-hour / weekly. Names are the private labels REST and MCP use; the page shows each account's own name.

The fallback line under each provider shows the order as it would run right now, and Held out until reset names the accounts it skips. Opt an account in or out with the toggle on its row, or with the API and MCP calls below.

A Claude task run by an organization is handled by the organization: it moves within the organization's own subscriptions, or ends so the organization can continue it. It never changes your active account.

At a limit

Being rolled out per account with limitRecovery, off by default. It refines auto-switch and the cross-provider fallback; without them it changes nothing.

  • Your provider first. A chat that hits a limit moves to another opted-in subscription of the same provider that has room, whether or not the one it ran on was opted in. If you made another account active meanwhile, the chat follows it.
  • Never an account you did not opt in. If the only subscription with room has auto-switch off, the chat says so ("Claude #6 has room, but auto-switch is off for it") and the Quota page shows it with Turn on auto-switch. n8v does not take it for you.
  • A fallback only where there is room. Before a chat continues on another provider, n8v reads that provider's quota. A subscription at its limit is not a target.
  • A wait, not an error. With nowhere to go, the chat waits for the first reset any subscription named, or one hour when none did, and continues by itself.
  • Home as soon as there is room. A chat on a fallback returns to its own model at its next turn once its provider has room, and a waiting chat continues at once when you switch or opt in a subscription.
  • A new subscription takes over by default. A Claude or OpenAI subscription you connect has auto-switch on from the start, and chats waiting on that provider continue on it at once: as many as your account runs at a time, the rest as turns end. Turn auto-switch off for it on the Quota page if it should not take over.
  • A waiting chat follows the room, not the account it ran on. Every ten minutes n8v checks the chats that wait at a limit. If a subscription of that provider has room, they continue on it; if none has, they wait for the first reset among your subscriptions, not for the reset of the account they last ran on.
  • Never a subscription you turned off. A turned-off subscription is not moved onto, not offered and not waited for. Turn it on again and chats waiting on that provider continue at once if it has room.
  • A pinned chat never moves. It waits for its own provider.
  • Only where the model runs. Before a chat continues on another subscription, n8v checks that the account can run the model: a ChatGPT sign-in's own model list, and any refusal the provider gave before. An account whose plan does not include the model is skipped. If a provider still refuses the model, the chat goes back to its own model, or waits for it; it does not end in an error.
  • The limit that binds. An account at a limit names the window that is full and when it resets. When the provider refuses without naming a reset and no window it reports is full, the page says so: the limit is on one model or on usage credits.
  • Before it happens. When the active subscription is projected to reach its limit within the hour and no opted-in subscription has room, the Quota page says so, with the subscription that could take over. This needs quotaPlanning as well.

Every move is in the activity trail. retry_chat with model continues a chat that stopped at a limit on the model you name.

Turn a subscription off

Turn off a subscription that keeps failing or should not be used, such as a free plan that cannot serve the model your chats run on, or a sign-in that keeps being refused. It stays connected and keeps its label, and you can turn it on again at any time.

  • Off means out of everything. A turned-off subscription is never the active account, never switched to by auto-switch or by the cross-provider fallback, never handed back to by your API key in reserve, and never given to an organization run. n8v does not read its quota, so it causes no "Not reported" or stale rows, and it is not counted in the plan or its advice.
  • Separate from auto-switch. Its auto-switch choice is kept for when you turn it on again. Turning on one that is already on changes nothing.
  • Turning off the active one. Its provider moves at once to the next subscription that is on, in the order you connected them. With none left, that provider's chats cannot run until you turn one on or choose another account in Settings, Agent. Your API key is never made active for you.
  • Chats on it. A turn already running finishes on it. The chat's next message runs on the provider's active account. A chat with a pinned model keeps its model and follows the account. An organization run that was given the subscription stops with a plain reason, and the organization goes on once another subscription has room.
  • Where. Open a subscription's details on this page and switch Use off, or switch it off on its row in Settings, Agent. Turned-off subscriptions are listed apart under Turned off, each with a switch to turn it on again, even when a provider has none left on. Assistants use set_subscription_enabled; REST uses POST /subscriptions/enabled.
  • What assistants see. subscriptions and quota_plan leave turned-off subscriptions out and name them in one line, disabled: ChatGPT/Codex #5, Claude #3. Pass include_disabled to list them in full, with status disabled. Switching to one answers 409 subscription_disabled until it is turned on.

Your own API key in reserve

With keyReserve on, an Anthropic API key you add under Settings, Agent waits behind your Claude subscriptions. When no subscription that may take over has room, the chat continues on the key, on the same model, instead of waiting for a reset or moving to another provider. The chat says so: "Claude limit reached on Claude #1. Continuing on your Anthropic API key."

  • Rule. In reserve (the default): used only while every subscription is at its limit, and handed back before a later turn once one has room. Always: every Claude chat runs on the key. Off: never picked. Turning the key on by hand sets Always; choosing a subscription by hand, or turning the key off, puts it back in reserve.
  • Cap. A monthly amount in US dollars, $100 until you set your own; empty is no cap. The month is the calendar month in UTC. At the cap the key is not picked, and a key in use hands the account back to a subscription. The cap is checked before each turn: a turn in flight finishes, so it can be passed by one turn.
  • What it costs. Every turn on the key is booked as the agent reported it. The key's row shows this month's total against the cap, and a chat shows what it spent on the key. A turn you stop sends no report and is not booked. Anthropic's invoice is what you pay.
  • What it does not touch. OpenAI keys, compatible providers, enterprise workspaces, and organization runs on a subscription of their own. An organization run on your active account is capped and booked like any other chat, and never moves to the key by itself. The key takes over from any subscription, with auto-switch on or off; it hands back only to the subscription it took over from or one opted in to auto-switch, and never to one that needs a new sign-in.

Default model

The default model is the model a new chat starts on. It is one setting for your account, not one per provider: the page marks it on the provider that serves it, and shows "Not set for" the others.

  • Set it from a provider's Default model menu, or with Make default next to a model in an account's details.
  • It accepts models of Claude, OpenAI and Grok that your account may use and that need no extra sign-in. See Model access.
  • It changes new chats only. A running chat keeps its model; change one chat with update_chat.

The activity trail

Changes and limits are recorded as they happen, wherever they happen.

  • Claude limit reached on Claude #1. Resets 2026-11-08T16:40:00.000Zn8v4m ago
  • Claude limit reached on Claude #1. Continued on Claude #2n8v4m ago
  • Claude moved from Claude #2 to Claude #3iOS1h ago
  • Auto-switch on for Claude #3Assistant2h ago
  • Default model set to Sonnet 5API3d ago
Events as REST and MCP name them. The page and the iOS app show the same rows with the accounts' own names.
EventRecorded whenWritten by
Limit reachedn8v sees a provider limit message on one of your accountsn8v
SwitchedAn account is made activeYou on the web or iOS, an API key, or an assistant
Switched automaticallyA limit led n8v to continue on another opted-in accountn8v
Auto-switch changedAn account is opted in or outYou, an API key, or an assistant
Default model changedThe default model is setYou, an API key, or an assistant
Turned off or onA subscription is turned off or onYou, an API key, or an assistant
  • Where it was done. Each row says: Web, iOS, Assistant (MCP), API or n8v.
  • One row per limit. A limit that many chats run into is recorded once, while the account's limit message is in force.
  • Names. The page and the iOS app name accounts as you do. REST and MCP use private labels.
  • Kept for 90 days. Failed calls are not shown. The page lists the latest 30, and an account's details list its own five most recent.
  • Same rows elsewhere. Changes made with an API key or in the iOS app also appear in Settings, API, Activity.

API, REST and MCP

Base URL https://n8v.online/api/v1. Reads need the chats:read scope, changes chats:message. Keys restricted to repositories are refused, because subscriptions belong to the whole account.

CallScopeBodyDoes
GET /subscriptionschats:readSubscriptions, blocked chats and a control summary
GET /subscriptions/eventschats:readlimit in the query, 1 to 100, 20 by defaultThe trail, newest first
POST /subscriptions/activechats:message{"subscription": "Claude #2"}Makes it the active account of its provider
POST /subscriptions/auto-switchchats:message{"subscription": "Claude #2", "enabled": true}Opts it in or out
POST /subscriptions/default-modelchats:message{"model": "sonnet-5"}Sets the default model
POST /subscriptions/enabledchats:message{"subscription": "Claude #3", "enabled": false}Turns it off or on
curl -sS https://n8v.online/api/v1/subscriptions \
  -H "Authorization: Bearer $N8V_API_KEY"

curl -sS -X POST https://n8v.online/api/v1/subscriptions/active \
  -H "Authorization: Bearer $N8V_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subscription": "Claude #2"}'

An excerpt of the read. Besides what Subscription quotas and alternatives lists, each subscription carries health, autoSwitch and models, and control carries the account-wide view:

{
  "subscriptions": [
    {
      "label": "Claude #2",
      "provider": "anthropic",
      "kind": "subscription",
      "selected": true,
      "status": "active",
      "availability": "available",
      "health": { "state": "ok", "label": "Available", "detail": null },
      "autoSwitch": { "eligible": true, "enabled": true, "rank": null },
      "models": [
        {
          "id": "sonnet-5",
          "usedPct": 48,
          "label": "Weekly",
          "resetsAt": "2026-11-13T06:00:00.000Z"
        }
      ]
    }
  ],
  "control": {
    "defaultModel": "sonnet-5",
    "providers": [
      {
        "provider": "anthropic",
        "models": [{ "id": "sonnet-5", "name": "Sonnet 5", "isDefault": true }],
        "impact": { "running": 2, "blocked": 1 },
        "fallback": ["Claude #1"],
        "waiting": [
          { "subscription": "Claude #3", "resetsAt": "2026-11-08T16:40:00.000Z" }
        ]
      }
    ]
  }
}

fallback is the order auto-switch would try opted-in accounts in, by label. waiting lists opted-in accounts held out until a reset. impact counts the chats a switch would touch. If the control view cannot be read, the quota fields still answer and health, autoSwitch and models are absent.

Answers to changes:

{ "subscription": "Claude #2", "active": true, "note": "Applies to all chats of this provider from their next message. A chat in the middle of a turn finishes it on the previous account." }
{ "subscription": "Claude #2", "auto_switch": true }
{ "default_model": "sonnet-5", "note": "New chats start on this model. Running chats keep theirs." }
{ "subscription": "Claude #1", "enabled": false, "active": "Claude #2", "note": "While off it is never used, switched or fallen back to, not read for quota and not counted in quota_plan. ..." }

active is the label of the account the provider uses after the change, or null when none is on.

StatusCodeMeaning
403subscriptions_disabledThe subscription overview is off for the account, in Settings, API
403switching_disabledSwitching subscriptions is off for the account
403auto_switch_disabledAuto-switch is off for the account
403subscription_enable_disabledTurning subscriptions off and on is not enabled for the account
409subscription_disabledThe subscription is turned off: turn it on before making it active
403repo_not_allowedThe key is limited to repositories
403forbidden_scopeThe key lacks the scope the call needs
404subscription_not_foundNo subscription has that label. Read subscriptions for the current ones
400invalid_requestA missing or malformed field, a subscription that cannot auto-switch (Grok, API keys), or a model the account cannot use

See Errors for the rest.

The tools take the same scopes as the REST calls and return the same answers as tool results.

ToolScopeDoes
subscriptionschats:readSubscriptions with quota windows, health, auto-switch and model limits, blocked chats and the fallback order
switch_subscriptionchats:messageMakes subscription the active account of its provider
set_auto_switchchats:messageOpts subscription in or out with enabled
set_default_modelchats:messageSets model, an id from list_models
subscription_eventschats:readThe trail, with an optional limit from 1 to 100
set_fallbackchats:messageCross-provider fallback: on, back, and the model claude, gpt and gemini chats continue on
set_subscription_enabledchats:messageTurns subscription off or on with enabled

A subscription is named by its private label, as subscriptions lists it. The change tools are idempotent and never destructive: asking for what is already true changes nothing.

The iOS app uses https://n8v.online/api/client/v1 with the app's own sign-in as a bearer token. Its contract is published as OpenAPI at /api/client/v1/openapi.json. Integrations should prefer REST or MCP, which are covered by API keys and scopes.

CallBodyNeeds
GET /limitsproviderQuotaUsage
POST /limits/active{"credentialId": "..."}providerQuotaUsage and subscriptionSwitcher
POST /limits/auto-switch{"credentialId": "...", "enabled": true}providerQuotaUsage and subscriptionAutoContinue
POST /limits/default-model{"model": "sonnet-5"}providerQuotaUsage
GET /limits/eventslimit in the query, 1 to 100, 20 by defaultproviderQuotaUsage

The three changes answer with the refreshed overview, so the app can redraw in one step.

FieldMeaning
controlsWhich of switch, autoSwitch and defaultModel the account has
defaultModelThe account-wide default
providers[].modelsModels the provider serves for the account, with isDefault
providers[].impactChats a switch would touch: running and blocked
providers[].waitingOpted-in accounts held out, with resetAt
accounts[].healthstate, label and detail
accounts[].limitedUntilThe reset a limit message named, or null
accounts[].autoSwitcheligible, enabled and rank (1 is tried first, null is not in the line)
accounts[].modelsThe window that limits each model: usedPct, label, resetsAt

A flag that is off answers 403, an account that is not yours 404, and a subscription that cannot auto-switch or a model the account cannot use 400.

Privacy

  • REST and MCP return no tokens, emails, credential ids, custom labels or provider URLs. Subscriptions are named by private labels, numbered per provider in the order they were connected: Claude #1, Claude #2, ChatGPT/Codex #1. API keys of the provider count in the numbering, and removing an earlier credential renumbers the later ones.
  • The web app and the iOS app show the account's name, as the app always has.
  • Every change, from every surface, is written to your activity log.

Feature flags

FlagDefaultTurns onWithout it
providerQuotaUsageOffThe Quota page and its sidebar entry, the native reads, model-aware chat warnings; and the default model on the web and iOSThe page redirects to the dashboard, and the native limits calls answer 403
subscriptionQuotaOnThe subscription overview, the trail and the default model over REST and MCP, and the base for every REST and MCP change; and the record of limits n8v seesREST and MCP answer subscriptions_disabled. Limit messages are tracked only for auto-switch
subscriptionSwitcherOffSwitching the active account, on the web, iOS, REST and MCP, and the switcher in chatsNo Use button; REST and MCP answer switching_disabled
subscriptionEnableOffTurning a subscription off or on: the switches on the Quota page and in Settings, Agent, REST and MCPNothing can be turned off; REST and MCP answer subscription_enable_disabled. One turned off earlier stays off and can always be turned on again
subscriptionAutoContinueOffAuto-switch: the toggles, the fallback line and the automatic switch itselfNo toggles, and a chat at a limit waits for its reset as before; REST and MCP answer auto_switch_disabled
limitRecoveryOffAt a limit: room on the same provider first, a fallback only onto room, a wait instead of an error, and the warnings on this pageA limit behaves as before: auto-switch between opted-in accounts, then the fallback or the wait
modelFamilyLimitsOffLimits per model: a limit on one Claude model holds out only that model on that subscription, with the rule for what its chats continue onA model's limit holds out the whole subscription for an hour
keyReserveOffYour own Anthropic API key as a metered reserve: the rule, the cap, booking of every turn on it, and the takeover at a limitA key is the active account when added, is not booked and has no cap
quotaForecastOffThe forecast and purchase advice: the Forecast section, forecast in quota_plan, and the plan per subscription in Settings, Agent. Needs quotaPlanningNo forecast, no plan picker; quota_plan answers as before
subscriptionSignInOffAdding a Claude or ChatGPT subscription, and signing in againSubscriptions already connected keep working: read, ranked and switched as usual. The page offers API keys instead of Sign in again

subscriptionSignIn only decides whether a subscription can be added or signed in again. It does not hide, disable or change a subscription that is already connected.

Questions

Why does a chat I just switched still use the old account? It was in the middle of a turn. It finishes that turn on the old account and uses the new one from its next message.

Does switching change a chat's model? No. Switching changes the account, not the model. The default model only applies to new chats.

Why does an account show Updating? Its last reading is older than 3 minutes. An account you are not using is read at most every 15 minutes, so it can show this between readings. Refresh reads it again.

Why is no account marked Best? Best marks the freshly read account with the most headroom, and only when it is not already the active one. With only old readings, or when the active account already tops the list, nothing is marked.

Why did a chat wait for a reset when another subscription had room? That subscription is not opted in, the account the chat ran on is not opted in, or the other account is held out by its own limit.

Can an assistant switch my account? Yes, with a key that has the chats:message scope, through switch_subscription. It can only name your own subscriptions by label, and the change is recorded as Assistant or API.

Does n8v ever move a chat to an account I did not opt in? No.

How do I find a subscription's label? Read subscriptions or GET /api/v1/subscriptions. Labels follow the order the credentials were connected, so remove one and the later ones renumber.

Troubleshooting

SymptomLikely causeFix
No Quota in the sidebar, or the page redirectsproviderQuotaUsage is off for the accountAsk for it to be turned on
"Provider limits could not be loaded"The request failed. Credentials were not exposedTry again
No Use button on a rowIt is the active account, it needs re-login, or switching is offCheck the row's badges; see Feature flags
Use is greyed outThe account is at its limitWait for the reset in its tooltip
No auto-switch toggle, or it is disabledThe flag is off, or the account is a Grok subscription or an API keyOnly Claude and OpenAI subscriptions can opt in
Every account shows UpdatingReadings are older than 3 minutes, or a provider is slowRefresh; if it persists, the provider's usage service may be down
Needs re-loginThe provider revoked the sign-inSign in again in Settings, Agent, or use an API key if sign-in is off
No Recent activity, or it is emptyNo control is on for the account, or nothing happened in the last 90 daysSee Feature flags, or make a change and reload
403 switching_disabled or auto_switch_disabledThe matching flag is off for the accountSee Feature flags
404 subscription_not_foundThe label does not exist, often because an earlier credential was removedRead subscriptions for the current labels
403 repo_not_allowedThe key is limited to repositoriesUse a key without repository restrictions

Related: Model access for which models an account can run, the API for blocked chats and alternatives, and Claude Code and Codex for connecting a provider.