クレジットを購入した直後、AI Studio の Billing タブを開いたままリロードを繰り返していた夜があります。決済完了のメールは届いているのに、残高の欄は 0 のまま。手元のスクリプトは相変わらず失敗します。胃のあたりが少し重くなる瞬間でした。いま思えば、私が疑うべきだったのは決済ではなく、反映までの短い空白だったのかもしれません。
最初にお伝えしたいのは、このとき最初に見るのは Cloud Billing ではなく AI Studio だということです。理由と、そのあとの切り分けの順番を書き残します。
症状を二つに分けて考える
「入金したのに使えない」という言い方には、実は別々の現象が混ざっています。
- 画面の残高が 0 のまま動かないのは、表示の問題です
- リクエストが HTTP 402 などで失敗し続けるのは、実際に止まっている問題です
公式の請求ページによると、残高が 0 になるとリクエストは 402 で失敗し、クレジットを追加すれば復旧します。ただし新しい残高が反映されるまでに短い遅れがあるとも書かれています。つまり「買った直後の数分」は、画面もリクエストも古い状態のままでいることがあるのです。
手順 1: 残高を見る場所は AI Studio だけ
プリペイドの残高の管理は、Google AI Studio の Billing タブで行います。Cloud Billing の画面には Gemini API の費用が出ますが、残高そのものを操作できるのは AI Studio だけです。
Cloud Billing 側のコストデータは、AI Studio の利用状況より遅れて載ります。通常は一日以内、場合によってはそれより長くかかります。Cloud Billing に金額が出ていないことは、入金が失敗した証拠にはなりません。
手順 2: 支払い方法と待ち時間を確かめる
カード決済は通常すぐ反映されますが、銀行振込などは数日かかる場合があります。サービスが再開するのは、購入が正式に確認されたあとです。
| 状況 | 見立て | 次の一手 |
|---|---|---|
| カードで購入して 10 分以内 | 反映待ち | 少し置いてから AI Studio を再読み込み |
| カードで購入して 30 分以上 | 決済の確認が済んでいない可能性 | 決済メールと Billing タブの購入履歴を見る |
| 銀行振込など | 数日かかることがある | 確認完了まで待つ |
| 残高は正なのに止まる | 残高以外の理由 | 手順 3 へ |
「10 分」という数字は、公式が課金パイプラインの遅れとして示している目安に合わせています。私自身の端末で厳密に計ったものではありません。
手順 3: 残高が正なのに止まるとき
残高が表示されているのに失敗する場合は、残高以外の原因を疑います。公式ページに挙がっているのは次のようなものです。
- ティアの上限額に達している場合です
- 同じ請求アカウントで、ポストペイ側の支払いに問題がある場合です(他の Cloud サービスの未払いでも、プリペイド残高の多寡にかかわらず Gemini が止まることがあります)
- 「The billing account type is inactive or unsupported」と出る場合は、請求アカウントの種類か状態が有料ティアの対象外です
- プリペイドの設定を途中でキャンセルし、請求アカウントが課金できない状態のまま残っていることもあります
ここで初めて Cloud Console の請求アカウントの状態を見にいきます。残高は AI Studio、アカウントの状態は Cloud Console、と役割を分けておくと迷いません。
ティア上限やプロジェクトごとの上限で止まる場合の考え方は、Gemini API の 429 を再試行してよいものと上限到達に分ける設計と、ティアごとの支出上限とプロジェクト分離で詳しく扱っています。
手順 4: 手元のコードで「止まり方」を見分ける
画面を眺めるより、リクエストの結果を記録するほうが早く決着します。次は、ステータスコードとエラー本文を一行で残す最小の確認スクリプトです。何を解決するかといえば、「残高切れ(402)」と「それ以外の失敗」を目で追わずに切り分けることです。
import os
import sys
import requests
# YOUR_API_KEY は環境変数から読む(コードに直接書かない)
API_KEY = os.environ["GEMINI_API_KEY"]
MODEL = "gemini-3.8-flash" # 手元で使っているモデル名に置き換える
URL = f"https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:generateContent"
resp = requests.post(
URL,
headers={"x-goog-api-key": API_KEY, "Content-Type": "application/json"},
json={"contents": [{"parts": [{"text": "ping"}]}]},
timeout=30,
)
print(resp.status_code, resp.text[:300])
if resp.status_code == 402:
print("残高切れの可能性: AI Studio の Billing タブで残高を確認")
sys.exit(2)
if resp.status_code == 429:
print("上限到達の可能性: ティアの上限と利用状況を確認")
sys.exit(3)
if not resp.ok:
print("残高以外の原因: 請求アカウントの状態・キー・モデル名を確認")
sys.exit(1)なぜこう書くかというと、402 と 429 では見に行く場所が違うからです。402 なら残高、429 なら上限、それ以外ならアカウントやキーの側にある、という分け方にしています。手順 1 から 3 のどれに戻るかが、終了コードだけで分かります。
つまずきやすい三つの点
- 反映待ちの間に、別のクレジットを重ねて購入してしまいがちです(最低購入額は 5 ドルで、未使用のクレジットは 12 か月で失効し、返金は原則ありません)
- 複数のプロジェクトが同じ請求アカウントにぶら下がっていると、一つの残高切れが全プロジェクトのキーを同時に止めます
- Cloud Billing に出ない金額を見て「入金されていない」と判断してしまうこともあります
二つ目は、個人開発で複数のアプリのキーを一つの請求アカウントにまとめていると起こりやすいところです。残高が尽きた瞬間、全部のキーが一斉に止まります。
私の線引き
反映待ちの数分は、画面を触らないと決めました。リロードを繰り返しても残高は早く動きません。代わりに上の確認スクリプトを一度だけ走らせ、結果が 402 のままなら 10 分置く。それでも変わらなければ、決済メールと購入履歴、そのあとで請求アカウントの状態へ進みます。
残高は AI Studio で見ます。アカウントの状態は Cloud Console で見ます。 この役割分担だけは、焦っている夜でも崩さないようにしています。
次にクレジットを買うときは、購入前に確認スクリプトを手元に置いておくところから始めていただければと思います。