# Лимиты использования

> ccam usage показывает 5-часовой и недельный лимиты всех аккаунтов сразу, а ccam statusline выводит имя аккаунта и его использование в Claude Code.

Source: https://ccam.dev/ru/features/usage/ · Updated 2026-10-19

`ccam usage` показывает, какую часть 5-часового и недельного лимитов использовал каждый аккаунт, и время до сброса каждого окна. Запускайте его перед долгой задачей или когда Claude Code сообщает, что лимит близок, чтобы увидеть, у какого аккаунта остался запас. `ccam statusline` служит командой строки состояния для Claude Code: он показывает имя аккаунта и использование внутри Claude Code и сохраняет данные для `ccam usage`.

## Использование

```sh
ccam usage                  # every account, once
ccam u                      # the same, shorter
ccam usage --watch          # redraw every 60 seconds until Ctrl+C
ccam usage --watch=10       # redraw every 10 seconds
ccam usage -v               # add per-model weekly limits and the data source
ccam usage --json           # machine-readable, one object per account
ccam usage --source cache   # saved numbers only, no network
ccam usage --refresh        # also renew expired logins of accounts not running
ccam statusline install     # set the status line in every account's settings.json
```

```console
$ ccam usage
 Account     5-hour        Resets    Weekly        Resets    As of
 1 personal  ░░░░░░░░   0% -         ██████░░  70% 2d 16h    9h 36m ago (cached)
 2 work      ██░░░░░░  24% 2h 29m    ███░░░░░  41% 3d 11h    just now (cached)
 3 side      login expired, run `ccam side` once to refresh
→ Most headroom: personal   (open it with ccam next --auto)
```

В терминале таблица появляется сразу с `fetching…` в каждой строке, и каждая строка перерисовывается, когда отвечает её аккаунт. `As of` показывает давность данных; `(cached)` означает, что они взяты из сохранённого файла, а не от эндпоинта. Последняя строка называет аккаунт с наименьшим использованием за 5 часов ниже 100% и появляется, только если у вас больше одного аккаунта. Аккаунт без входа показывает `not logged in → ccam login <name>`, а аккаунт с ключом API показывает `no limits (API)`.

После `ccam statusline install` Claude Code показывает строку вида `[work] · Opus · 5h 24% · 7d 41%`.

## Параметры

| Параметр | Действие | По умолчанию |
| --- | --- | --- |
| `--json` | Вывести отчёты в формате JSON: `name`, `slot`, `status`, `limits`, `source`, `at`, `error` | выкл. |
| `--watch[=N]` | Перерисовывать каждые `N` секунд, пока вы не нажмёте Ctrl+C. `--watch` без значения или значение 0 и меньше означает 60 | выкл. |
| `-v`, `--verbose` | Показать недельные лимиты по моделям и строку `source:` (`live`, `cache` или `statusline`) | выкл. |
| `--no-cache` | Не учитывать 60-секундный кэш и запросить эндпоинт заново | выкл. |
| `--source live\|cache` | `cache` никогда не обращается к эндпоинту и показывает только сохранённые данные; `live` соответствует поведению по умолчанию | live |
| `--refresh` | Обновить истёкшие токены доступа, только для аккаунтов, которые не запущены | выкл. |
| `--dry-run` | Принимается: `ccam usage` не меняет ничего, кроме собственного кэша. Отклоняется вместе с `--refresh`: `--dry-run cannot be combined with --refresh, which rewrites login tokens` | выкл. |

Любое другое значение `--source` завершается ошибкой `--source must be live or cache`. `ccam usage` не принимает аргументов.

`ccam statusline` читает JSON строки состояния Claude Code из стандартного ввода. Его единственный параметр `--wrap <command>`: существующая команда строки состояния, перед первой строкой вывода которой ставится имя аккаунта. `ccam statusline install` не принимает параметров. Обе команды отклоняют `--dry-run` с сообщением `` --dry-run is not supported by `ccam statusline`; nothing was changed ``.

## Как это работает

Данные берутся из двух источников: недокументированного эндпоинта использования Anthropic, `GET https://api.anthropic.com/api/oauth/usage`, который вызывается с собственным входом каждого аккаунта, и значений, которые Claude Code передаёт своей команде строки состояния. Весь этот код находится в `internal/usage`.

1. `cli.usageCmd` загружает `config.toml` и строит по одному `usage.Account` на аккаунт: его папка `~/.local/share/ccam/profiles/<name>/`, папка его сессий (чтобы узнать, запущен ли он) и признак того, был ли он импортирован на месте.
2. `Fetcher.FetchAll` запускает по одной горутине на аккаунт. Все они используют один `http.Client`, поэтому соединения с эндпоинтом переиспользуются. На подключение отводится до 2 с, а на каждый аккаунт всего 3 с. Клиент не переходит по перенаправлениям, так как перенаправление отправило бы токен куда-то ещё, и читает не больше 1 МБ ответа.
3. Когда аккаунт завершает запрос, его строка перерисовывается. Аккаунт, запрос которого не удался или не уложился во время, переходит на сохранённые данные, поэтому один медленный аккаунт никогда не задерживает остальные.

Каждый аккаунт обращается к эндпоинту в своей горутине; тот, у которого истекло время, показывает вместо этого сохранённые данные.

`personal` и `work` отвечают вовремя и показывают актуальные данные. `side` отвечает дольше 3 с, поэтому `fallback()` читает два его файла кэша и использует тот, который был записан последним. `usage.Table()` рисует строки, а `usage.Best()` выбирает аккаунт, названный в последней строке.

Для одного аккаунта `Fetcher.Fetch` выполняет проверки в таком порядке:

1. С `--source cache` он сразу переходит к `fallback()`.
2. Если не задан `--no-cache`, актуальный результат в `~/.local/state/ccam/usage/<name>.json` моложе 60 секунд (`CacheTTL`) возвращается как есть. Два запуска `ccam usage` подряд стоят одного запроса на аккаунт.
3. `readCredentials()` читает `.credentials.json` (или Связку ключей macOS), не изменяя его, и декодирует только ключ `claudeAiOauth`. Отсутствие входа по подписке означает `not logged in` или `no limits (API)`, если `.claude.json` содержит ключ API.
4. Истёкший токен доступа не используется. Без `--refresh` аккаунт показывает сохранённые данные с пометкой об истечении.
5. Иначе ccam обращается к эндпоинту. Ответ 401 или 403 считается истёкшим входом, любой другой статус или нечитаемое тело ответа считаются ошибкой, и в обоих случаях используются сохранённые данные.
6. Успешный ответ записывается в `<name>.json` вместе со временем измерения.

`fallback()` читает и `<name>.json`, и `<name>.statusline.json` и оставляет более новый. Прежде чем показать сохранённые данные, он проверяет время сброса каждого окна: окно, которое сбросилось после сохранения данных, показывает 0%, потому что старый процент больше не действует. Поэтому `personal` выше показывает `0%` без времени сброса.

У эндпоинта два формата ответа. Более новый содержит массив `limits` с записями `session` (5 часов), `weekly_all` и `weekly_scoped` (по моделям). Более старый содержит объекты `five_hour`, `seven_day`, `seven_day_opus` и `seven_day_sonnet`. `ParseLive` читает оба: приоритет у массива `limits`, а старые объекты дополняют то, что он не охватывает. Тело ответа без лимитов считается изменившимся форматом, о чём сообщает `ccam doctor`.

### Обновление токенов

Токены обновления меняются при каждом использовании: обновление выдаёт новый токен обновления и делает старый недействительным. Если бы ccam обновил вход, пока Claude Code работает от имени того же аккаунта, эта сессия вышла бы из аккаунта. Поэтому `ccam usage` читает токены и никогда их не записывает, если вы не передали `--refresh`. В этом случае `Fetcher.refresh`:

1. отклоняет аккаунты, зарегистрированные на месте через `ccam import`, поскольку обычный `claude` может использовать этот вход без ведома ccam;
2. отклоняет входы, хранящиеся в Связке ключей macOS;
3. берёт файл блокировки `$XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock` (в `~/.local/state/ccam/locks/`, если эта переменная не задана), чтобы два процесса ccam никогда не обновляли один токен дважды;
4. под блокировкой отказывается работать, если запущена сессия аккаунта, и пропускает запрос, если другой процесс уже обновил токен;
5. отправляет токен обновления на эндпоинт токенов и записывает новые токены обратно в `.credentials.json` через `fsutil.AtomicWrite`, сохраняя все остальные ключи файла.

### Сборщик данных строки состояния

Claude Code запускает команду строки состояния и передаёт ей через конвейер JSON-документ. ccam читает из него имя модели и `rate_limits`:

1. `runStatusline` определяет аккаунт по `CCAM_PROFILE`, который ccam задаёт при запуске Claude Code, а иначе сопоставляет `CLAUDE_CONFIG_DIR` с папками аккаунтов.
2. `ParseStatusLine` читает `rate_limits.five_hour` и `rate_limits.seven_day`. Для аккаунтов с ключом API, а также до первого ответа в сессии, в JSON нет лимитов; тогда ничего не сохраняется.
3. `SaveStatusLine` записывает `~/.local/state/ccam/usage/<name>.statusline.json`. `ccam usage` использует его, когда эндпоинт не отвечает.
4. ccam выводит `[name] · model · 5h N% · 7d N%`. С `--wrap` он запускает вашу команду через `sh -c` с тем же вводом и вместо этого выводит `[name]` и первую строку вывода команды.

На обёрнутую команду отводится 2 секунды. После этого она завершается принудительно, и строка показывает только имя аккаунта, поэтому медленная команда не может заблокировать строку состояния Claude Code.

`ccam statusline install` записывает `statusLine` в `settings.json` каждого аккаунта. Если у аккаунта уже есть команда строки состояния, ccam сохраняет её как `--wrap '<old command>'`. `settings.json`, общий через группу, записывается один раз через его ссылку, поэтому его получает каждый аккаунт группы. Повторный запуск выводит `(already set)` для файлов, которые уже используют ccam.

## Безопасность и особые случаи

- `ccam usage` никогда не меняет файл токенов, если вы не передали `--refresh`. Если вход истёк, запустите аккаунт один раз командой `ccam <name>`, и Claude Code обновит его.
- `--refresh` никогда не трогает запущенные аккаунты, импортированные аккаунты и входы из Связки ключей. При отказе в обновлении показываются сохранённые данные и причина.
- Эндпоинт использования публично не документирован и может измениться. В этом случае вы всё равно увидите сохранённые данные, а `ccam doctor` сообщит об изменении формата.
- Если сохранённых данных нет и ответа нет, строка показывает `lookup failed:` и причину, например `no saved usage` с `--source cache`.
- Файлы кэша содержат только проценты и время сброса, но никогда не токены.

## См. также

- [Лимиты использования и переключение аккаунтов](https://ccam.dev/ru/docs/usage-limits.md)
- [Переключение на следующий аккаунт](https://ccam.dev/ru/features/next.md)
- [Порядок работы при достижении лимита](https://ccam.dev/ru/guides/usage-limit-workflow.md)
- [Справочник команд](https://ccam.dev/ru/docs/commands.md)
