Молчаливая смена счёта: как 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-запуске через планировщик.

⚠ Опасная ловушка
Claude Code читает .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/MaxAPI-ключ (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-ключ / Подписка / Спрашивать каждый раз)».

ℹ Итог
Поведение Claude Code с приоритетом ANTHROPIC_API_KEY — задокументированное, но крайне неочевидное. Достаточно одного забытого .env-файла в рабочей директории, чтобы потерять сотни долларов при headless-запуске с включённым авто-пополнением баланса. Проверьте своё окружение прямо сейчас командой /status или echo $ANTHROPIC_API_KEY — до следующего запуска планировщика.

Пока Anthropic не добавила явных предупреждений в интерфейс, единственная защита — самостоятельная проверка переменных окружения и правильная настройка аутентификации для каждого сценария использования.