このエラーから分かるのは呼び出しが失敗したことだけで、理由はほとんど分かりません。役立つ情報であるステータスコードとプロバイダーのメッセージは、デバッグフラグ1つで表示できます。各ステータスは異なる修正を示します。
エラー
API Error: bad_response_status_code
(no status, no provider message — the wrapper hides both)原因と対処法の概要
| 原因 | 対処法 |
|---|---|
| 内部が401 / 403 | カスタムbase URLに対する認証情報またはヘッダーの不一致です。どの認証変数が設定されているか確認してください。 |
| 内部が404 | そのホストではモデルIDが不明か、base URLに余分なパスセグメントがあります。 |
| 内部が402 | ゲートウェイのウォレットが空です。チャージしてください。クライアント設定に問題はありません。 |
| 内部が429 / 529 | レート制限または上流の過負荷です。再設定ではなく、バックオフを伴って再試行してください。 |
| 200なのにJSONではない本文 | キャプティブポータル、企業プロキシ、またはエラーページです。ステータスは正常でも、本文が使用できない場合があります。 |
ラッパーを実際のエラーに変える
Claude Codeのデバッグ出力には、リクエストと上流レスポンスが表示されます。デバッグを有効にして失敗する呼び出しを1回実行し、ステータス行を読んでください。以降のすべては、その内容に依存します。
claude --debug 2>&1 | tee claude-debug.log
grep -iE 'status|http/|error' claude-debug.log | head -20同じ呼び出しをcurlで再現する
ツールからbase URLと認証情報を取り出し、リクエストを直接実行します。これにより「ホストに拒否された」のか「クライアントの形式が不正」なのかを一度で切り分けられます。生の本文には通常、ラッパーが破棄した問題が平易な言葉で記載されています。
curl -i "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5","max_tokens":16,
"messages":[{"role":"user","content":"ping"}]}'base URLに末尾パスがないことを確認する
Claude Codeは独自の`/v1/...`パスを追加します。すでに`/v1`で終わるbase URLを指定すると、`/v1/v1/messages`が生成されます。どのホストもこれに404で応答し、再びbad_response_status_codeとしてラップされます。オリジンのみを設定してください。
# Wrong — doubles the version segment
export ANTHROPIC_BASE_URL="https://api.kunavo.com/v1"
# Right — origin only
export ANTHROPIC_BASE_URL="https://api.kunavo.com"Kunavo経由で呼び出している場合
Kunavoで直ちに見分けるべきステータスは402と401です。402はウォレットがリクエストをカバーできないこと、つまり設定ではなく残高の問題を意味します。401は、Kunavoが使用可能なsk-kn-キーを受け取らなかったことを意味します。KunavoはAuthorization: Bearerまたはx-api-keyのどちらからでもキーを読み取るため、Claude Codeが実際に送信した内容を確認してください。ANTHROPIC_API_KEY内のキーは対話セッションで一度承認する必要があり、拒否すると無視されます。一方、ANTHROPIC_AUTH_TOKENは直ちに使用されます。どちらのステータスも理由を示すJSON本文とともに返されるため、デバッグログが決定的な手掛かりになります。失敗したリクエストには課金されません。 どの変数を設定するか、そしてその理由については、 認証変数ガイド.
よくある質問
このエラーがClaude Code自身のバグであることはありますか?
まれです。これはトランスポートレベルのラッパーです。何かが応答し、その応答が成功ではなかったという意味です。curlで再現すれば判定できます。curlでも失敗するなら、問題はクライアントではありません。
公式APIでは動作しますが、私のゲートウェイでは動作しません。
その場合、違いはツールではなく認証情報またはbase URLです。ゲートウェイが要求する認証ヘッダーと、base URLにすでに/v1が含まれていないかを確認してください。
自動的に再試行すべきですか?
ステータスを確認してからにしてください。401や404の再試行には意味がありません。429や529をバックオフ付きで再試行するのは正しい対応です。