AIコーディング 2026.04.18
Claude API「403 Forbidden/PermissionDeniedError」の原因と解決方法【Pythonコード付き】
Claude API 403エラーの確認方法
# 403エラーを再現して確認する
import anthropic
import os
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
try:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=100,
messages=[{"role": "user", "content": "test"}]
)
except anthropic.PermissionDeniedError as e:
# 403 Forbidden = PermissionDeniedError
print(f"エラー種別: {type(e).__name__}")
print(f"ステータス: {e.status_code}") # 403
print(f"メッセージ: {e.message}")
print(f"詳細: {e.body}")
except anthropic.AuthenticationError as e:
# 401 = APIキー自体が無効(403ではない)
print(f"認証エラー(401): {e.message}")
原因パターンと解決方法
パターン1:アカウント停止
エラーメッセージ例:
"Your account has been suspended"
"Access to this API has been restricted"
def diagnose_403(e: anthropic.PermissionDeniedError) -> str:
"""403エラーの原因を判定する"""
msg = str(e.message).lower()
if "suspend" in msg or "banned" in msg:
return (
"アカウント停止の可能性:\n"
" 1. support.anthropic.com にログインして状態を確認\n"
" 2. 利用規約違反がないか確認\n"
" 3. 異常な大量リクエストがなかったか確認\n"
" 4. 英語でサポートに問い合わせる"
)
elif "organization" in msg or "scope" in msg:
return (
"組織キーのスコープ不足:\n"
" 1. console.anthropic.com → API Keys でキーの設定を確認\n"
" 2. 組織管理者にモデルアクセス権を確認してもらう"
)
else:
return f"不明な403エラー: {e.message}"
try:
client.messages.create(
model="claude-sonnet-4-5",
max_tokens=5,
messages=[{"role": "user", "content": "test"}]
)
except anthropic.PermissionDeniedError as e:
print(diagnose_403(e))
パターン2:APIキーのスコープ・組織設定
# 別のAPIキーで試す(問題の切り分け)
ANTHROPIC_API_KEY=sk-ant-api03-OTHER_KEY_HERE \
python3 -c "
import anthropic, os
c = anthropic.Anthropic()
r = c.messages.create(
model='claude-haiku-4-5-20251001',
max_tokens=5,
messages=[{'role': 'user', 'content': 'ping'}]
)
print('OK:', r.content[0].text)
"
# 組織キーの確認ポイント
# console.anthropic.com → API Keys → キーの詳細設定を確認
#
# 確認すべき設定:
# - Allowed Models: アクセス可能なモデルが限定されていないか
# - IP Allowlist: 実行環境のIPが制限されていないか
# - Workspace: 正しい組織に紐付いているか
パターン3:curlでの直接APIコール時のヘッダー不足
# ❌ ヘッダーが足りない場合
curl https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-4-5","max_tokens":100,"messages":[{"role":"user","content":"ping"}]}'
# → 403 or 401
# ✅ 正しいヘッダーを付けた場合
curl 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-5",
"max_tokens": 100,
"messages": [{"role": "user", "content": "ping"}]
}'
アカウント停止時の英語サポートテンプレート
Subject: Account Suspension Inquiry - [Your Account Email]
Dear Anthropic Support Team,
I am writing regarding a 403 PermissionDeniedError I am receiving when
making API calls. My account appears to have been suspended.
Account email: [your-email@example.com]
Error message: [paste the exact error message]
First occurrence: [date/time]
I have reviewed the usage policies and believe my usage complies with
all terms. Could you please clarify the reason for the suspension and
advise on the steps to restore access?
Thank you for your assistance.
APIヘルスチェックスクリプト
# api_health.py - 起動時に403/401/429の状態を診断
import anthropic
import os
import sys
def check_api_health() -> bool:
"""APIの状態をチェックして結果を返す"""
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY", ""))
try:
client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=5,
messages=[{"role": "user", "content": "test"}]
)
print("✅ API: 正常")
return True
except anthropic.AuthenticationError:
print("❌ 401: APIキーが無効です。ANTHROPIC_API_KEY を確認してください")
return False
except anthropic.PermissionDeniedError as e:
print(f"❌ 403: アクセス拒否 - {e.message}")
print(" → support.anthropic.com でアカウント状態を確認してください")
return False
except anthropic.RateLimitError:
print("⚠️ 429: レート制限中。1分後に再試行してください")
return False
except anthropic.APIConnectionError:
print("⚠️ 接続エラー: ネットワークを確認してください")
return False
if __name__ == "__main__":
if not check_api_health():
sys.exit(1)
あわせて読みたい
- Anthropic APIアカウント停止時の対応|影響確認コードと復旧手順
- Claude Code「command not found」エラーの解決方法
- Claude Code「Connection timeout」エラーの原因と解決方法