Claude Code のエラー

Failed to authenticate. API Error: 401 OAuth access token is invalid.

結論

OAuthトークンの値が拒否された状態。claude setup-token で発行し直すか、変数を外して /login する。

確認した版 Claude Code v2.1.283
確認日 2026年9月26日
最終更新 2026年9月26日
根拠 実機で確認

エラー文字列

Claude Code
Failed to authenticate. API Error: 401 OAuth access token is invalid.

⚠️ 標準エラーではなく標準出力に出ます。終了コードは 1 です。 claude -p の出力をそのまま使っていると、この文字列が回答として入ります。

何が起きているか

環境変数 CLAUDE_CODE_OAUTH_TOKEN に入っている値を、API が拒否しました。

⭐ 値は読まれています。 読まれたうえで、トークンとして通らなかった状態です。 表示を見れば、どの経路の認証で落ちたかが分かります。v2.1.283 で実測した対応表です。

渡したもの 実際に出た表示
何も渡していない Not logged in · Please run /login
無効な ANTHROPIC_API_KEY Failed to authenticate. API Error: 401 API key is invalid.
無効な CLAUDE_CODE_OAUTH_TOKEN Failed to authenticate. API Error: 401 OAuth access token is invalid.
失敗する apiKeyHelper Your apiKeyHelper script is failing

🔴 API キーがあると、トークンは使われない

ANTHROPIC_API_KEY と CLAUDE_CODE_OAUTH_TOKEN を両方置いて実行すると、 表示は 401 API key is invalid. になりました。API キーの方が使われています。

⚠️ つまり、この表示が出ているなら ANTHROPIC_API_KEY は設定されていません。 逆に、トークンを直したのに表示が API key is invalid に変わった場合は、どこかに API キーが残っています。

⚠️ claude auth status では見分けられない

無効なトークンを入れた状態でも、claude auth status は "loggedIn": true を返しました(終了コード 0)。

{
  "loggedIn": true,
  "authMethod": "oauth_token"
}

「トークンがあるか」を見ているだけで、有効かどうかは確かめていません。 CI の事前確認に auth status を使っても、このエラーは防げません。

直し方

1. 実際に入っている値を確認する

Windows(PowerShell)

if ($env:CLAUDE_CODE_OAUTH_TOKEN) {
  "長さ: {0}" -f $env:CLAUDE_CODE_OAUTH_TOKEN.Length
  "先頭: {0}" -f $env:CLAUDE_CODE_OAUTH_TOKEN.Substring(0, [Math]::Min(14, $env:CLAUDE_CODE_OAUTH_TOKEN.Length))
  "前後の空白や改行: {0}" -f ($env:CLAUDE_CODE_OAUTH_TOKEN -ne $env:CLAUDE_CODE_OAUTH_TOKEN.Trim())
} else { "CLAUDE_CODE_OAUTH_TOKEN は設定されていません" }

macOS / Linux

printf '長さ: %s\n' "${#CLAUDE_CODE_OAUTH_TOKEN}"
printf '先頭: %.14s\n' "$CLAUDE_CODE_OAUTH_TOKEN"

⚠️ トークンの全体を画面やログに出さないこと。 長さと先頭数文字で足ります。

2. トークンを発行し直す

claude setup-token

v2.1.283 のヘルプでは「長期間使える認証トークンを発行する(Claude の契約が必要)」と説明されています。

⚠️ ブラウザでの認証を伴います。 CI の中では実行できません。手元の端末で発行し、 出てきた値を CI のシークレットに入れ直してください。

3. 手元では変数を外して /login を使う

手元の端末なら、トークンを環境変数で渡す必要はありません。

macOS / Linux

unset CLAUDE_CODE_OAUTH_TOKEN
claude

Windows(PowerShell)

Remove-Item Env:CLAUDE_CODE_OAUTH_TOKEN
claude

起動したら /login を実行します。

⭐ 変数を外して claude -p "hi" の表示が Not logged in · Please run /login に変われば、 原因はその変数だったと確定できます。

再発防止

  • CI には API キーかトークンのどちらか一方だけを渡す。両方あると API キーが優先され、トークンを直しても効かない
  • claude auth status を事前確認に使わない。有効かどうかは確かめていない
  • claude -p の終了コードを見る。この表示は標準出力に出るため、回答として受け取ってしまう

この手順で直りませんでしたか?

環境を添えて報告いただければ、追加の原因を検証してこのページに反映します。

エラーを報告する