Claude Code ошибка invalid API key: как исправить
Claude Code выдает ошибку invalid API key даже при активной подписке? Узнайте, как найти переменную ANTHROPIC_API_KEY в системе и почему команда login не решает проблему.
Почему Claude Code сообщает об ошибке неверного API-ключа
Claude Code выдает ошибку Invalid API key по двум разным причинам, и способы их устранения противоположны. Либо вы пытались пройти аутентификацию с помощью API-ключа, и этот ключ неверный, отозван или принадлежит другой учетной записи. Либо вы вообще не планировали использовать ключ, но оставшаяся в окружении сервера переменная ANTHROPIC_API_KEY имеет приоритет над подпиской, с которой вы вошли в систему. Документация Anthropic по состоянию на сентябрь 2026 года прямо указывает на второй случай: ключ, заданный в переменной окружения, используется вместо вашей подписки Claude Pro, Max, Team или Enterprise, даже если вы авторизованы.
Прежде чем что-либо менять, выясните, в каком состоянии находится ваша конфигурация. Запустите Claude Code и выполните /status. В документации описана строка Login method, которая показывает аккаунт вашей подписки, и строка API key, которая появляется при использовании API-ключа. Если вы видите строку с API-ключом на машине, где вы всегда использовали только /login, проблема заключается в переменной окружения, и повторная аутентификация её не решит.
Все приведенные ниже команды предназначены для выполнения на вашем сервере. Перед выполнением проанализируйте вывод команд.
Порядок использования учетных данных и почему /login не помогает
Когда доступно несколько учетных данных, Claude Code выбирает одни из них в строго определенном порядке:
- Учетные данные облачного провайдера, если установлены
CLAUDE_CODE_USE_BEDROCK,CLAUDE_CODE_USE_VERTEXилиCLAUDE_CODE_USE_FOUNDRY. - Переменная
ANTHROPIC_AUTH_TOKEN, передаваемая в заголовкеAuthorization: Bearer. - Переменная
ANTHROPIC_API_KEY, передаваемая в заголовкеX-Api-Key. - Вывод скрипта
apiKeyHelper. - Переменная
CLAUDE_CODE_OAUTH_TOKEN, содержащая токен изclaude setup-token. - Учетные данные профиля Anthropic и федерации.
- Учетные данные подписки OAuth, которые записывает
/login.
Прочитайте этот список снизу вверх. /login записывает учетные данные на последнее место, что в Linux приводит к созданию файла ~/.claude/.credentials.json с правами доступа 0600. Любые учетные данные из среды, стоящие выше в списке, имеют приоритет. Таким образом, повторный вход в систему обновляет учетные данные, которые сессия никогда не запрашивает: вход выполнен успешно, но эти данные проигрывают в приоритете. Именно поэтому очевидное решение не дает результата.
Интерактивные сессии добавляют еще один шаг, который сбивает пользователей с толку. В документации указано, что при обнаружении API-ключа в среде вам один раз предложат одобрить или отклонить его использование, и ваш выбор будет запомнен. Одобрение, которое вы подтвердили несколько месяцев назад, все еще действует. Вы можете изменить его с помощью переключателя "Use custom API key" в /config, но этот переключатель появляется только при наличии переменной ANTHROPIC_API_KEY в вашей среде. В неинтерактивном режиме, например при выполнении claude -p внутри скрипта или cron-задачи, запрос не выводится вовсе: ключ используется всегда, если он присутствует.
Как найти «забытый» ANTHROPIC_API_KEY на VPS?
Сначала убедитесь, что он существует в оболочке, из которой вы запускаете Claude Code.
env | grep -i anthropicЗатем выполните исправление, предложенное на странице устранения неполадок Anthropic, которое одновременно служит тестом:
unset ANTHROPIC_API_KEY
claudeЕсли Claude Code запускается, а /status теперь указывает на вашу подписку, значит, причина найдена. Переменная вернется в следующей оболочке, так как unset меняет настройки только в той оболочке, где была введена. Остальная часть этого раздела посвящена поиску места, где она задается.
Профили оболочки и системные файлы окружения
grep -rn ANTHROPIC ~/.bashrc ~/.bash_profile ~/.profile ~/.zshrc \
~/.config/fish/config.fish /etc/environment /etc/profile /etc/profile.d/ 2>/dev/nullНа странице Anthropic упоминаются ~/.zshrc, ~/.bashrc и ~/.profile. На сервере расширьте область поиска. Файл /etc/environment считывается PAM (pluggable authentication modules) при входе любого пользователя в систему — именно так ключ, установленный коллегой, попадает в вашу сессию. Файлы в /etc/profile.d/ выполняются для оболочек входа. Учтите, что .bashrc считывается только интерактивными оболочками, поэтому он не может объяснить сбой внутри systemd-сервиса. Файл, который имеет значение, зависит от того, как был запущен Claude Code.
Юниты systemd
Юнит не считывает ваш профиль оболочки. Его окружение формируется из строк Environment= и EnvironmentFile= в самом юните и любых дополнительных конфигурационных файлах (drop-in).
systemctl cat claude-agent.service
systemctl show -p Environment claude-agent.servicesystemctl cat выводит содержимое файла юнита и всех drop-in файлов из /etc/systemd/system/claude-agent.service.d/, где обычно скрывается переопределение. systemctl show -p Environment выводит то, что systemd фактически передаст процессу. Для сервиса, работающего от имени вашего пользователя, добавьте --user к обеим командам. После редактирования юнита выполните sudo systemctl daemon-reload и перезапустите сервис, так как окружение формируется в момент запуска процесса, а работающий процесс сохраняет полученную копию.
Сессии tmux и screen, пережившие ваши правки
Эта проблема отнимает у людей часы работы. Сервер tmux сохраняет окружение, с которым он был запущен, а новые панели наследуют его от сервера, а не от вашей текущей оболочки. Вы удаляете export из .bashrc, открываете новую панель, а старый ключ всё ещё на месте.
tmux show-environment | grep -i ANTHROPIC
tmux set-environment -r ANTHROPIC_API_KEYset-environment -r помечает имя для удаления из окружения, которое tmux передает новым процессам, а добавление -g делает то же самое для глобального окружения сервера. Уже открытые панели сохраняют свою копию, так как окружение процесса можно изменить только изнутри самого процесса. Надежный способ после удаления export — отсоединиться, выполнить tmux kill-server и начать новую сессию. screen ведет себя аналогично. Это стоит знать перед настройкой длительной сессии Claude Code в tmux на VPS, так как такая сессия — это именно тот тип процесса, который переживет три раунда правок конфигурации.
Чтобы прочитать окружение уже запущенного процесса, запросите его у ядра:
tr '\0' '\n' < /proc/$(pgrep -n claude)/environ | grep -i anthropicЭта команда выводит значения, которые были переданы процессу во время выполнения exec — именно их он и использует. Вы должны быть владельцем процесса или root, чтобы прочитать этот файл, а pgrep -n claude выбирает наиболее подходящий вариант, поэтому проверьте PID, если запущено несколько процессов.
Docker и Compose
docker exec claude-agent env | grep -i anthropic
docker compose configПервая команда показывает окружение внутри работающего контейнера, включая всё из --env-file, блока environment: или строки ENV, внедренной в образ. docker compose config выводит файл compose с разрешенными переменными, поэтому вы увидите значение, которое будет передано, а не плейсхолдер ${ANTHROPIC_API_KEY}, который вы написали. Обе команды выводят секреты в ваш терминал, поэтому запускайте их в сессии, которую вы готовы очистить. Compose также автоматически загружает файл .env, находящийся рядом с файлом compose, и это обычный источник ключа, о добавлении которого никто не помнит.
Файл настроек, который переживает любую правку оболочки
Файлы настроек Claude Code содержат блок env, и документация прямо указывает на конфликт: если одна и та же переменная задана и в оболочке, и в блоке env файла настроек, применяется значение из файла настроек. Ключ, записанный там, перекрывает любой unset, который вы вводите.
grep -rn ANTHROPIC ~/.claude/settings.json .claude/settings.json .claude/settings.local.json 2>/dev/nullПроверяйте как файлы проекта, так и пользовательский файл. .claude/settings.json обычно добавляется в репозиторий, поэтому он доступен всем, кто его клонирует. Организации также могут принудительно устанавливать управляемые настройки, которые имеют приоритет над вашими файлами. Если вы нашли ключ, который не можете удалить, обратитесь к администраторам.
Другая ветка: ключ действительно неверный
Если /status показывает API-ключ, а вы предполагали, что он верный, воспринимайте ошибку буквально. Справочник ошибок Anthropic указывает следующие причины для Invalid API key:
- Ключ поврежден или неверен.
- Ключ был отозван или истек.
- Ключ принадлежит другой организации или учетной записи.
Проверьте значение, не выводя его в историю терминала:
echo "len=${#ANTHROPIC_API_KEY} tail=${ANTHROPIC_API_KEY: -6}"Длина, превышающая ожидаемую на один или два символа, обычно означает, что при копировании попал символ переноса строки или кавычка, либо $(cat keyfile) захватил перенос строки в конце файла. Значение отправляется в заголовке X-Api-Key, поэтому лишний символ означает, что отправленные учетные данные не совпадают с созданным вами ключом.
Проверьте ANTHROPIC_AUTH_TOKEN в том же выводе, так как этот параметр находится выше API-ключа в списке. Оставшийся bearer token от экспериментов с прокси означает, что ключ, который вы пытаетесь исправить, вообще не используется для аутентификации. Также стоит изучить ANTHROPIC_BASE_URL в этом выводе, поскольку старое значение может указывать клиенту на шлюз, который больше не существует. Общую картину на уровне заголовков описывает как работает аутентификация по API-ключу Anthropic. Прежде чем решать, какие именно учетные данные должны храниться на этой машине, ознакомьтесь с различиями между входом по подписке и API-ключом.
Эта ошибка точно не связана с нехваткой ресурсов. Если сессия проходит аутентификацию, а запросы начинают завершаться с ошибкой в процессе работы, вы столкнулись с ошибкой перегрузки модели, которая не требует смены учетных данных.
Почему мой скрипт apiKeyHelper завершается с ошибкой?
apiKeyHelper — это ключ настроек, указывающий на скрипт, который Claude Code запускает для получения учетных данных. Он предназначен для ротации или использования кратковременных токенов, например, ключей, полученных из хранилища. Условия просты: вывести текущий ключ в стандартный поток вывода и завершиться с кодом успеха. В документации указано, что если скрипт завершается с ошибкой, превышает время ожидания или ничего не выводит, запросы будут завершаться с ошибкой Your apiKeyHelper script is failing после трех попыток.
Запустите его вручную и проверьте выполнение обоих условий:
out=$(/usr/local/bin/anthropic-key.sh)
echo "exit=$? len=${#out} tail=${out: -6}"Ненулевой код завершения считается ошибкой, даже если ключ был выведен корректно. Вспомогательный скрипт, который выводит Fetching credential... в стандартный поток вывода перед самим ключом, также вызывает ошибку, так как эта строка становится частью учетных данных. Выводите сообщения о ходе выполнения в стандартный поток ошибок.
Затем протестируйте скрипт так, как его будет запускать сервис:
env -i HOME="$HOME" PATH=/usr/bin:/bin /usr/local/bin/anthropic-key.sh
echo "exit=$?"env -i запускает скрипт с практически пустым окружением. Вспомогательный скрипт, вызывающий aws, vault или gcloud из каталога, который ваш .bashrc добавляет в PATH, будет работать при ручном тестировании, но завершится ошибкой в рабочей среде, так как запущенный процесс Claude Code не считывает ваш .bashrc. Убедитесь, что скрипт исполняемый и что все вызываемые им команды используют абсолютные пути, либо задайте PATH непосредственно внутри самого скрипта.
На сервере важны еще два задокументированных поведения. По умолчанию Claude Code перезапускает вспомогательный скрипт каждые пять минут, а CLAUDE_CODE_API_KEY_HELPER_TTL_MS задает другой интервал. Если настройка работает при запуске, но перестает работать через час, значит, проблема возникает при обновлении, а не при старте. Если для получения ключа скрипту требуется более десяти секунд, Claude Code отображает предупреждение в строке подсказок с указанием прошедшего времени. Это уведомление означает медленный вызов, а не поломку, и служит ранним предупреждением до того, как таймаут приведет к ошибке.
Действительно ли вам нужен API key на этом сервере?
Решение не всегда заключается в удалении. Оставьте ключ, если у машины есть основания для отдельной тарификации:
- Автономный агент на VPS, оплачиваемый через Console, не расходует лимиты подписки пользователя.
- Неинтерактивные запуски, где
claude -pне имеет терминала для подтверждения действий, и ключ используется всегда при его наличии. - Машины, к которым не привязана подписка.
- Общая или клиентская машина, на которой не следует хранить данные для входа в личную подписку.
Обычно всё решает стоимость, и сравнение цен на API и подписку поможет вам определиться.
Удалите ключ, если это ваша машина и вы уже платите за подписку. Затем закрепите это удаление. Вместо экспорта ключа в ~/.bashrc, откуда его наследует каждая интерактивная оболочка, передайте его только тому сервису, которому он нужен:
[Service]
EnvironmentFile=/etc/claude-agent.envУстановите для этого файла права 600, владельцем должен быть пользователь, от имени которого работает сервис. Ваши интерактивные сессии не увидят его, поэтому ваш собственный claude продолжит использовать подписку, а сервис — ключ. Если вам нужны учетные данные подписки там, где нет браузера, claude setup-token выведет OAuth-токен, который можно вставить в CLAUDE_CODE_OAUTH_TOKEN. Стоит ознакомиться с документированными ограничениями этого метода, прежде чем полагаться на него: он позволяет выполнять только запросы к моделям, поэтому сессии Remote Control и коннекторы к claude.ai через него недоступны. Однократное принятие решения для каждой машины и запись его в unit-файл предотвращают сбои, о которых идет речь на этой странице, поскольку они часто возникают из-за ключа, о настройке которого никто не помнит. Ограничение доступа для этих учетных данных — отдельная задача, описанная в безопасном запуске Claude Code на VPS.
Предостережение перед использованием радикальных мер. /logout удаляет сохраненные учетные данные, и в документации указано, что это также очищает сохраненные логины серверов MCP (model context protocol) и секреты плагинов, поэтому будьте готовы повторно авторизовать их после этого.
FAQ
Почему Claude Code сообщает о неверном API key, если у меня оформлена подписка?
Потому что ANTHROPIC_API_KEY в переменных окружения имеет приоритет над авторизацией по подписке. В документации Anthropic указано, что ключ, заданный в окружении, используется вместо вашей подписки Pro, Max, Team или Enterprise, даже если вы вошли в систему. В неинтерактивном режиме с -p ключ используется всегда, если он присутствует. Выполните /status внутри Claude Code, чтобы увидеть, какие учетные данные выбрала сессия. Если отображается строка API key, а вы не задавали её намеренно, выполните unset ANTHROPIC_API_KEY и запустите claude снова, чтобы подтвердить причину.
Исправляет ли выполнение /login ошибку неверного API key?
Нет, пока установлена переменная окружения. /login записывает OAuth-данные подписки, которые находятся в самом низу иерархии учетных данных Claude Code — ниже переменных окружения и ниже apiKeyHelper. Вход в систему проходит успешно, но затем игнорируется, поэтому повторные попытки ничего не меняют. Удалите переменную из места, где она задана, или выключите переключатель "Use custom API key" в /config, который, согласно документации, появляется только при наличии ANTHROPIC_API_KEY в вашем окружении.
Как узнать, какой метод аутентификации использует Claude Code?
Выполните /status в сессии. В документации описана строка Login method, отображающая аккаунт подписки, и строка API key, которая появляется при использовании API key. Сравните это с env | grep -i anthropic в той же оболочке, из которой вы запустили программу. Если Claude Code запущен в сервисе или контейнере, проверьте окружение процесса с помощью tr '\0' '\n' < /proc/<pid>/environ, так как запущенный процесс сохраняет окружение, полученное при старте, а не то, которое активно в вашей текущей оболочке.
Мой скрипт apiKeyHelper работает при запуске вручную. Почему Claude Code всё равно выдает ошибку?
Обычно дело в окружении или коде завершения. Claude Code запускает вспомогательный скрипт из собственного процесса, который не считывает ваш профиль оболочки. Поэтому скрипт, зависящий от записи PATH в .bashrc, завершается ошибкой, хотя работает в терминале. Протестируйте его с помощью env -i HOME="$HOME" PATH=/usr/bin:/bin /path/to/helper и проверьте echo $? после выполнения. Документированная ошибка возникает, если скрипт завершается с кодом ошибки, превышает время ожидания или ничего не выводит; это проявляется как Your apiKeyHelper script is failing. Любой вывод в стандартный поток вывода (stdout), кроме самого ключа, становится частью учетных данных, поэтому сообщения о ходе выполнения направляйте в стандартный поток ошибок (stderr).