【AI】OpenAIのAPIキーを削除したのに課金が続いた話


こんにちは、フリーランスエンジニアのmohです。

2026 年 9 月 6 日の夜、OpenAI の API キーを不正利用されて 1 日で $269.19 を使われました。8 月 29 日にも同じ鍵で $3.51 の利用があり、合計 $272.70。自動チャージが月の上限で止まっていたので、残高は -$99.60 のまま残っています。

金額そのものより、途中で気づいて鍵を削除したあとも約 15 分リクエストが通り続けたことと、8 月 29 日に警告メールを受け取っていたのに 8 日間放置になった理由のほうが、次に同じことが起きたときに効く情報だと思うので書き残します。

大前提

APIキーの管理は厳重に保管すべきです。.envを使い、適切に.gitignoreに指定したり、gitleaksなどのツールで検出することが重要です。今回は過去のセキュリティに甘かった時代の私が案件提出物に含めてしまっていたことが原因でした。

経緯(時刻は日本時間)

日時出来事
8/29 14:47OpenAI の Trust & Safety から「API キーで不審なアクティビティが検出されました」。文面は「24 時間以内にローテーションしない場合、OpenAI が取り消すことがある」
8/29 14:47 / 15:09Org の spend alert $37.50
8/29同じ鍵で $3.51 の利用
8/29 直後API keys 画面で同じ鍵が Inactive 表示。Active フィルタでは出てこない。Inactive の行には削除ボタンが無い。旧形式のユーザーキーなので Admin API でも消せず、そのまま放置
9/2〜9/4同じ鍵で 1 日あたり $0.01 未満の利用。この時点で鍵は Active に戻っている(通知なし)
9/5同じ鍵で $0.44
9/6 09 時台同じ鍵で 196 万 input tokens
9/6 18:37〜burst 開始。最終的に 896 リクエスト / 35.3M input tokens。1 リクエスト平均で約 4 万 tokens
9/6 19:02Auto Recharge Limit Reached(月 $100)
9/6 19:16:13Org alert $60
9/6 19:16:32Project alert $100
9/6 19:16:56Org alert $80
9/6 19:16:57Org の spend limit $80 に到達、API 停止(1 回目)
9/6 19:17 頃鍵を削除。直後に Org の上限を $250 に引き上げ
9/6 19:17〜19:31削除済みの鍵でリクエストが継続。分刻みの Usage では 19:30 台が最後
9/6 19:31〜19:51リクエストはゼロ。計上だけが後追いで積まれ、Project alert が 19:30 $150 / 19:33 $180 / 19:34 $125・$187.50
9/6 19:51Project の spend limit $250 に到達(2 回目の停止)
9/6 20:02Org の spend limit $250 に到達

叩かれたモデルの内訳は gpt-6-astra 28.6M、gpt-5_6-luna 4.4M、gpt-5_6-sol 2.0M、gpt-5_6-terra 0.26M input tokens でした。

9/6 の分刻みの利用量と、上限到達・鍵削除・停止のタイミング

削除したのに課金が続いた

19:17 頃に鍵を削除して、その直後に上限を $250 に引き上げました。上限を上げたのは、停止したままだと自分の作業も止まるからです。結果として 19:17 から 19:31 までの約 15 分、削除済みの鍵でリクエストが通り続けました。Usage の鍵別の内訳でも、この分は削除済みの同じ鍵に帰属しています。その後 19:51 まで、リクエストはゼロなのに計上だけが後追いで積まれ、Project の上限に達しました。

削除の反映に時間差があるという報告は OpenAI のコミュニティにも複数あります。失効させたはずの鍵が動き続けた例、一覧に出てこない古い鍵が使えていた例、クレジットが減り続けた件に OpenAI スタッフが「過去分の請求処理の遅延」と回答した例が見つかります。今回は分刻みの Usage がリクエスト時刻ベースで 19:31 まで出ているので、削除後もリクエストは通っていました。ただし削除前後の額の切り分けは、計上の遅れと残高のマイナス計上が混ざるため手元では出せず、OpenAI 側のリクエストログにしか無い情報です。

どちらにしても運用側の結論は変わらなくて、鍵を削除しても即座に止まる前提で上限を緩めてはいけない、ということになります。

なぜ 8/29 から放置になったか

8/29 の時点で警告は届いていました。それでも 9/6 まで残ってしまった理由が 3 つあります。

警告メールは無効化の通知ではない。 文面は「24 時間以内にローテーションしない場合、OpenAI が取り消すことがある」です。読んだ側は「OpenAI が止めてくれるらしい」と受け取りますが、これは予告であって、実際に無効化されたかどうかは書かれていません。

Inactive の鍵には削除ボタンが無い。 これはあくまで記憶の話ですが、最初の発覚時に画面を見に行くと鍵は Inactive になっていました。API keys 画面の既定は Active フィルタなので、フィルタを外すまで一覧にも出てきません。見つけたところで、Inactive の行には削除アイコンが表示されません。今回の鍵は Project 導入前の旧形式ユーザーキーだったので、Admin API の対象外でもありました。UI からも API からも消せない状態です。

再有効化が無通知。 Inactive なら実害は無いと判断して放置したのですが、9/2 から 9/4 のあいだに少額の利用が記録されています。どこかで Active に戻っています。無効化されたときも、戻ったときも、こちらへの通知はありません。

消せない鍵を「止まっているはず」で放置すると、止まっていない状態に無通知で戻ります。

残高がマイナスになる仕組み

Org の spend limit は $80 に設定していました。到達して 1 回目の停止が入ったのは事実です。ただ、その後上限を $250 に上げたところ、9 月の Org 全体の消費は最終的に $275.46 まで通りました(この鍵の $269.19 に、他の鍵の通常利用 $6 強を足した額です)。

理由は集計の遅れです。今回はっきり見えたのが、19:16:32 に届いた Project の $100 到達アラートが、19:16:56 の Org の $80 到達アラートより先に来ていることです。Project 側では $100 まで積み上がっているのに、Org 側の集計はまだ $80 に届いていない。集計は後追いで積まれていて、その差の分だけ上限を越えて通ります。

そこに自動チャージの月上限が重なります。19:02 に Auto Recharge Limit Reached(月 $100)が来た時点で、残高の自動補充は止まっています。以降に遅れて計上された分は補充されない残高から引かれるので、そのままマイナスになります。今回は -$99.60 です。

攻撃側は上限に当たって 429 を受け続けても叩き続けていて、上限を上げた直後に再開しています。上限は攻撃を止めるものではなく、被害額を後追いで頭打ちにするだけのものとして扱うほうが実態に合います。

対策

  • Trust & Safety の警告メールが来たら、その場でローテーションする。 Inactive でも Active でも同じです。新しい鍵を作って旧鍵を消す。Inactive で消せない場合は、Active に戻ったタイミングで消せるように、API keys を全ステータス表示で定期的に見る
  • 自動チャージの月上限を 1 回分に下げる。 2 回目が必要になる月は Auto Recharge Limit Reached のメールで気づいて手で買い足す。今回は月 $100 の設定で、気づく前に 2 回目まで走っていました
  • 残高を大きく持たない
  • 案件で渡した鍵は案件終了時に消す。 今回の鍵は過去の案件で使ったものでした。鍵は案件ごと・Project ごとに分けて、Default project に旧形式のユーザーキーを残さない
  • Service account / Project キーへ移行したうえで、Org の「Disable user API keys」を有効にする。 これで旧形式のユーザーキー自体が使えなくなります

返金申請の手順

不正利用の申請は https://openai.com/form/appeal/ から出します。

  1. 「Report unauthorized activity」を選ぶ
  2. 続いて「My API key was compromised」を選ぶ
  3. 期間、鍵の末尾 4 文字、Organization ID、鍵の現在の状態、詳細を入力する

フォームに添付欄はありません。Usage 画面のスクリーンショットのような証拠は、返信が来たときに添付することになります。8/29 の警告メールは Case ID 付きで届いているので、そちらへの返信も申請の経路として使えます。

まとめ

鍵を削除しても止まらないことがある、Inactive の鍵は自分で消せない、無効化も再有効化も通知が無い、spend limit はソフトリミットで残高はマイナスまで行く。この 4 つを知らないまま「警告は来たけど Inactive になっているから大丈夫」で 8 日間放置した結果が $269.19 でした。

警告メールが来たら、鍵の状態を確認するより先にローテーションしてしまうのが一番安い対応だと思います。