Claude Code тихо списывает деньги через API, игнорируя Max-подписку
Пользователи Claude Code теряют деньги: инструмент молча переключается на платный API, если в .env найден ANTHROPIC_API_KEY — даже при активной Max-подписке.
Молчаливая смена счёта: как Claude Code незаметно уходит на платный API
Пользователь Reddit потерял $187 из-за неочевидного поведения Claude Code: инструмент автоматически переключился на платный API-аккаунт, обнаружив переменную ANTHROPIC_API_KEY в .env-файле проекта — хотя у человека была активна подписка Max. Anthropic признаёт это задокументированным поведением, а не ошибкой. Проблема оказалась не единичной: десятки пользователей GitHub сообщают о схожих потерях.
Что происходит
Если в системе установлена переменная окружения ANTHROPIC_API_KEY, Claude Code использует этот API-ключ для аутентификации вместо подписки (Pro, Max, Team или Enterprise), что приводит к списанию средств по API-тарифам, а не в счёт включённого лимита подписки.
Пользователь запускал Claude Code в фоновом режиме (через Windows Task Scheduler). В рабочем репозитории находился .env-файл с ANTHROPIC_API_KEY — для отдельного Express-сервера, не связанного с Claude Code. Никаких предупреждений не последовало: когда одновременно присутствуют ANTHROPIC_API_KEY (переменная окружения) и активная OAuth-авторизация через Claude Pro/Max, Claude Code молча использует API-ключ — без предупреждения при старте сессии.
В неинтерактивном режиме (-p) ключ используется всегда, когда он присутствует в окружении. Именно это и произошло при headless-запуске через планировщик.
.env-файл в рабочей директории при запуске. Если там есть ANTHROPIC_API_KEY — даже для другого сервиса — он перехватывает биллинг. Ваш файл .credentials.json при этом будет по-прежнему показывать subscriptionType: "max".Масштаб проблемы
Это не единичный случай. На GitHub зафиксированы множественные жалобы:
- Подписчик Max Plan ($200/месяц) обнаружил, что вызовы субагентов Claude Code (через инструмент Agent) молча маршрутизируются через его Anthropic API-ключ вместо Max Plan.
- Подписчики Max платят дважды — один раз за подписку и ещё раз за каждый токен через автоматически созданный API-ключ — без какого-либо уведомления внутри продукта.
- Один из пользователей потерял ~$20 API-кредитов за две интерактивные сессии кодинга, которые должны были быть покрыты Max-планом.
Родительский процесс Claude Code корректно использует Max Plan, но дочерние процессы (субагенты) это поведение не наследуют.
Как работает приоритет аутентификации
Порядок приоритетов в Claude Code при наличии нескольких источников учётных данных:
graph TD
A[Запуск Claude Code] --> B{Есть переменные облачных провайдеров?}
B -- Да --> C[Bedrock / Vertex / Foundry]
B -- Нет --> D{Есть ANTHROPIC_AUTH_TOKEN?}
D -- Да --> E[Bearer-токен / прокси]
D -- Нет --> F{Есть ANTHROPIC_API_KEY?}
F -- Да --> G[⚠️ API-биллинг по токенам]
F -- Нет --> H[OAuth / подписка Pro/Max]
Если у вас есть активная подписка Claude, но в окружении также установлен ANTHROPIC_API_KEY, API-ключ имеет приоритет после подтверждения. В неинтерактивном режиме подтверждения не запрашивается вовсе.
Сравнение режимов биллинга
| Параметр | Подписка Pro/Max | API-ключ (pay-as-you-go) |
|---|---|---|
| Стоимость | Фиксированная в месяц | За каждый токен |
| Лимит использования | Включён в тариф | Не ограничен (пока есть баланс) |
| Авто-пополнение | Нет | Да, если включено в Console |
| Прозрачность | Лимиты видны в /status | Расходы видны в Console |
| Риск неожиданных списаний | Низкий | Высокий при наличии .env с ключом |
Биллинг по подписке предполагает фиксированные ежемесячные расходы и лимиты использования. Биллинг через API взимает плату за каждый токен — это может стать очень дорогим очень быстро.
Что делать прямо сейчас
/status внутри Claude Code — команда покажет, какой метод аутентификации активен в текущей сессии: подписка или API-ключ.Проверить наличие переменной:
# macOS / Linux
echo $ANTHROPIC_API_KEY
# Windows PowerShell
$env:ANTHROPIC_API_KEY
Если команда возвращает значение — Claude Code использует API-биллинг.
Сбросить на подписку (для текущей сессии):
unset ANTHROPIC_API_KEY
claude logout
claude login
Чтобы Claude Code работал через подписку, переменная ANTHROPIC_API_KEY должна быть не задана — это предотвращает неожиданные API-расходы и гарантирует использование лимита подписки.
Переменная легко забывается, потому что может быть задана в .zshrc, .bashrc, .env, профиле терминала, CI-секрете, devcontainer или скрипте запуска.
Для headless / CI-окружений: используйте CLAUDE_CODE_OAUTH_TOKEN — долгосрочный OAuth-токен, сгенерированный командой claude setup-token, предназначенный именно для CI-пайплайнов и скриптов, где браузерный вход недоступен.
Если ключ нужен для другого сервиса в том же репозитории:
# Алиас, чтобы Claude Code не видел API-ключ,
# но переменная оставалась доступна другим процессам
alias claude='env -u ANTHROPIC_API_KEY claude'
Добавление такого алиаса в ~/.zshrc заставляет интерактивные сессии игнорировать переменную и использовать OAuth/Max. При этом скрипты, явно читающие os.getenv("ANTHROPIC_API_KEY"), продолжат работать — переменная остаётся в шелле, просто не передаётся в вызов claude.
Позиция Anthropic и реакция сообщества
Если у вас одновременно есть подписка Claude (Pro/Max) и установленная переменная окружения ANTHROPIC_API_KEY, Claude Code будет использовать API-ключ и выставлять счёт по тарифам pay-as-you-go вместо использования подписки. Это происходит даже при авторизованном входе и является задокументированным поведением Anthropic.
Сообщество не согласно с тем, что такое поведение достаточно прозрачно. Молчаливый приоритет в Claude Code превращает пользователей в pay-as-you-go-клиентов без их ведома — это монетизирует пользовательское замешательство, а не осознанный выбор.
«Граница между “скрипты используют API-тариф” и “интерактивное использование покрыто Max” разумна и соответствует индустриальным стандартам. Но молчаливый приоритет в Claude Code конвертирует пользователей в pay-as-you-go без уведомления.»
На GitHub накопился целый ряд запросов: показывать предупреждение при обнаружении конфликта ключей, добавить статус-баннер в начале сессии, сделать claude logout умным в отношении переменных окружения. Предлагается, например, такой диалог при первом запуске: «Мы обнаружили и API-ключ, и авторизованную подписку. Какой источник биллинга использовать для интерактивных сессий? (API-ключ / Подписка / Спрашивать каждый раз)».
ANTHROPIC_API_KEY — задокументированное, но крайне неочевидное. Достаточно одного забытого .env-файла в рабочей директории, чтобы потерять сотни долларов при headless-запуске с включённым авто-пополнением баланса. Проверьте своё окружение прямо сейчас командой /status или echo $ANTHROPIC_API_KEY — до следующего запуска планировщика.Пока Anthropic не добавила явных предупреждений в интерфейс, единственная защита — самостоятельная проверка переменных окружения и правильная настройка аутентификации для каждого сценария использования.