Claude CodeでAPIキーも設定してないのに課金される — ant CLIの「profile」が犯人だった
Claude CodeでANTHROPIC_API_KEYもapiKeyHelperも未設定なのに、Maxプラン契約中に従量課金される謎の症状をGitHub Issue #84394の一次情報と公式ドキュメントの認証優先順位表から解明した。
エンジニアのゆとです。
「Claude Codeのサブスクに入ってるのにAPIキーを設定したままで課金される」という話は、もう何度も読んだことがあると思う。ANTHROPIC_API_KEYを消し忘れてるパターンで、これはよく知られているし対処法も出回ってる。
今回書くのはそれじゃない。ANTHROPIC_API_KEYは設定してない。apiKeyHelperも書いてない。settings.jsonのどこにもAPIキーらしきものはない。それなのに、Console側の使用量に課金が積み上がっていく——という、チェックリストを全部埋めても原因にたどり着けないパターンの話だ。
2026年8月に報告されたIssue #84394がその実例で、報告者はMax 5x契約が11%しか消費されていない状態で、1日で$59分のAPIクレジットを消費していた。この記事では、その報告の中身と、公式ドキュメントの認証優先順位表が今この問題をどこまでカバーしているか、そして自分がこの経路に引っかかっていないかを確認する方法を整理する。
まず結論 — ant auth loginが残した「profile」が、/loginより先に読まれることがある
Claude CodeとAnthropicは、CLIツールを2つ提供している。ふだん使っているclaude本体と、Claude APIをターミナルから直接叩くためのantというCLIだ。このantで一度でもant auth loginを実行したことがあると、~/.config/anthropic/credentials/配下に認証情報が残る。
これはorganization_idとworkspace_idを持つConsole(API課金)側のOAuth認証情報で、Max/Proのサブスクリプションとは別物になる。問題は、この情報が残っている状態でclaudeを起動すると、状況によっては/loginで作ったサブスクリプション側の認証より先に、このant側の認証情報(Issue報告者いわく「profile」)が使われてしまうことがある、という点だ。
報告者の環境では以下の手順で再現した。
- Max契約があるアカウントで
ant auth loginを実行(OAuthフローを完了) claude側のログインはclaude auth logoutで消す、もしくは失効させるclaudeを起動してプロンプトを送る → ログイン画面は出ず、普通に応答が返ってくるclaude auth statusを実行 →{"loggedIn": false, "authMethod": "none"}と出るclaude auth status --textを実行 →Profile: credentials-file · user_oauth · profile defaultと出る- Console側の使用量を確認 → source
Consoleで、API課金として計上されている。サブスクリプション側の消費量は動いていない
厄介なのは4番だ。JSON出力のclaude auth statusは「ログインしていない」と答えるのに、実際には別の経路で認証済みで、リクエストは通っている。テキスト出力に切り替えて初めて実態が見える。
なぜ「よくあるチェック」が全部すり抜けるのか
この手の課金トラブルの定番チェックリストは、だいたい次の3つだ。
ANTHROPIC_API_KEYが環境変数に残っていないかapiKeyHelperがsettings.jsonに設定されていないか- Console側でAPIキーが発行され、それがどこかに書かれていないか
報告者はこの3つをすべて確認して、すべて白だったと書いている。それもそのはずで、ant auth loginが書き込むのはAPIキーではなくOAuth認証情報だ。キーという「モノ」が存在しないので、キーを探す系のチェックには最初から引っかからない。しかもclaude auth logoutはこの~/.config/anthropic/側のファイルを消さないので、「ログアウトしてログインし直したのに変わらない」という状態にもなり得る。

公式ドキュメントの認証優先順位表で裏を取る
Anthropicの認証ドキュメントには、複数の認証情報が存在するときにClaude Codeがどれを選ぶかという優先順位表がある。上から強い順に並べると次のようになっている。
- クラウドプロバイダー認証情報(Bedrock / Vertex / Foundryを使う設定時)
ANTHROPIC_AUTH_TOKEN環境変数ANTHROPIC_API_KEY環境変数apiKeyHelperスクリプトの出力CLAUDE_CODE_OAUTH_TOKEN環境変数- Anthropicプロフィール・フェデレーション認証情報(
antCLIやWorkload Identity Federationが使うもの) /loginによるサブスクリプションOAuth認証情報
6番目に「Anthropicプロフィール」が入っている。これがまさにant auth loginが書き込む認証情報で、7番目の「サブスクリプション認証(Max/Pro)」より優先順位が高い。数字だけ見ると「じゃあ常にサブスクより優先されるのか」と思うが、ドキュメントにはもう少し細かい条件が書いてある。
ant auth loginが書いたプロフィールは、ANTHROPIC_PROFILEで名指しされていない限り、/loginより下位になる
つまり2026年9月時点の仕様では、「有効な/login認証がすでにある」場合はサブスクリプション側が優先される。Issue #84394が起きたのは、まさにこの「有効な/login認証がない」状態、つまり報告者がテストのためにclaude auth logoutしていたタイミングだった。
言い換えると、この経路は「ログアウトした・トークンが切れた・一度もこのマシンで/loginしていない」瞬間に限って、ant側の古い認証情報へ静かにフォールバックする設計になっている。フォールバックすること自体は「認証が切れて使えなくなるよりはまし」という理屈で理解できなくはないんだけど、フォールバック先がAPI課金という別料金体系で、しかもそれを知らせる手段が今のところ/statusを自分から見に行くことしかない。これが実質的な罠になっている。
/statusで自分の環境を確認する
公式ドキュメントが案内している確認方法は/statusコマンドだ。
/status
サブスクリプション(/login)が有効ならLogin methodという行にClaude Max accountのように表示される。一方、Anthropicプロフィール経由で認証されている場合は、この行の代わりにProfileという行が表示され、そのプロフィールがどのアカウント・組織に紐づいているかが出る。
ターミナルから直接調べたい場合はant側のコマンドも使える。
claude auth status --text
Profile: credentials-file · user_oauth · profile defaultと出た場合、そのセッションはサブスクリプションではなくConsole側の認証で動いている。claude auth status(JSON出力)だけを見て「loggedIn: false だから未認証、課金されていないはず」と判断するのは早計、というのがこのIssueの一番の学びだと思う。

該当していた場合の直し方
Issue内で報告者が実際に効いたと書いている手順はこれだ。
# 1. antが書いた認証情報を退避する(削除ではなく移動、念のため)
mv ~/.config/anthropic/credentials/default.json \
~/.config/anthropic/credentials/default.json.disabled
# 2. claude.aiアカウント(サブスクリプション)で改めてログイン
claude auth login --claudeai
# 3. サブスクリプション側が優先されているか確認
claude auth status --text
# → "Login method: Claude Max account" のように出れば成功
恒久的にant側を使わないなら、公式ドキュメントにも載っているant auth logoutでプロフィールそのものを無効化する手もある。antをWorkload Identity Federationやチーム用のプロフィール切り替えで使っている場合は、ANTHROPIC_PROFILE環境変数で明示的に名指しした上で使う、という運用にしておくとこの経路には乗らなくなる(ドキュメント上、名指しされたプロフィールは/loginより優先順位が上がる仕様なので、ここは意図した挙動として扱われる)。

それでもANTHROPIC_API_KEYの消し忘れの方がよく起きる
公平のために書いておくと、実際に踏みやすいのは今回のIssueよりも「ANTHROPIC_API_KEYを設定したまま忘れている」パターンのほうだ。検索してみても、この定番パターンを扱った記事の方が圧倒的に多い。優先順位表で見てもANTHROPIC_API_KEYは3番目、Anthropicプロフィールより上位にあるので、両方仕込まれている環境ならまずANTHROPIC_API_KEY側が犯人になる。
# まずはこれを疑う
echo $ANTHROPIC_API_KEY
unset ANTHROPIC_API_KEY
今回のIssueが厄介なのは、この定番チェックを一通り終えて「原因なし」となった後に残る、もう一段深い経路だという点にある。antをインストールしたことも、ant auth loginを打ったことも覚えていない人の方が多いはずで、心当たりがなくても/statusだけは一度確認しておいて損はない。
FAQ
ant CLIを一度もインストールしたことがなければ関係ない?
その可能性は高い。この問題は~/.config/anthropic/credentials/にファイルが存在することが前提なので、ls ~/.config/anthropic/credentials/で何も出なければ、少なくともこの経路では課金されていない。ただしANTHROPIC_PROFILEをチーム設定で配布されている環境では、別の理由でこのディレクトリが使われている場合もあるので、心当たりがなくても一度/statusは見ておくと安心できる。
claude auth logoutで直らない?
直らない。claude auth logoutが消すのはClaude Code本体(~/.claude/.credentials.json)側の認証情報で、antが書いた~/.config/anthropic/側のファイルには触れない。報告者もこの点を「ログアウトしても変化なしという偽の安心感を与える」と書いている。
Claude Desktopやクラウドセッションでも起きる?
起きない。公式ドキュメントによれば、Anthropicプロフィールやフェデレーション変数はbareモード・Claude Desktop・クラウドセッションでは読まれない。この経路が関係するのはターミナルのclaudeコマンドとVS Code拡張、Agent SDK経由の利用に限られる。
一番確実な予防策は?
antを使う予定がないなら、ant auth loginをそもそも実行しないのが一番シンプルな予防策になる。すでに実行してしまっていて、かつサブスクリプション運用に統一したいなら、この記事で紹介したant auth logoutか、認証情報ファイルの退避が確実。
Console側の使用量画面で心当たりのない課金を見つけたとき、真っ先に疑うのはANTHROPIC_API_KEYの消し忘れだと思う。それで見つからなかったら、次に見るべきは/statusのProfile行だ。キーという「モノ」を探すチェックリストでは、この経路は絶対に引っかからないようになっている。
関連記事
- Claude Codeにログインできない・認証エラーが出る——症状別に公式ドキュメントで対処法を整理した
- Claude Codeの使用量・トークン消費を確認する方法 完全ガイド
- Claude Codeのアカウント切り替え——CLAUDE_CONFIG_DIRだけでは個人用とクライアント用が完全に分離しない話