これらは別名ではありません。一方は`x-api-key`になり、もう一方は`Authorization: Bearer`になります。両方が設定されていると、意図していない方が使われる可能性があります。カスタムベースURLで「キーは正しいのに認証に失敗する」という報告の多くは、これが原因です。
エラー
# Sent as: x-api-key: <value>
export ANTHROPIC_API_KEY="sk-ant-..."
# Sent as: Authorization: Bearer <value>
export ANTHROPIC_AUTH_TOKEN="sk-kn-..."
# Where those headers go:
export ANTHROPIC_BASE_URL="https://api.kunavo.com"原因と対処法の概要
| 原因 | 対処法 |
|---|---|
| ゲートウェイはベアラートークンを要求しているが、APIキー変数を設定している | 多くのOpenAI互換ゲートウェイは`Authorization: Bearer`で認証します。ゲートウェイキーをANTHROPIC_AUTH_TOKENに設定してください。 |
| 異なるプロバイダーの両方の変数が設定されている | シェルプロファイルに残ったANTHROPIC_API_KEYが、トークンと一緒に送信される可能性があります。使用しない方の設定を解除してください。 |
| ベースURLは設定したが、認証情報を変更していない | 新しいホストを指定しても、以前のプロバイダーのキーがそこで有効になるわけではありません。ホストに合わせて認証情報も変更する必要があります。 |
| ツールを実行しているシェルとは別のシェルで変数を設定している | 対話型シェルでのexportは、GUIから起動されたプロセスには届きません。同じ環境内で確認してください。 |
環境に実際に保持されている内容を確認する
変更する前に、ツールを起動するシェルで両方を確認してください。こうしたセッションのかなりの割合で両方が設定されており、数か月前のプロファイル編集が原因で、誰も覚えていないことがよくあります。
for v in ANTHROPIC_API_KEY ANTHROPIC_AUTH_TOKEN ANTHROPIC_BASE_URL; do
printf '%-22s %s\n' "$v" "$(printenv "$v" | cut -c1-12)"
done
# Prefixes tell you the provider at a glance:
# sk-ant- Anthropic direct
# sk-kn- Kunavoホストに合う組み合わせを設定し、もう一方を解除する
ホストと認証情報を1つの単位として扱ってください。サードパーティのベースURLでは通常、ベアラートークンとベースURLを使い、直接APIキーは明示的に解除して、誤って取得されないようにします。
unset ANTHROPIC_API_KEY
export ANTHROPIC_AUTH_TOKEN="sk-kn-..."
export ANTHROPIC_BASE_URL="https://api.kunavo.com"
# On Kunavo, pin served models too: Claude Code's default and its opus and
# sonnet aliases follow Anthropic's newest models, and the sonnet alias asks
# for Sonnet 5.5, which Kunavo does not serve — unpinned, that request 404s.
export ANTHROPIC_MODEL="claude-sonnet-5"
export ANTHROPIC_DEFAULT_OPUS_MODEL="claude-opus-5-5"
export ANTHROPIC_DEFAULT_SONNET_MODEL="claude-sonnet-5"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="claude-haiku-4-5"
claude頭の中ではなく、通信上で確認する
認証にまだ失敗する場合は、環境変数を疑う余地をなくすため、送信されるはずだと思っているヘッダーを付けて手動でリクエストを実行してください。ここで200が返り、ツールでは失敗するなら、ツールが設定した変数を読み取っていません。最も多い原因は、別のシェルか、それを上書きする設定ファイルです。
curl -s -o /dev/null -w '%{http_code}\n' \
"$ANTHROPIC_BASE_URL/v1/models" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"Kunavo経由で呼び出している場合
Kunavoは`Authorization: Bearer`と`x-api-key`のどちらからでもキーを読み取るため、どちらのヘッダーを使うかで決まるわけではありません。Claude Codeで機能する組み合わせは、依然としてANTHROPIC_AUTH_TOKENとANTHROPIC_BASE_URLです。トークンは、ANTHROPIC_API_KEYが必要とする初回承認なしで有効になります。ANTHROPIC_API_KEYは残したままにせず解除してください。そこに古い値が残っていることが、設定済みに見えるのにセッションが拒否される最も一般的な原因です。同じ`sk-kn-`キーは、/v1/chat/completionsに対するOpenAI形式のベアラートークンとしてもそのまま機能するため、1つの認証情報で両方の形式をカバーできます。モデル名を含む完全な設定は、 Claude Code 401ガイド。
よくある質問
両方が設定されている場合、どちらが優先されますか?
答えに頼らないでください。これはバージョン間で変更されており、SDKによっても異なる優先順位ルールです。片方だけを設定し、もう一方を解除してください。どこでも同じように動作する唯一の構成です。
ANTHROPIC_AUTH_TOKENをAnthropicに直接使えますか?
Anthropic独自のAPIはx-api-keyで認証するため、直接AnthropicキーをANTHROPIC_API_KEYに設定します。トークン変数は、ベアラー認証情報を要求するホスト向けです。
SDKも同じ変数を使いますか?
PythonおよびTypeScript SDKはANTHROPIC_API_KEYを読み取り、x-api-keyを送信します。SDKの接続先をベアラー認証ゲートウェイにする場合は、環境変数に頼らず認証情報を明示的に渡してください。