Limits and fallback per model
A Claude subscription limits Fable, Opus, Sonnet and Haiku separately. How n8v keeps the other models running when one is out, and what a chat does next
On a Claude subscription, Fable can be out while Opus still runs. Claude Code then ends the turn with "You're out of usage credits. Switch to another model, ..." and names no reset. n8v used to read that as a limit on the whole subscription and held all of it out for an hour, so chats on Opus stopped too.
With limits per model, n8v holds out only that model, on that subscription.
| Subscription | Fable | Opus | Sonnet | Haiku |
|---|---|---|---|---|
| Claude #8active | limit reached | runs | runs | runs |
| Claude #6auto-switch on | runs | runs | runs | runs |
Being rolled out per account with the modelFamilyLimits flag, off by
default. It builds on limit recovery. With the flag
off, a model's limit holds out the whole subscription, as before.
What n8v knows, and from where
Anthropic's usage endpoint reports two windows per subscription, the 5-hour and the weekly one. It reports nothing per model. So the only signal that a model is out is the message Claude Code ends the turn with, and n8v treats that message as the truth:
| Claude Code says | n8v holds out |
|---|---|
| "You're out of usage credits. Switch to another model, ..." | The model of that turn, on that subscription |
| "Opus weekly limit reached", "You've hit your Fable limit", "You've reached your Fable limit" | The model it names, on that subscription |
| "You've hit your weekly limit", "5-hour limit reached" | The whole subscription, as before |
Models are grouped by family: every Fable version and effort level shares the Fable limit, and the same goes for Opus, Sonnet and Haiku.
When the message names a reset, n8v waits for it. When it names none, n8v asks again after an hour. If the model is still out, the next wait is two hours, then four, then eight. Asking costs one refused turn of one chat. Ten chats that run into the same limit count as one limit: the wait does not grow with them.
What a chat does at a model's limit
The same model on another subscription
The chat's next turn runs on a subscription that has room for that model. The active subscription does not change, so chats on other models stay where they are.
Needs: Auto-switch on for that subscription
Another Claude model
The chat continues on the model you chose for its family, at the same effort: Fable 5.2 High continues as Opus 5.5 High. If that model runs out too, the chat follows that model's rule.
Needs: Continue on another model, in Settings, Agent
Another provider
The cross-provider fallback takes over with the whole conversation, as it does when every Claude account is at its limit.
Needs: Continue on another provider, in Settings, Agent
Wait, with a time
The chat waits for the reset the provider named. If it named none, n8v asks again after an hour, then after two, four and eight.
Needs: Nothing: this is what is left
The first step never changes your active subscription. Only the turns of the model that is out run elsewhere; the chat says so:
Fable limit reached on Claude #8. Continuing on Claude #6, which has room for Fable.
n8v only ever uses a subscription you opted in for auto-switch. One that has room but is not opted in is left alone.
Continue on another model
In Settings, Agent, under When a model's limit is reached, switch on Continue on another model. It is off until you choose. There is one rule per family:
| Chats on | Continue on, by default |
|---|---|
| Fable | Opus 5.5 |
| Opus | Sonnet 5.5 |
| Sonnet | No other model |
| Haiku | No other model |
Effort carries over. The chat shows where it moved, and a Fallback badge beside its model says when it goes home:
Fable limit reached on Claude #8. Continuing on Opus 5.5 High, and back on Fable 5.2 High once it has room.
Rules chain. With the defaults, a Fable chat that fell back to Opus and then meets an Opus limit continues on Sonnet. Home stays Fable throughout.
Going home
At the start of every turn n8v checks whether the chat's own model has room again, on the active subscription or on one you opted in. If it has, that turn runs on it:
Fable has room again. Back on Fable 5.2 High.
Three things change that. Pin its model (the chat menu, or modelPinned over the API) and it neither falls back nor returns by itself; it can still run on another subscription, because that does not change its model. Pick a model of another family yourself and the fallback ends there. Switch the setting off and each chat returns to its own model at its next turn, says so, and waits for it there.
A message you queued while the chat stood on the fallback goes home with it: the turn runs on the model the chat's last line names, not on the one the composer showed when you wrote it.
A chat that another provider's limit moved onto Claude keeps that fallback. If its Claude model runs out, n8v only tries another subscription for the same model; after that the chat goes back to its own provider or waits.
Where you see it
- The chat: the lines quoted above, and the Fallback badge.
- The Quota page: a chip on the subscription, such as "Fable limit, asks again in 45m" or "Opus limit, resets in 1d 20h". The subscription itself stays available. Open a subscription's details for Windows by scope, described below.
- Activity: "Claude Fable limit reached on Claude #8" and "Its Fable chats continued on Claude #6" in the subscription events; each fallback and return in the audit log (
limit.fallback,limit.fallback_return) and the event feed (chat.fallback.started,chat.fallback.ended).
Which window a number belongs to
A subscription's own "16% left", on the Quota page and as headroomPct, is a shared window: the 5-hour or the weekly one, which every model on that subscription draws on. For the Claude accounts n8v reads today, Claude reports usage for those two windows only, so there is no Fable or Opus percentage to show. What n8v knows per model is whether Claude said that model is out.
Windows by scope, in a subscription's details on the Quota page, lists one row per window:
| Row | Means |
|---|---|
| Shared, with a percentage | A window every model on the subscription draws on, as the provider reports it |
| A model, "Limit reached" | Claude said this model is out here. The reset when Claude named one, else when n8v asks again |
| A model, "No limit seen" | n8v has seen no limit for this model here. Its usage is not reported, so the row shows a dash, not zero, and a limit reached outside n8v is unseen |
A provider that does report a window for one model, as OpenAI does for Spark, gets that window as a row of its own with its percentage, and a recommendation for that model counts it.
API and MCP
Both need the chats:message scope to change the rule and chats:read to read it. A key limited to repositories is refused, because the rule covers the whole account.
| Call | MCP tool | Body | Does |
|---|---|---|---|
GET /api/v1/subscriptions/model-fallback | subscriptions | The rule: on, to per family, and targets with usable | |
POST /api/v1/subscriptions/model-fallback | set_model_fallback | {"on": true, "opus": "none"} | Switches it on or off and sets the model per family |
GET /api/v1/subscriptions | subscriptions | Per subscription modelLimits and usageWindows, and the rule as modelFallback | |
GET /api/v1/subscriptions/plan | quota_plan | Per subscription usageWindows with burn and projection, and families: the ranking per model |
A family takes fable-5.2, opus-5.5, sonnet-5.5, haiku-5.5 or none, never a model of its own family. Each entry of modelLimits has model (the family), resetsAt (only when the provider named a reset) and retryAt (when n8v asks again).
curl -sS -X POST https://n8v.online/api/v1/subscriptions/model-fallback \
-H "Authorization: Bearer $N8V_API_KEY" \
-H "Content-Type: application/json" \
-d '{"on": true, "fable": "opus-5.5", "opus": "sonnet-5.5"}'Usage windows by scope
With limits per model on, every subscription in subscriptions and quota_plan carries usageWindows, one entry per window. The fields that were there, windows and modelLimits, are unchanged.
| Field | Value |
|---|---|
scope | shared: every model on the subscription draws on it (all in windows). Or one model family: fable, opus, sonnet, haiku, spark. unknown: a scope the provider did not name |
appliesTo | The same in words: "every model on this subscription", "Fable models only" |
source | provider: reported usage. limit_message: the provider's message said this model is out. not_reported: no usage for this model, and no limit seen by n8v |
state | room, limited or unknown. A stale reading keeps its numbers and is unknown |
window, windowMins | "5-hour window", "weekly window"; null for a model the provider reports no window for |
usedPct, remainingPct | Percentages of a reported window; null when not reported. Null is unknown, never zero |
resetsAt, retryAt | The reset the provider named; for a limit_message without one, retryAt is when n8v asks again |
burn, projectedPct, ... | In quota_plan only: the burn rate, the projection and the expiry of a reported window, as in windows |
quota_plan also returns families: per Claude model family, the subscriptions ordered by what is left for that model, most room first and blocked ones last. Each entry has subscription, leftPct, the window and scope that number comes from, and blocked when the model cannot run there, with until or retryAt:
blocked.by | Means |
|---|---|
model_limit | The family's own limit is in force |
shared_window | A shared window is full; window names it |
subscription_limit | The provider's message held out the whole subscription; no window is full |
needs_login | The subscription needs a new sign-in |
error | The subscription could not be read |
leftPct is null when it is not known: a stale reading, a window that was not read, or a window whose scope the provider did not name. The ranked picks in recommend leave out a model on a subscription where that model is held out.
{
"families": [
{
"family": "fable",
"name": "Fable",
"subscriptions": [
{ "subscription": "Claude #1", "selected": true, "leftPct": 100, "window": "weekly window", "scope": "shared", "blocked": null },
{ "subscription": "Claude #8", "selected": false, "leftPct": 47, "window": "5-hour window", "scope": "shared", "blocked": null },
{
"subscription": "Claude #9",
"selected": false,
"leftPct": null,
"window": null,
"scope": null,
"blocked": { "by": "model_limit", "scope": "fable", "window": null, "until": null, "retryAt": "2026-11-11T15:10:00.000Z" }
}
]
}
]
}The tool's text says the same in one line per model, and one line for models that rank alike: "Fable: Claude #1 100% left (weekly window, shared); Claude #8 47% left (5-hour window, shared); Claude #9 held out by its Fable limit, no reset named, n8v asks again 11 Nov 15:10 UTC (in 40m)." and "Opus, Sonnet, Haiku: Claude #1 100% left (weekly window, shared); Claude #9 95% left (weekly window, shared); Claude #8 47% left (5-hour window, shared)."
Refusals: 403 model_limits_off (the flag is off for the account), 403 subscriptions_disabled, 403 repo_not_allowed, and 400 invalid_request with param naming the family whose model cannot be its fallback.
What it does not do yet
- Only Claude families. OpenAI meters Spark separately from the shared Codex windows; n8v shows that window on the Quota page but does not route around it.
- An organization's runs and workstation tasks keep their own handling: their organization decides which subscription they use.
- No percentage, burn rate or projection per Claude model: Claude reports none. The quota plan ranks a model by the shared window that binds it and by the model's own limit when one is in force.
- A limit reached outside n8v is not seen until a turn in n8v runs into it.
Questions
Why did my Opus chat keep running when Fable stopped? That is the point: only Fable is held out on that subscription.
Why did the chat not take my other subscription? Auto-switch is off for it, or for the account. Turn it on in Quota.
Why does the chip say "asks again" and not "resets"? Claude Code named no reset, so n8v does not know one. It tries again at that time and, if the model is still out, waits twice as long.
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
Benchmark-aware fallback
When nothing for a chat's model has room and every other fallback had nothing, n8v continues on the best model that can run right now, by your preference order and a benchmark table you can edit