Claude API で 401 認証エラーが発生する症状
Claude API を使い始めたとき、あるいは順調に動いていたはずのプログラムが突然「401 Invalid API Key」エラーを返すことがあります。ターミナルやログに次のようなメッセージが表示されたら、認証まわりの問題です。
{
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API Key"
}
}このエラーは「送信されたAPIキーが正しくない」ことを意味しますが、原因はキーそのものの誤りだけではありません。環境変数の設定ミス、キーの失効、OAuthトークンの破損など、複数のパターンがあります。
原因1: APIキーが正しく設定されていない
最も多い原因は、環境変数 ANTHROPIC_API_KEY が未設定か、値が間違っているケースです。
確認方法
ターミナルで現在の設定値をチェックします。
# 環境変数が設定されているか確認(先頭10文字だけ表示)
echo "${ANTHROPIC_API_KEY:0:10}..."
# 設定されていなければ空が返る値が空、または sk-ant- で始まっていない場合は、設定に問題があります。
解決手順
# macOS / Linux: シェル設定ファイルに追加
echo 'export ANTHROPIC_API_KEY="sk-ant-api03-xxxxx..."' >> ~/.zshrc
source ~/.zshrc
# Windows (PowerShell): ユーザー環境変数に設定
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", "sk-ant-api03-xxxxx...", "User")
# PowerShellを再起動して反映よくある落とし穴: .env ファイルにキーを書いたつもりが、ファイルが別のディレクトリにある、またはアプリケーションが .env を読み込んでいないことがあります。Python であれば python-dotenv、Node.js であれば dotenv パッケージが正しくインポートされているか確認しましょう。
# Python: .env ファイルの読み込み確認
import os
from dotenv import load_dotenv
load_dotenv() # .env ファイルを読み込み
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
raise ValueError("ANTHROPIC_API_KEY が設定されていません")
print(f"API Key found: {api_key[:10]}...")
# 期待出力: API Key found: sk-ant-api...原因2: APIキーが失効・無効化されている
Anthropic Console でキーを再生成(Regenerate)したり、削除したりすると、古いキーは即座に無効になります。チームメンバーが意図せずキーを無効化してしまうケースもあります。
確認方法
- Anthropic Console にログイン
- 「API Keys」セクションで、使用中のキーがリストに存在するか確認
- キーのステータスが「Active」であることを確認
解決手順
キーが見つからない場合は、新しいキーを作成して環境変数を更新します。
# 新しいキーを設定
export ANTHROPIC_API_KEY="sk-ant-api03-新しいキー..."
# 動作確認(curlで簡易テスト)
curl -s https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 50,
"messages": [{"role": "user", "content": "Hello"}]
}' | head -c 200
# 期待出力: {"id":"msg_...","type":"message","role":"assistant",...}正常にレスポンスが返れば、新しいキーは有効です。.env ファイルやシークレット管理ツールの値も忘れずに更新しましょう。
原因3: リクエストヘッダーの形式が間違っている
Claude API では、APIキーの送信方法が他のAI APIとは異なります。OpenAI のように Authorization: Bearer sk-... ではなく、x-api-key ヘッダーを使います。
よくある間違いと正しい形式
import anthropic
# ❌ 間違い: Authorization ヘッダーに直接渡す
# requests.post(url, headers={"Authorization": f"Bearer {api_key}"})
# ✅ 正しい: Anthropic SDK を使う(内部で x-api-key ヘッダーを自動設定)
client = anthropic.Anthropic() # ANTHROPIC_API_KEY 環境変数を自動読み込み
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "こんにちは"}
]
)
print(message.content[0].text)
# 期待出力: こんにちは!何かお手伝いできることはありますか?SDK を使わずに直接 HTTP リクエストを送る場合は、必ず以下のヘッダーを含めてください。
# 必須ヘッダー
-H "x-api-key: YOUR_API_KEY"
-H "anthropic-version: 2023-06-01"
-H "Content-Type: application/json"原因4: Claude Code の OAuth 認証トークンが破損している
Claude Code(CLIツール)では、/login コマンドでブラウザ経由のOAuth認証を使います。このトークンが破損すると、ログイン成功と表示されるにもかかわらず「401 Invalid bearer token」エラーが発生します。
症状
$ claude
⎿ API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"Invalid bearer token"}}
解決手順
認証情報をクリアしてから再ログインします。
# Step 1: 認証情報を完全クリア
rm -rf ~/.claude/auth* 2>/dev/null
rm -rf ~/.claude/.credentials 2>/dev/null
# Step 2: 既存の環境変数を解除(API キーと OAuth が競合する場合がある)
unset ANTHROPIC_API_KEY
# Step 3: 再ログイン
claude /login
# Step 4: ブラウザで認証を完了し、ターミナルに戻って動作確認
claude "Hello, this is a test"それでも解決しない場合は、Claude Code を最新バージョンにアップデートしてから再試行してください。
# Claude Code のアップデート
npm install -g @anthropic-ai/claude-code@latest
# バージョン確認
claude --version原因5: プロキシ・VPN・ファイアウォールが干渉している
企業ネットワークや一部の国・地域では、プロキシやファイアウォールがAPIリクエストを改変し、認証ヘッダーが正しく送信されないことがあります。
確認方法
# プロキシ設定を確認
echo "HTTP_PROXY: $HTTP_PROXY"
echo "HTTPS_PROXY: $HTTPS_PROXY"
echo "NO_PROXY: $NO_PROXY"
# 直接接続テスト(プロキシをバイパス)
curl -v --noproxy '*' https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-4-6","max_tokens":10,"messages":[{"role":"user","content":"Hi"}]}' \
2>&1 | grep -E "HTTP/|error|auth"解決手順
プロキシ経由でAPIにアクセスする場合は、api.anthropic.com をプロキシの許可リストに追加するか、NO_PROXY に設定してバイパスします。
# api.anthropic.com をプロキシバイパスに追加
export NO_PROXY="api.anthropic.com,$NO_PROXY"VPN を利用している場合は、一時的にVPN をオフにしてテストすることで問題を切り分けられます。
原因6: API キーの権限・請求設定の問題
APIキー自体は有効でも、以下の理由で認証エラーが発生することがあります。
- クレジット残高がゼロ: 従量課金の場合、残高不足で認証拒否される
- キーのスコープ制限: ワークスペース単位で制限されたキーを別のワークスペースで使用
- アカウントの停止: 利用規約違反等でアカウントがサスペンドされている
確認手順
- Anthropic Console にログイン
- 「Billing」→ クレジット残高を確認
- 「Settings」→ アカウントステータスを確認
- APIキーの作成元ワークスペースと、リクエストで使用しているワークスペースが一致しているか確認
残高不足の場合は、クレジットを追加すれば即座に利用再開できます。
解決できたかの検証手順
問題を修正したら、以下のスクリプトで認証が正常に動作するか検証します。
import anthropic
import sys
def verify_authentication():
"""Claude API 認証の動作検証"""
try:
client = anthropic.Anthropic()
# 最小限のリクエストで認証テスト
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=20,
messages=[{"role": "user", "content": "Say OK"}]
)
print(f"✅ 認証成功")
print(f" Model: {response.model}")
print(f" Response: {response.content[0].text}")
print(f" Usage: input={response.usage.input_tokens}, output={response.usage.output_tokens}")
return True
except anthropic.AuthenticationError as e:
print(f"❌ 認証エラー: {e}")
print(" → API キーを確認してください")
return False
except anthropic.APIConnectionError as e:
print(f"❌ 接続エラー: {e}")
print(" → ネットワーク設定を確認してください")
return False
except Exception as e:
print(f"❌ 予期しないエラー: {e}")
return False
if __name__ == "__main__":
success = verify_authentication()
sys.exit(0 if success else 1)
# 期待出力:
# ✅ 認証成功
# Model: claude-sonnet-4-6
# Response: OK
# Usage: input=10, output=3再発を防ぐベストプラクティス
認証エラーを未然に防ぐために、以下の習慣を取り入れましょう。
APIキーの管理を徹底することが最も重要です。キーはコードにハードコードせず、環境変数またはシークレット管理ツール(AWS Secrets Manager、HashiCorp Vault、1Passwordなど)に保存してください。チーム開発では、個人ごとにキーを発行し、共有キーの使用は避けましょう。
エラーハンドリングの実装も欠かせません。401エラーが発生したとき、即座にリトライするのではなく、キーの有効性をチェックしてからリトライする仕組みを入れておくと、不要なAPIコールを防げます。
import anthropic
import time
def call_with_auth_retry(client, max_retries=2, **kwargs):
"""認証エラー時にキーを再検証してリトライ"""
for attempt in range(max_retries + 1):
try:
return client.messages.create(**kwargs)
except anthropic.AuthenticationError:
if attempt < max_retries:
print(f"認証エラー(試行 {attempt + 1}/{max_retries + 1})")
print("API キーを再読み込みします...")
# 環境変数から再読み込み
import os
os.environ.pop("ANTHROPIC_API_KEY", None)
from dotenv import load_dotenv
load_dotenv(override=True)
client = anthropic.Anthropic()
time.sleep(1)
else:
raiseAIの実践的な活用方法をさらに
全体を振り返って
Claude API の 401 認証エラーは、原因が明確であれば短時間で解決できる問題です。本記事で紹介した6つのパターン — 環境変数の未設定、キーの失効、ヘッダー形式の誤り、OAuthトークンの破損、プロキシの干渉、請求設定の問題 — を順番にチェックすれば、ほとんどのケースに対応できます。
まずは echo $ANTHROPIC_API_KEY でキーの存在を確認し、次に curl で直接テストするのが最短の切り分け方法です。それでも解決しない場合は、本記事の検証スクリプトを活用してください。
Claude APIのエラーハンドリング全般について詳しく知りたい方は「Claude API エラーハンドリングとリトライ戦略」も参考になります。また、「Claude API 初回リクエストのトラブルシューティング FAQ」では初めてAPIを使う方向けの基本的なつまずきポイントを網羅しています。