まとめ
プロジェクトの.envにANTHROPIC_API_KEY=sk-ant-...の行が含まれていて、かつシェルがそのファイルを読み込んでいる(direnv、source .envなど)と、Claude Codeはその鍵をAPI課金で使う。月額のMax planの購読認証は使われない。Claude Codeはセッション開始の挨拶の段で「今は購読かAPI鍵か」を表示するが、一度きりの表示で見落としやすい。自動補充がAPI側の既定で有効だと、月末の請求や前払い残高の枯渇まで気づかない。
2026年5月13日のReddit投稿(ID 1tbaq2d、約11時間で332ポイントと86コメント)では、9回の自動補充で約187米ドルの取り返し不能の損失が発生した。Anthropicの公式回答は「意図された機能、ドキュメントは正確」で、消費済の前払い金は返金しないと明言した。
注意: これはClaude Codeのバグではない。標準の環境変数の優先順位 + 利用者側の.envの読み込み + 見落としやすい挨拶の表示 + 自動補充の既定値、の組み合わせで発生する。下記の対処は利用者側で動かせる部分を扱う。
仕組み
Claude CodeのBashの道具がコマンドを実行する時、子プロセスは親から全ての環境変数を継承する。.envをdirenvやシェルの起動スクリプトで読み込んでいれば、ANTHROPIC_API_KEYもそのまま継承される。
Anthropicの認証の優先順位:
- 環境変数
ANTHROPIC_API_KEY(空でない場合) - 設定ファイル
- 購読の認証(Max planなど)
ANTHROPIC_API_KEYが空でない値で設定されていれば、購読は使われない。これは公式に文書化された挙動で、公式回答も「意図された機能」として確認した通り。
公式回答の原文:
Claude Code is designed to prioritize API keys set as environment
variables over subscription credentials.
This is intentional functionality.
画面表示には実は合図がある。Claude Codeはセッション開始時の挨拶の段で「現在の認証は購読か、API鍵か」を表示する。Reddit投稿の議論で複数の利用者が独立して証言している(「Claude Code window tells you whether it's using a subscription」、「the first thing Claude tells you then is it using API billing」)。ただし一度きりの表示で、作業に集中していると読み飛ばす。次に気づく合図は、課金通知のメールか、前払い残高の枯渇か、月末の請求の急増だ。
つまり、利用者の理解(「Max planで課金は固定」)と、実態(「環境変数でAPI課金に変質」)の乖離は、合図ゼロで起きるのではなく、見落としやすい挨拶の段の一行 + 自動補充の既定値、の組み合わせで継続する。
Claude Codeが「やらない」こと
Reddit投稿の議論では、複数の経験のある開発者が独立して「Claude Codeは.envを自動読みしない」と証言した(8件以上のコメント)。.envにANTHROPIC_API_KEYの行があるだけでは、Claude Codeには影響しない。利用者のシェルがdirenvやsource .envで先に読み込んでいる場合のみ、Claude Codeの子プロセスが環境変数を継承する。利用者側の自分の作業の場の構成が起点だ。
自分のプロジェクトを点検する
直近で使ったプロジェクトのルートで、次の一行を実行する。
grep -E '^[[:space:]]*(export[[:space:]]+)?ANTHROPIC_API_KEY[[:space:]]*=' .env .env.* 2>/dev/null
.env系のファイルに代入の行があれば表示される。何も出なければ問題ない。
加えて、Anthropicのconsoleで直近30日の請求項目を確認する。想定外のAPI課金があれば、すでに黙って課金されていた可能性がある。
対処は3種類
対処1: .envの行を削除
.envからANTHROPIC_API_KEY=...の行を削除する。アプリの本体でAPI鍵が必要なら、Claude Codeのシェルが読まない別のファイル(例: .api-keys)に移して、アプリの起動スクリプトの中だけで読み込む。
弱点: チームの他のメンバーが行を戻すと再発する。
対処2: シェル起動時に空にする
~/.bashrcや~/.zshrcの末尾に追加する。
unset ANTHROPIC_API_KEY
または
export ANTHROPIC_API_KEY=""
どのプロジェクトの.envで設定されても、シェル起動時に空になる。弱点: Claude Code以外でAPIを使う(例: PythonのSDKスクリプト)時には、明示的に設定し直す必要がある。
対処3: cc-safe-setupのhookで自動検出
cc-safe-setupを採用していれば、2026年5月13日に追加した新規のhookで自動検出できる。
{
"hooks": {
"SessionStart": [{
"hooks": [{ "type": "command", "command": "~/.claude/hooks/dotenv-anthropic-key-billing-guard.sh" }]
}]
}
}
このhookはSessionStart時にプロジェクトの中の5種類の.env系ファイル(.env、.env.local、.env.development、.env.production、.env.dev)を走査し、代入の行があれば警告を出す。コメントアウトと空値は除外する。
警告内容は、検出されたファイル一覧、3種類の対処素案、出典のRedditのURLを含む。ブロックはせず警告のみで、セッション開始時に「今のセッションはMax planかAPIか」を判定できる。テストは21件で全件パス済。
なぜ「意図された機能」なら対処の設計が変わるか
これはバグではなく、設計通りの動作だと公式が明言した。バグなら修正を待つ選択肢があるが、設計なら修正は来ない。利用者側のツールで対処するしかない。
これが、公式CLIのオプション追加や設定の新規追加を待つのではなく、SessionStart hookで自動検出する設計を選んだ理由だ。利用者側だけが動ける。
同じ「意図された設計と利用者の理解の乖離」のパターンは、Claude Codeの他の場所でも観察される。
- Issue #58550:
/goalにサーキットブレーカーがなく、200回超の繰り返しで5時間、週次利用枠の50%を黙って消費する - Issue #58289:
permissions.askが既定モードのMCPの道具で無視される - Issue #58297:
agentsの表示がターン完了後もバックグラウンドbashを「Working」と誤表示する
いずれも、利用者の理解が公式UIで更新されず、利用者側の観察ツールがないと乖離が継続する場所だ。
関連素材
この記事の根本パターン(主張と実態の乖離)は、2026年5月22日発売予定の事例集 Claude Code Claim-Verify Handbook で、130件の事例(本文15件+付録D 115件)、5種類の検出ツール、14種類の防衛手順としてまとめている。試し読み1章の全文(約9,400字)は Gist で無料で読める。
予防hookの集まりは cc-safe-setup。この記事で紹介したdotenv-anthropic-key-billing-guard.shは最新の追加hookで、yurukusa/cc-safe-setupのfeat/dotenv-anthropic-key-billing-guard-2026-05-13ブランチで公開している。
おわりに
-
.envのANTHROPIC_API_KEYは、Claude CodeのMax plan購読を黙って上書きする - 公式が「意図された機能」と確認した動作で、修正は来ない
- 対処は3種類: 行の削除/シェルで空に設定/hookで自動検出
- 直近のプロジェクトで
grepの一行を試し、該当があれば今日のうちに対処することを推奨する
消費済の前払い金は返金されないため、予防の優先度は高い。