Account Pools
An account pool lets you put several Claude accounts behind one provider profile so a session keeps going when one account hits its rate limit. Instead of seeing a limit error and switching accounts by hand, the pool moves the conversation to the next available account for you. A pool is three things working together:- Several accounts authenticated under the built-in
claudeCLIProxy provider. - One provider profile you launch with
ccs claude. - Auto-continue on limit: when the active account is rate limited, CLIProxy hops to the next account in the pool so the turn completes.
Account pools route through your local CLIProxy. They are separate from native
account profiles (
ccs work, ccs personal). The two systems do not share
session history. See When not to pool and
Migrating from native profiles.Terminology
These words get mixed up. Here is what each one means in CCS.| Term | Meaning |
|---|---|
| Account profile | A native Claude account lane created with ccs auth create <name>, run with ccs <name>. Has its own CLAUDE_CONFIG_DIR and its own session history. Does not pool. |
| OAuth account | A single Claude login (one email, one set of tokens). The unit a pool is built from. |
| Variant | A user-defined CLIProxy provider entry under config.cliproxy.variants (for example, a custom Codex model variant). |
| Provider | A CLIProxy backend such as claude, agy, gemini, or codex. A pool lives under one provider. |
| Pool | Two or more OAuth accounts under one CLIProxy provider with pool routing enabled. Auto-continues on limit. |
Codex has two separate lanes
Codex can confuse you the same way, because the word “pool” shows up in two different places:- CLIProxy Codex pool: OAuth accounts under the
codexCLIProxy provider, reached withccs codex. This is the pool world described on this page. - Native Codex runtime lane: the
ccsx,ccsxp, andccsdaliases route a profile to the native Codex CLI. That is a runtime target, not a CLIProxy account pool. See Codex Adapter.
Set up a pool in three commands
Authenticate your first account
claude CLIProxy provider.Add more accounts
--add opens a fresh OAuth flow and
stores the new account alongside the first. For a three-account pool, run it
twice.When you cross from one account to two, CCS offers to turn on pool routing
for you (interactive terminals only). You can accept there, or enable it
later with ccs cliproxy pool --enable.How failover behaves
Fill-first plus session affinity
Pool routing uses two settings together:- fill-first: drain one account fully before moving to the next, instead of spreading requests evenly. This keeps as much of your conversation as possible on a single account.
- session affinity: pin one conversation to one account (TTL 1h) so a multi-turn session stays put until it has to move.
A pre-stream limit hops transparently
When the active account is rate limited before the response starts streaming, CLIProxy switches to the next account and the turn completes there. You do not see an error. The hop is transparent.The turn right after a hop is slower
Here is the cost to know about. When the pool hops to a new account, the new account has none of your conversation cached. The next turn re-processes your whole conversation from the start on the new account. That means the turn right after a hop is noticeably slower, and the slowdown is proportional to how large your conversation is. A short conversation re-processes quickly. A long one (tens of thousands of tokens of context) takes longer, because the entire context has to be read again on the fresh account. CCS does not publish a fixed latency number here because it depends on context size, model load, and provider response time. Treat the first turn after a hop as a full-context turn, not a warm-cache turn. This happens once per hop. After the hop, the conversation is cached on the new account again and turns return to normal speed until the next hop.When not to pool
A pool is the right tool when you want one continuous session that survives rate limits. It is the wrong tool when you want accounts kept apart. If you want strict separation between accounts (work vs personal, separate billing, separate history), use native account profiles instead:ccs does not pool. Running plain ccs launches your native default
account lane, not the CLIProxy pool. Pooling only happens when you launch through
ccs claude with pool routing enabled. If you want pooled failover, use
ccs claude; if you want your single native account, use ccs.
Leaving a pool
To turn pool routing off, use the disable command. Do not hand-edit routing back to plain round-robin (see the warning below).Why not just switch to round-robin
It is tempting to “leave the pool” by setting routing to plain round-robin with no session affinity. Do not do this with a multi-account fleet. Round-robin with no affinity spreads each request across accounts. Without affinity, consecutive turns of the same conversation land on different accounts, and each landing re-processes your whole conversation on a cold account. That is the cache-burn footgun: you pay the full context-recompute cost on most turns, not just on a hop.ccs cliproxy pool --disable avoids this. It restores a safe non-pool config
(cooling disabled, your original routing), instead of leaving you in the
worst-case round-robin-no-affinity state.
Migrating from native profiles
If you already run native account profiles (ccs work, ccs personal) and want
to pool those same accounts, read this first. The two lanes do not share
credentials or history.
You re-authenticate each account fresh
You cannot import credentials from a native profile into the pool. A native profile’s refresh token is bound to a different OAuth client, so the pool cannot reuse it. To pool an account you already use natively, authenticate it again under theclaude CLIProxy provider:
Session history does not follow
Pooled sessions live in the CLIProxy lane. Your native profile’s session history and your--continue / resume inventory stay in the native lane. They do not
move into the pool. After migrating, a pooled ccs claude session starts with a
clean history; your old ccs work transcripts remain reachable only through
ccs work.
Pause the native profile for the same account
Once an account is in the pool, do not keep launching the same account through its native profile at the same time. Running one Claude account in two lanes concurrently (native profile in one terminal, pool in another) is the one behavior that raises account risk. See Safety notes. To avoid it, pick one lane per account. If you migrate an account into the pool, stop using its native profile for live sessions, or remove the native profile so there is no second lane to launch by accident.Caveats
Read these before you rely on a pool.Mid-stream errors do not re-route
The transparent hop only applies when a limit is hit before the response starts streaming. If an account fails after the first chunks have already streamed, that turn is not re-routed: you see a visible error for that turn. The pool hops on the next turn, not retroactively. The exact visible error text can vary by Claude Code version and provider response, so the important rule is timing: after chunks start streaming, CCS cannot rewind and replay that same turn on a different account.All accounts cooling vs a paused account
These are two different failure states with two different errors:- All accounts cooling: every account in the pool is rate limited at once. You get a 429 with a reset time telling you when the soonest account frees up.
- A paused account: the only candidate is paused (for example, after a ban pattern auto-pause), which surfaces as a different error, not a 429-with-reset.
ccs cliproxy quota to tell them apart. Cooling accounts show
cooling until <time> when CCS can see a reset time; paused accounts show
paused (manual or safety) and include a resume hint.
One context recompute per hop
Every hop pays one full context recompute on the new account, which costs both quota (the re-read tokens) and latency (the slower turn described in How failover behaves). Pools minimize hops with fill-first plus affinity, but a hop is never free.Remote and Docker pools need manual config
On a remote or Docker CLIProxy, CCS cannot manage the pool the same way it does locally:- The interactive opt-in prompt is not shown.
- Session affinity is not remotely toggleable from CCS.
- You must configure pool routing in the remote CLIProxy
config.yamlby hand.
config.yaml:
Claude quota percentages are limited
Claude OAuth does not expose full quota percentages to CCS the way some other providers do (the underlying signal ispolicy_quota_unsupported). You will see
limit and reset behavior, but not a precise “N% remaining” figure for Claude
pool accounts.
Claude tier detection is unavailable
CCS cannot detect the subscription tier (Pro vs Max) of a Claude pool account. Tier-based drain ordering (--by-tier) is available for providers that report
tier (agy, gemini), but not for claude. For Claude, the pool drains in
file order, or in an order you set manually with
ccs cliproxy accounts order claude --set.
Safety notes
Pool routing ships with guardrails on by default:- Cooldowns are honored. A rate-limited (429) account is suspended briefly with exponential backoff (1s up to 30m). A broken-auth account (401/403) is suspended for 30 minutes, because broken auth should not keep taking traffic.
- Retry cap. A single request stops after
max-retry-credentials: 3attempts across accounts instead of walking the entire fleet. - Ban-pattern auto-pause. If an account shows a ban signal, CCS pauses it out of rotation automatically.
The honest version of account risk
Pools do not add a new ban vector. Running accounts behind one local CLIProxy is the same traffic shape Anthropic already sees from a single client. The risk that does exist is concurrency: the same Claude account active in two clients or two lanes at once. A pool by itself does not create this, because the pool drains one account at a time with affinity. But migration can create it if you keep an active native profile for an account you have also added to the pool. Then you can launch that one account twice (native lane plus pool lane) and run it concurrently. The fix is in Migrating from native profiles: pick one lane per account. Pool the account, or run it natively, but not both at the same time.Related commands
| Command | What it does |
|---|---|
ccs cliproxy pool | Show pool routing status |
ccs cliproxy pool --enable | Enable pool routing (fill-first, affinity, cooling on, retry cap) |
ccs cliproxy pool --disable | Disable pool routing and restore a safe non-pool config |
ccs cliproxy accounts order claude | Show the order accounts drain in |
ccs cliproxy accounts order claude --set <ids> | Set a manual drain order |
Next steps
Claude Accounts
Native account profiles when you want accounts kept separate
Claude Provider
OAuth, multi-account, and quota details for the claude provider
Multi-Account Setup
Step-by-step account setup across providers
CLI Reference
Full pool, routing, and account command surface
