Manage multiple OpenAI Codex CLI accounts — switch, check quota, validate tokens
Project description
codex-switch
Manage multiple OpenAI Codex CLI accounts from the command line.
If you use multiple ChatGPT Pro/Plus subscriptions for Codex CLI — for parallel batch evaluation, team usage, or quota management — this tool lets you switch between accounts, check real-time quota, and validate token health without manually copying auth.json files.
Install
# With uv (recommended)
uv tool install codex-switch
# Or with pip
pip install codex-switch
Requires Python 3.11+ and Codex CLI installed.
Quick Start
# Save your current logged-in account
codex-switch save work
# Import another auth.json
codex-switch add ~/Downloads/auth.json personal
# See all accounts at a glance
codex-switch list
# Switch to a different account
codex-switch switch personal
Commands
codex-switch list
Show all saved accounts with plan, quota, token expiry, and live API status:
Saved Codex accounts
name email plan quota access_exp live
- -------- ---------------------------- ---- -------------------------------------------- ----------- ----
* pro1 user1@example.com pro 5h:69% (04-03 19:52) / wk:55% (04-10 00:34) 04-10 10:48 ok
pro2 user2@example.com pro 5h:0% (04-03 23:05) / wk:6% (04-10 18:05) 04-13 16:27 ok
personal user3@gmail.com pro 5h:0% (04-03 23:05) / wk:0% (04-10 18:05) 04-13 16:18 ok
*= currently active account (matches~/.codex/auth.json)5h= 5-hour rolling window usage and reset time,wk= 7-day rolling window usage and reset timeaccess_exp= when the access token expires (local time)live= real-time API validation result
codex-switch switch <name>
Switch the active Codex CLI account:
$ codex-switch switch pro2
Switched to account 'pro2'
Active auth: /home/user/.codex/auth.json
codex-switch quota [name]
Check real-time quota for the current or a specific account. Does not consume any API quota:
$ codex-switch quota pro1
Quota for pro1
email: user1@example.com
plan: pro
auth: chatgpt
bucket name 5h week credits plan
--------------- ------------------- ----------------- ----------------- ------- ----
codex - 70% (04-03 19:52) 55% (04-10 00:34) 0 pro
codex_bengalfox GPT-5.3-Codex-Spark 0% (04-03 23:05) 0% (04-10 18:05) - pro
codex-switch refresh [name]
Refresh access tokens for the current or a named account. Does not consume API quota:
$ codex-switch refresh pro1
Refreshed pro1
email: user1@example.com
plan: pro
access token: ok (2026-04-22 06:01Z)
id token: ok (2026-04-12 07:01Z)
Updated files:
/home/user/.codex-switch/pro1.json
/home/user/.codex/auth.json
- If the refreshed account is the currently active account,
~/.codex/auth.jsonis also updated - Without a name, refreshes
~/.codex/auth.jsondirectly and syncs back to the matching saved account
codex-switch probe [name]
Run a tiny Codex request for the current or a named account. This is useful when you want to start the account's rolling quota window before checking list or quota.
$ codex-switch probe pro1
Probing pro1
auth: /home/user/.codex-switch/pro1.json
model: Codex CLI default
Probe completed
reply: OK
email: user1@example.com
plan: pro
quota: 5h:1% (04-03 19:52) / wk:1% (04-10 00:34)
Use --model when you need to start usage for a specific model bucket:
codex-switch probe pro1 --model gpt-5.1-codex
Unlike quota, this command sends one real Codex request and can consume a small amount of quota. It uses a temporary CODEX_HOME, so it does not switch or rewrite your active ~/.codex/auth.json.
codex-switch validate [name]
Check token health for one account or all saved accounts:
$ codex-switch validate pro2
pro2
email: user2@example.com
plan: pro
access: ok (2026-04-13 08:27)
id: expired (2026-04-03 09:27)
refresh: present
live: OK 5h:0% / wk:6%
codex-switch current
Show details about the currently active account:
$ codex-switch current
Current Codex account
name: pro1
path: /home/user/.codex/auth.json
email: user1@example.com
plan: pro
access token: ok (2026-04-10 02:48)
id token: expired (2026-03-31 03:48)
refresh: present
codex-switch save <name>
Save the current ~/.codex/auth.json as a named account:
$ codex-switch save work
Saved current auth as 'work'
codex-switch add <path> <name>
Import an auth.json file as a named account:
$ codex-switch add ~/Downloads/auth.json team-account
Imported account 'team-account'
codex-switch remove <name> (alias: rm)
Remove a saved account. Cannot remove the currently active account:
$ codex-switch remove old-account
Removed account 'old-account'
codex-switch rename <old> <new> (alias: mv)
Rename a saved account:
$ codex-switch rename team-account team
Renamed 'team-account' → 'team'
How it works
Codex CLI stores authentication in ~/.codex/auth.json. This tool maintains named copies in ~/.codex-switch/ and swaps them when you switch accounts.
Quota checking starts a temporary codex app-server process pointed at the target account, queries the account/rateLimits/read JSON-RPC endpoint, and shuts down. No Codex API quota is consumed.
Storage layout
~/.codex-switch/
├── pro1.json # saved auth.json for "pro1"
├── pro2.json # saved auth.json for "pro2"
Environment variables
For testing or custom setups:
CODEX_SWITCH_DATA_DIR— override the account storage directory (default:~/.codex-switch)CODEX_SWITCH_CODEX_HOME— override the Codex home directory (default:~/.codex)
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codex_switch-0.3.0.tar.gz.
File metadata
- Download URL: codex_switch-0.3.0.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ad657489daddd18c225cbd6c074a91268efb35fafaebaa1a76cf0678dfc741b
|
|
| MD5 |
258c6ffe7f266c0313a4c2adc823bbcd
|
|
| BLAKE2b-256 |
4772ef79d5237dd631b6713b9517a455e6daa2192e56cfb05bb40eddb3b71ce0
|
File details
Details for the file codex_switch-0.3.0-py3-none-any.whl.
File metadata
- Download URL: codex_switch-0.3.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
802d2c0ff0bc6126f475103e572a1c59e93743d1fbfbedf274389ae147f42413
|
|
| MD5 |
25a71322bbd1b7036545153d22114cf7
|
|
| BLAKE2b-256 |
9b19079e3648aef3fa4e1371612edb79bff8f4f32c9628b5e112210aaf7beb19
|