Claude CodeでAPIキーも設定してないのに課金される — ant CLIの「profile」が犯人だった

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クレジットを消費していた。この記事では、その報告の中身と、公式ドキュメントの認証優先順位表が今この問題をどこまでカバーしているか、そして自分がこの経路に引っかかっていないかを確認する方法を整理する。

github.com
Issue #84394 - Claude Code silently authenticates from ~/.config/anthropic credentials file Max 5x契約なのに1日$59のAPI課金が発生した実例。ANTHROPIC_API_KEY・apiKeyHelper・settings.jsonのキー、いずれも白だったことを確認した上での報告。

まず結論 — 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」)が使われてしまうことがある、という点だ。

報告者の環境では以下の手順で再現した。

  1. Max契約があるアカウントでant auth loginを実行(OAuthフローを完了)
  2. claude側のログインはclaude auth logoutで消す、もしくは失効させる
  3. claudeを起動してプロンプトを送る → ログイン画面は出ず、普通に応答が返ってくる
  4. claude auth statusを実行 → {"loggedIn": false, "authMethod": "none"}と出る
  5. claude auth status --textを実行 → Profile: credentials-file · user_oauth · profile defaultと出る
  6. 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/側のファイルを消さないので、「ログアウトしてログインし直したのに変わらない」という状態にもなり得る。

Claude Codeにログインできない・認証エラーが出る——症状別に公式ドキュメントで対処法を整理した
Claude Codeにログインできない・認証エラーが出る——症状別に公式ドキュメントで対処法を整理したClaude CodeのOAuthログインが失敗する、403 Forbiddenが出る、WSL2/SSHでログインできないといった症状別に、公式トラブルシューティングドキュメントをベースに原因と対処法を整理した。読む →

公式ドキュメントの認証優先順位表で裏を取る

Anthropicの認証ドキュメントには、複数の認証情報が存在するときにClaude Codeがどれを選ぶかという優先順位表がある。上から強い順に並べると次のようになっている。

  1. クラウドプロバイダー認証情報(Bedrock / Vertex / Foundryを使う設定時)
  2. ANTHROPIC_AUTH_TOKEN環境変数
  3. ANTHROPIC_API_KEY環境変数
  4. apiKeyHelperスクリプトの出力
  5. CLAUDE_CODE_OAUTH_TOKEN環境変数
  6. Anthropicプロフィール・フェデレーション認証情報(antCLIやWorkload Identity Federationが使うもの)
  7. /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の一番の学びだと思う。

Claude Codeの使用量・トークン消費を確認する方法 完全ガイド 2026 — /usageからccusage・ステータスラインまで
Claude Codeの使用量・トークン消費を確認する方法 完全ガイド 2026 — /usageからccusage・ステータスラインまでClaude Codeの使用量をどう確認すればいいか迷ったら読む記事。公式の/usage・/insights・ステータスラインと、サードパーティのccusageをシーン別に整理し、複数クライアント案件を掛け持ちするフリーランス視点での使い分けまで公式ドキュメントベースで解説する。読む →

該当していた場合の直し方

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より優先順位が上がる仕様なので、ここは意図した挙動として扱われる)。

Claude Codeのアカウント切り替え——CLAUDE_CONFIG_DIRだけでは個人用とクライアント用が完全に分離しない話
Claude Codeのアカウント切り替え——CLAUDE_CONFIG_DIRだけでは個人用とクライアント用が完全に分離しない話Claude Codeで個人用アカウントとクライアント案件用アカウントを切り替える方法を整理した。公式の/login切り替えとCLAUDE_CONFIG_DIRの違い、CLAUDE_CONFIG_DIRが「未公式かつ不完全」な理由をGitHub Issueベースで検証し、フリーランスが本当に分離すべき理由まで解説する。読む →

それでも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行だ。キーという「モノ」を探すチェックリストでは、この経路は絶対に引っかからないようになっている。

関連記事

code.claude.com
Authentication - Claude Code Docs 認証方式の優先順位表とAnthropicプロフィールの挙動を扱う公式一次情報。ant CLIが書き込むuser_oauthプロフィールの優先順位ルールもここに明記されている。
github.com
Issue #84394 (GitHub) 今回取り上げた報告そのもの。再現手順・実際に効いた回避策・報告者自身のテスト結果まで一次情報として読める。
← 記事一覧に戻る