SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor

Claude Codeの無効なAPI keyエラーを解決する方法

Claude Codeで「invalid API key」と表示されても、契約中のサブスクリプションが原因とは限りません。VPSに残ったANTHROPIC_API_KEYが/loginより優先される仕組みと確認方法を解説します。

Claude Codeで無効なAPI keyエラーが表示される理由

Claude CodeがInvalid API keyで失敗する理由は2つあり、対処方法は正反対です。API keyで認証するつもりで、そのkeyが間違っている、失効している、または別のアカウントのものである場合があります。あるいは、そもそもkeyを使うつもりがなく、サーバーの環境に残ったANTHROPIC_API_KEYが、ログインしているsubscriptionより優先されている場合があります。2026年10月時点のAnthropicのドキュメントでは、後者について明確に説明されています。環境に設定されたkeyの使用を承認すると、ログイン中であってもClaude Pro、Max、Team、またはEnterpriseのsubscriptionではなく、そのkeyが使用されます。claude -pを使用している場合、keyが存在すれば常にそのkeyが使用されます。

変更を加える前に、どちらのケースに該当するかを確認してください。Claude Codeを起動し、/statusを実行します。ドキュメントでは、subscription accountを示すLogin method行と、API keyの使用時に表示されるAPI key行について説明しています。/loginだけを実行してきたサーバーでAPI keyの行が表示された場合は、環境、設定、およびapiKeyHelperを確認してください。再認証しても、これらの認証情報は削除されません。

以下は、各自のサーバーで実行するコマンドです。実行結果を確認してから操作してください。

認証情報の優先順位と、/login では解決しない理由

複数の認証情報が存在する場合、Claude Code は文書化された順序で 1 つを選択します。

  • CLAUDE_CODE_USE_BEDROCK、CLAUDE_CODE_USE_VERTEX、または CLAUDE_CODE_USE_FOUNDRY が設定されている場合は、クラウドプロバイダーの認証情報。
  • Authorization: Bearer ヘッダーとして送信される ANTHROPIC_AUTH_TOKEN 変数。
  • X-Api-Key ヘッダーとして送信される ANTHROPIC_API_KEY 変数。
  • apiKeyHelper スクリプトの出力。
  • claude setup-token のトークンを保持する CLAUDE_CODE_OAUTH_TOKEN 変数。
  • ANTHROPIC_PROFILE で明示的に選択した Anthropic プロファイル、環境変数で選択したフェデレーション認証情報、oidc_federation 認証を使用するアクティブまたはデフォルトのプロファイル。
  • /login が書き込むサブスクリプション OAuth 認証情報。
  • user_oauth 認証を使用するアクティブまたはデフォルトの Anthropic プロファイル。ただし、ANTHROPIC_PROFILE で明示的に選択されている場合を除きます。

このリストを下から確認します。/login はサブスクリプション OAuth 認証情報を書き込みます。Linux では、これはファイルモード 0600 の ~/.claude/.credentials.json に保存されます。これらは、ANTHROPIC_PROFILE で明示的に選択されていない限り、アクティブまたはデフォルトの user_oauth プロファイルより優先されます。ただし、環境変数の認証情報と apiKeyHelper よりは下位です。承認済みの環境変数 API キーは、サブスクリプションのログインより優先されます。そのため、新しいログインによって更新されるのは、セッションが参照しない認証情報です。ログイン自体は成功していても、結果として認証情報の選択には影響しません。明らかな対処が何も変えない理由はこれです。CLAUDE_CODE_OAUTH_TOKEN を使用すると、/login は現在のセッションを新しいログインに切り替えます。ただし、削除するまで新しいセッションでは再び変数が読み込まれます。Claude apps のゲートウェイにサインインしたセッションはこの優先順位の対象外です。クラウドプロバイダーの変数が設定されていても、これらの認証情報ではなくゲートウェイトークンを使用します。

対話型セッションには、混乱を招く追加の手順があります。ドキュメントによると、環境変数にある API キーを使用するかどうかを承認または拒否するよう、1 回だけ確認され、その選択が記憶されます。数か月前に承認していた場合、その承認は有効なままで、キーはログインより優先され続けます。拒否していた場合、キーは再確認なしで無視されます。そのため、別の問題が発生します。変数は設定され、env にも表示されるのに、セッションでは使用されません。/config の "Use custom API key" トグルで、どちらの選択も変更できます。ただし、このトグルは環境に ANTHROPIC_API_KEY が設定されている間だけ表示されます。非対話型モード、つまりスクリプトや cron ジョブ内の claude -p では、確認は一切表示されません。キーが存在すれば、常に使用されます。

VPS 上に残っている ANTHROPIC_API_KEY を見つけるにはどうすればよいですか?

まず、Claude Code を起動する shell にその変数が存在することを確認します。

env | grep -i anthropic

次に、Anthropic のトラブルシューティングページにある修正コマンドを実行します。このコマンドは確認テストも兼ねています。

unset ANTHROPIC_API_KEY
claude

Claude Code が起動し、/status にサブスクリプションが表示される場合、原因を特定できています。起動ファイルが変数を設定していると、次の shell で再び変数が現れます。これは unset が、入力した shell にしか変更を適用しないためです。このセクションでは、その変数を設定している場所を探します。

Shell のプロファイルとシステム全体の環境ファイル

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 が挙げられています。サーバーでは検索範囲を広げてください。ログインの PAM (pluggable authentication modules) 設定で有効になっている場合、pam_env モジュールは /etc/environment を読み込みます。これにより、システム全体のキーがセッションに設定されます。/etc/profile.d/ 内のファイルは、ログイン shell のプロファイルから読み込まれたときに実行されます。systemd サービスは .bashrc を自動的には読み込みません。コマンドが明示的に shell を起動しているか、プロファイルを読み込んでいるかを確認してください。確認すべきファイルは、Claude Code の起動方法によって異なります。

systemd の unit

unit は shell のプロファイルを読み込みません。その環境には、unit と drop-in にある Environment= および EnvironmentFile= の行に加え、サービスマネージャーから渡された変数が含まれます。

systemctl cat claude-agent.service
systemctl show -p Environment claude-agent.service

systemctl cat は、unit ファイルと drop-in を、/etc/systemd/system/claude-agent.service.d/ 以下の override を含めて表示します。systemctl show -p Environment は unit の Environment= の設定を表示します。EnvironmentFile= ファイルも確認してください。これらの内容は、プロセス起動時に別途読み込まれるためです。自分の user で実行するサービスでは、両方のコマンドに --user を追加します。unit を編集したら sudo systemctl daemon-reload を実行してサービスを再起動してください。環境はプロセス起動時に組み立てられ、実行中のプロセスは渡された環境のコピーを保持するためです。

編集後も残っている tmux と screen のセッション

ここで何時間も費やすことがあります。tmux server は起動時の環境を保持し、新しい pane は global 環境と session 環境を統合したものを継承します。.bashrc から export を削除して新しい pane を開いても、古いキーが残っています。

tmux show-environment | grep -i ANTHROPIC
tmux set-environment -r ANTHROPIC_API_KEY

set-environment -r は、tmux が新しいプロセスに渡す環境から削除する名前を指定します。-g を追加すると、server の global 環境からも同じように削除できます。すでに開いている pane は独自のコピーを保持します。プロセスの環境は、そのプロセスの内部からしか変更できないためです。export を削除した後は、detach して tmux kill-server を実行し、新しい session を開始するのが確実です。VPS 上で 長時間実行する Claude Code の tmux セッションを設定する前に、この点を把握しておいてください。そのような session は、設定を 3 回編集しても存続する可能性があるプロセスです。

実行中のプロセスの環境を読むには、kernel に要求します。

tr '\0' '\n' < /proc/$(pgrep -n claude)/environ | grep -i anthropic

これは、exec 時にプロセスへ渡された値を表示します。Claude Code が設定から読み込んだ値など、後から行われた変更は反映されません。このファイルを読むには、プロセスの所有者または root である必要があります。pgrep -n claude は最新の一致を選ぶため、複数のプロセスが実行中の場合は PID を確認してください。

Docker と Compose

docker exec claude-agent env | grep -i anthropic
docker compose config

最初のコマンドは、実行中の container 内の環境を表示します。--env-file、environment: block、または image に組み込まれた ENV 行の内容も含まれます。docker compose config は、変数を解決した状態の compose ファイルを表示します。記述した ${ANTHROPIC_API_KEY} placeholder ではなく、渡される値を確認できます。どちらのコマンドも terminal に secrets を表示するため、必要に応じて消去できる session で実行してください。Compose は interpolation 用に、project directory の .env ファイルもデフォルトで読み込みます。Compose configuration がその値を渡す設定になっていれば、container に到達します。

すべての shell の修正後も残る settings ファイル

Claude Code の settings ファイルには env block が含まれます。ドキュメントでは競合時の動作も明記されています。同じ変数が shell と settings ファイルの env block の両方で設定されている場合、多くの session では settings ファイルの値が適用されます。例外は、Claude Desktop app または self-hosted environment runner が起動した session です。この場合は launch environment が優先されます。サーバーの terminal で起動した claude では、そこに書かれたキーが、入力したすべての unset より優先されます。

grep -rn ANTHROPIC ~/.claude/settings.json .claude/settings.json .claude/settings.local.json 2>/dev/null

user file だけでなく project files も確認してください。.claude/settings.json は通常 commit されるため、repository を clone する全員で共有されます。組織が managed settings を配布することもあり、その場合は自分のファイルより優先されます。削除できないキーが見つかった場合は、組織の担当者に確認してください。

もう一方の分岐: キー自体が正しくない場合

/status に API key が表示され、それが意図したものである場合は、エラーをそのまま受け止めてください。Anthropic のエラーリファレンスによると、Invalid API key · Fix external API key は、API が ANTHROPIC_API_KEY または apiKeyHelper script から渡された key を拒否したか、送信前に Claude Code が key をブロックしたことを示します。このエラーでは、次を確認します。

  • key の入力ミスを確認します。
  • Console で key が revoke されていないことを確認します。
  • direnv、dotenv shell plugin、IDE terminal などが、プロジェクトの .env file から古い key を読み込んでいないことを確認します。

scrollback に値を出力せずに確認します。

echo "len=${#ANTHROPIC_API_KEY} tail=${ANTHROPIC_API_KEY: -6}"

想定より 1 文字または 2 文字長い場合は、通常、copy and paste の際に改行または quote が含まれたか、Windows line ending で保存された key file に carriage return が残っています。$(cat keyfile) で file を読み取っても、末尾の通常の newline は残りません。Bash が command substitution の出力から末尾の newline を削除するためです。ただし、その newline の直前にある carriage return は削除されません。そのため、Windows line ending の file では、variable に余分な 1 文字が残ります。現在の version は、送信前に header に含められない文字を検出します。Fix external API key の後に Invalid X-Api-Key header value from ANTHROPIC_API_KEY: it contains a line break のような説明が続く場合、Claude Code は request を停止し、API が key を受け取ることはありません。curly quote も同じ check で検出されます。一方、straight quote は有効な header character なので、X-Api-Key header の一部として送信されます。その結果、送信された credential は作成した key ではありません。

ANTHROPIC_AUTH_TOKEN も同じ output で確認してください。順序上、API key より上にあるためです。proxy の試行で残った bearer token がある場合、修正しようとしている key は、実際に送信される credential ではありません。ANTHROPIC_BASE_URL もその output で確認する価値があります。古い値があると、client がすでに存在しない可能性のある gateway を指すためです。header レベルの全体像については、Anthropic API key authentication の仕組みで、それぞれの値が何を運ぶかを確認できます。この machine で使用する credential の種類を決める前に、subscription login と API key の違いも参照してください。

このエラーは capacity の問題ではありません。request が 529 Overloaded で失敗する場合は、overloaded model error に該当します。この場合、credential を変更する必要はありません。

APIキー用ヘルパースクリプトが失敗するのはなぜですか?

apiKeyHelper は、Claude Code が認証情報を取得するために実行するスクリプトを指定する設定キーです。Vault から取得したキーなど、ローテーションするトークンや短期間だけ有効なトークンに使用します。契約は単純です。現在のキーを標準出力に出力し、正常終了します。ドキュメントによると、エラー終了、タイムアウト、または出力なしとなるスクリプトを使うと、3 回以内の試行で Your apiKeyHelper script is failing によりリクエストが失敗します。

手動で実行し、この契約の両方を確認します。

out=$(/usr/local/bin/anthropic-key.sh)
echo "exit=$? len=${#out} tail=${out: -6}"

キーを正しく出力していても、終了コードが 0 以外なら失敗です。キーの前に Fetching credential... を標準出力へ出力するヘルパーも失敗します。v2.1.227 以降、Claude Code はキー以外を含む出力を拒否し、ヘルパーが returned output that cannot be used as an API key と報告します。以前のバージョンでは、その行も認証情報の一部として送信されていました。進行状況のメッセージは標準エラー出力へ送ります。セッション内では、/status に、最後の終了コードとエラー出力を含む Failing を読み取る apiKeyHelper 行が表示されます。

次に、サービスから実行される方法でテストします。

env -i HOME="$HOME" PATH=/usr/bin:/bin /usr/local/bin/anthropic-key.sh
echo "exit=$?"

env -i は、ほぼ空の環境でスクリプトを起動します。.bashrc が PATH に追加するディレクトリから aws、vault、または gcloud を呼び出すヘルパーは、テスト時には動作しても、そのディレクトリを起動環境に含まないサービスでは失敗します。スクリプトに実行権限があることを確認し、スクリプトが呼び出すすべてのものに絶対パスを使用します。または、スクリプト内で PATH を設定します。

サーバーでは、ドキュメントに記載された動作がさらに 2 つあります。Claude Code はデフォルトで 5 分後にヘルパーを再実行します。CLAUDE_CODE_API_KEY_HELPER_TTL_MS で別の間隔を設定できます。そのため、起動時には動作して 1 時間後に失敗する構成は、起動時ではなく更新時に失敗しています。ヘルパーがキーを返すまでに 10 秒を超えると、Claude Code は経過時間とともにプロンプトバーへ警告を表示します。この警告は呼び出しが遅いことを示すもので、壊れていることを示すものではありません。タイムアウトがエラーになる前に検知するための早期警告です。

このマシンに本当に API key が必要ですか?

修正方法は、必ずしも削除ではありません。マシンを個別に課金する理由がある場合は、key を残します。

  • Console に課金される VPS 上の無人エージェントは、個人のサブスクリプションの利用上限を消費しません。
  • 非対話的な実行では、claude -p に承認操作を行うターミナルがなく、key が存在すれば常に使用されます。
  • サブスクリプションを関連付けていないマシン。
  • 共有マシンまたはクライアント用マシン。個人のサブスクリプションログインを保存すべきではありません。

通常はコストで判断します。判断にはAPI とサブスクリプションの料金比較を使用します。

マシンが自分のもので、すでに支払っているサブスクリプションを使う場合は、key を削除します。そのうえで、削除状態を維持します。すべての対話シェルが継承する ~/.bashrc に key を export するのではなく、必要なサービスだけに渡します。

[Service]
EnvironmentFile=/etc/claude-agent.env

このファイルのモードは 600 にし、サービスを実行するユーザーが所有するようにします。対話セッションからはこのファイルを参照できません。そのため、自分の claude はサブスクリプションを使い続け、サービスは key を使い続けます。ブラウザーがない環境でサブスクリプションの認証情報が必要な場合は、claude setup-token で OAuth token を出力し、CLAUDE_CODE_OAUTH_TOKEN に貼り付けられます。利用前に、ドキュメントに記載された制限を確認してください。これは model request のみ実行できるため、Remote Control セッションと claude.ai connector は利用できません。この判断をマシンごとに一度行い、unit file に記録することが重要です。これにより、このページで扱う問題を防げます。この問題は、誰も設定した覚えのない key から始まるためです。認証情報を設定した後に、その認証情報がアクセスできる範囲を制限する作業は別途必要です。詳しくはVPS 上で Claude Code を安全に実行するを参照してください。

強力な削除操作を実行する前に、1 点注意してください。/logout は保存済みの認証情報を削除します。ドキュメントによると、保存済みの MCP (model context protocol) server login と plugin secret も削除されます。そのため、後で再認証が必要になります。

FAQ

Claude Code でサブスクリプションを契約しているのに、invalid API key と表示されるのはなぜですか?

環境変数に設定した ANTHROPIC_API_KEY が、承認後のサブスクリプションログインより優先されるためです。Anthropic のドキュメントによると、環境変数に設定された承認済みのキーは、ログイン済みであっても Pro、Max、Team、Enterprise のサブスクリプションの代わりに使用されます。また、非対話モードで -p を使用すると、キーが存在する場合は常にそのキーが使用されます。Claude Code 内で /status を実行すると、セッションが選択した認証情報を確認できます。API key の行が表示され、意図して設定した覚えがない場合は、unset ANTHROPIC_API_KEY を実行してから claude を再度起動し、原因を確認します。

/login を実行すれば、invalid API key エラーは解消しますか?

承認済みの環境変数の API キーが使用されている間は解消しません。/login は、サブスクリプションの OAuth 認証情報を環境変数の認証情報および apiKeyHelper より下位に書き込みます。ただし、ANTHROPIC_PROFILE がアクティブな、またはデフォルトの user_oauth profile を明示的に選択している場合を除き、その profile より上位に書き込みます。ログイン自体は成功しますが、その後に無視されるため、繰り返しても何も変わりません。設定元から変数を削除するか、/config の "Use custom API key" toggle をオフにします。ドキュメントによると、この toggle は環境に ANTHROPIC_API_KEY が設定されている場合にのみ表示されます。

Claude Code が使用している認証方式を確認するにはどうすればよいですか?

セッション内で /status を実行します。ドキュメントでは、サブスクリプションアカウントを示す Login method の行と、API key の使用時に表示される API key の行について説明されています。これを、起動元と同じ shell での env | grep -i anthropic と比較します。サービスまたはコンテナが Claude Code を実行している場合は、tr '\0' '\n' < /proc/<pid>/environ で起動環境を調べます。このファイルには exec 時に渡された値が表示されるため、Claude Code が後から読み込む設定ファイルの値も確認します。

apiKeyHelper script は実行できるのに、Claude Code が失敗するのはなぜですか?

通常は、環境または終了ステータスが原因です。Claude Code は独自のプロセス環境で helper を実行するため、端末の環境にある PATH entry がサービスにないと、端末でテストしたときは動作する command を見つけられません。env -i HOME="$HOME" PATH=/usr/bin:/bin /path/to/helper でテストし、その後 echo $? を確認します。ドキュメントで定義されている失敗には、script が error で終了する、タイムアウトする、何も出力しない、key 以外の内容を出力する場合が含まれ、Your apiKeyHelper script is failing として表面化します。v2.1.227 以降は、standard output に banner または log line が出力されると helper は直ちに失敗するため、進捗メッセージは standard error に送ります。

この記事は役に立ちましたか?