GPT APIを呼び出す関数をリリースしました。ステージングでは問題なく動作していました。しかし、本番環境で最初の数百人のユーザーがアクセスした途端、ログは429 Too Many Requestsで埋め尽くされました。今、あなたは推測しています。これは1分あたりのリクエスト数なのか、1分あたりのトークン数なのか、それとも日ごとの上限なのか?まだティア1のままなのか?先週切り替えたモデルは、古いモデルよりも厳しい制限があったのか?
以前にOpenAIを扱ったことがあるなら、新しいモデルが登場するたびにレート制限の話が複雑になっていることをご存知でしょう。GPT-5.5はGPT-4.1とは異なる制限があり、画像モデルはテキストモデルとは異なるカウント方法がされ、支出が増えるにつれて利用ティアは静かに変化します。Apidogは、各リクエストのレスポンスヘッダーを検査し、同時トラフィックをシミュレートし、コードをリリースする前にどの制限に抵触しているかを正確に確認できる単一のワークスペースを提供します。まだApidogをお持ちでない場合はダウンロードしてください。以下のワークフローは無料プランで動作します。
実際に重要な4つの制限
OpenAIは、すべてのGPT APIキーにいくつかのレート制限を適用しています。本番環境のアプリケーションでは、以下の4つの制限がすべて適用されていることを確認できます。
- RPM (requests per minute: 1分あたりのリクエスト数): 1分間に送信できるAPIコールの数。ほとんどのティアで最も低い上限です。
- TPM (tokens per minute: 1分あたりのトークン数): 1分間に処理できる入力トークンと出力トークンの合計。多くの人が忘れがちな上限です。
- RPD (requests per day: 1日あたりのリクエスト数): 無料およびティア1のキーに設定される日ごとの上限。ほとんどのテキストモデルでは、より高いティアになるとなくなります。
- IPM / TPD / バッチキュー制限: 画像生成、音声、埋め込み、バッチエンドポイントのモデル固有の上限。各エンドポイントファミリーには独自の上限があります。
リクエストが拒否されると、APIはHTTP 429と次のようなJSONボディを返します。
{
"error": {
"message": "Rate limit reached for gpt-5.5 in organization org-abc on tokens per min (TPM): Limit 30000, Used 28432, Requested 3120.",
"type": "tokens",
"param": null,
"code": "rate_limit_exceeded"
}
}
ボディには、どの制限(tokens、requests、またはtokens_usage_based)を超過したかが示されていることに注意してください。これは、何か問題が発生したときに最初に読むべき情報です。TPMによるエラーはRPMによるエラーとは異なり、その修正方法も異なります。429は一概に429ではありません。
HTTPレベルでの429の意味について、エンドツーエンドのリファレンスは、MDNの429ドキュメントおよびRFC 6585仕様を参照してください。再試行ヘッダーとティアの移動に関するOpenAI固有の動作については、OpenAIが公式のレート制限ページを公開していますので、ブックマークすることをお勧めします。
ティアの仕組みと、なぜ昇格し続けるのか(または停滞するのか)
GPT APIキーはOpenAIの利用ティアに属しています。ティアによって、RPMとTPMの上限の実際の数値が決まります。ティアは、アカウントの総支出と初回支払からの期間という2つの要因に基づいて昇格します。無料からティア5まで6つのティアがあり、テキストモデルのおおよその形は次のようになります。
| ティア | 支払い条件 | 待機期間 | テキスト RPM | テキスト TPM |
|---|---|---|---|---|
| 無料 | なし | なし | 3 | 40k |
| 1 | $5支払い済み | なし | 500 | 30k–200k (モデルによる) |
| 2 | $50支払い済み | 7日 | 5,000 | 450k |
| 3 | $100支払い済み | 7日 | 5,000 | 1M |
| 4 | $250支払い済み | 14日 | 10,000 | 2M |
| 5 | $1,000支払い済み | 30日 | 10,000 | 2M+ |
上記の数値は例示であり、正確な上限は時間とともに変化し、モデルによって異なります。ワークロードの規模を決定する前に、ダッシュボードから直接、あるいはより良い方法として、自身のAPIレスポンスヘッダー(後述)からライブの制限を確認してください。
2つの実用的な意味合い:
- 支払いを行うと自動的に昇格します。ティアはオプトインではありません。支出がティアのしきい値を超え、待機期間が経過した瞬間から、次のリクエストは新しい上限に対して実行されます。通知も移行ステップもありません。
- 降格することもあります。アカウントが長期間非アクティブになったり、支払い方法に問題が生じたりした場合、降格する可能性があります。請求に関する変更があった後は、本番環境でテストしてください。
他のモデルプロバイダーのティアシステムとの比較については、弊社のOpenAI APIユーザーレート制限解説、Claude APIレート制限ガイド、およびGrok-3 APIレート制限ガイドをご覧ください。メンタルモデルはプロバイダー間で同じですが、具体的な数値や次元は異なります。
レスポンスヘッダーからライブ制限を読み取る
現在の制限を見つけるためにダッシュボードを掘り下げる必要はありません。すべてのGPT APIレスポンスはヘッダーにそれらを含んでいます。次の4つを探してください。
x-ratelimit-limit-requests: このエンドポイントのRPM上限。x-ratelimit-remaining-requests: この1分間に残っているリクエスト数。x-ratelimit-limit-tokens: TPM上限。x-ratelimit-remaining-tokens: この1分間に残っているトークン数。
通常、x-ratelimit-reset-requestsとx-ratelimit-reset-tokensも含まれており、これらはバケットが補充されるまでの人間が読める形式の期間(例:6s、1m30s)を示しています。
これらを読み取る最も簡単な方法は、単一のチャット補完リクエストを送信し、ヘッダーが返ってくるのを確認し、自分が思っているティアにいることを確認することです。Apidogを使えば、これはワンクリックで可能です。
ステップ1: ApidogでGPTリクエストを設定する
Apidogを開き、新しいプロジェクトを作成し、その中に新しいリクエストを追加します。
メソッド: POST URL: https://api.openai.com/v1/chat/completions
Headersタブで:
| キー | 値 |
|---|---|
Authorization |
Bearer {{OPENAI_API_KEY}} |
Content-Type |
application/json |
二重波括弧の構文はApidogの環境変数から情報を取得するため、キーがリクエスト自体の中に存在することはありません。環境設定の下で一度変数を設定し、環境を切り替えることで個人キーとチームキーを切り替えれば、残りのコレクションは自動的に取得されます。OpenAIが請求の属性付けのために含めることができる組織IDとプロジェクトIDにも同じ方法が適用できます。
Bodyタブで、JSONを選択し、以下を貼り付けます。
{
"model": "gpt-5.5",
"messages": [
{"role": "user", "content": "ping"}
],
"max_tokens": 10
}
送信ボタンを押します。通常通り補完が返ってくるはずです。次に、レスポンスパネルのHeadersタブをクリックし、x-ratelimit-*の行までスクロールします。その4つの数値が現在の真の制限です。それらをスクリーンショットに撮ってください。これらがテストのベースラインとなります。
チャット補完リクエストの設定についてさらに詳しく知りたい場合は、弊社のApidogでChatGPT APIをテストする方法ガイドで、認証、ストリーミング、ツールコールについてエンドツーエンドで解説しています。
ステップ2: 意図的なバーストで制限を確認する
ヘッダーを読めば上限はわかりますが、1つのリクエストを送信しただけでは、上限に達したときの挙動については何も証明できません。ヘッダーに記載されている通りに実際にスロットリングがかかることを確認するには、小規模なバーストテストが必要です。
Apidogには、同じリクエストをN回同時に実行できるテストランナーが付属しています。保存したリクエストを開き、送信ボタンの横にあるドロップダウンをクリックして、「Run in Test Scenario」を選択します。以下を設定します。
- Iterations (繰り返し回数): 50回 (または設定されたRPMを十分に上回る任意の数値)
- Concurrency (同時実行数): 10
- Delay between iterations (繰り返し間の遅延): 0 ms
実行します。2つの有用な結果が考えられます。
- バーストが終了する前に、いくつかのリクエストが429を返します。これは良いことです。レスポンスヘッダーからの上限とアカウントの状態が同期していることを確認できます。
- 50回すべて成功し、ヘッダーには
remaining-requestsが期待通りに減少していることが示されます。あなたのRPMは思っていたよりも高いということです。レスポンスパネルで正確な値を確認してください。
Apidogのテストランナーは各レスポンスを記録するため、ステータスコードでソートし、すべての429エラーを1つのビューにまとめることができます。429の行をクリックしてそのボディを読んでください。messageフィールドは、RPM、TPM、または日ごとの上限のいずれに抵触したかを示します。これが、本番コードで規模を決定する際の基準となる次元です。
制限に達した後の対処法に関する入門書として、レート制限超過ガイドは、遭遇する可能性のあるすべての429の表面について詳しく説明しています。
ステップ3: RPMによる超過とTPMによる超過を区別する
上記の最初のバーストは、各リクエストが小さいためRPMを測定します。TPMを調査するには、リクエストの数を減らしつつ、それぞれのサイズを大きくする必要があります。messagesがはるかに大きなペイロードを運ぶようにリクエストボディを編集してください。
{
"model": "gpt-5.5",
"messages": [
{"role": "system", "content": "<ここに3,000トークン分のコンテキスト>"},
{"role": "user", "content": "上記を1つの文に要約してください。"}
],
"max_tokens": 200
}
今度は、同時実行数5で20回程度の繰り返しで別のシナリオを実行します。TPM上限が30kのティア1の場合、リクエスト制限に達するよりもはるか前にトークン制限に抵触するでしょう。
この区別は重要です。なぜなら修正方法が異なるからです。実際のワークロードが多くの小さなリクエストを送信する場合、RPMを修正します。つまり、キューイング、バッチ処理、または分散処理を行います。もし少ないながらも大きなリクエストを送信する場合、TPMを修正します。つまり、システムプロンプトを削減したり、prompt_cacheメカニズムでコンテキストをキャッシュしたり、リクエストを分割したりします。
ステップ4: 同時接続ユーザーをシミュレートする
バーストテストは、あなた自身の限界を測定します。本番環境のトラフィックは異なります。多くのユーザー、さまざまなリクエストサイズ、安定したベースラインの上に発生するバースト。
Apidogで、リクエストの3つまたは4つのバリエーション(小、中、大)を、繰り返し間にランダムな待機時間を入れてループするテストシナリオを作成します。ランナーはJavaScriptの事前および事後リクエストスクリプトをサポートしているため、次のことができます。
- 繰り返しごとにランダムなメッセージ長を選択する。
- 各レスポンス後に
x-ratelimit-remaining-tokensを読み取り、しきい値を下回った場合にシナリオを中断する。 - 200応答と429応答のレイテンシを個別に記録し、スロットリングがP95(95パーセンタイル)をどのように引き下げるかを確認する。
シナリオが完了すると、レポートにはステータスコードのヒストグラムが表示されます。このヒストグラムは、ランブックに固定できる最も有用な成果物です。同僚が「レート制限に引っかかってる?」と尋ねた瞬間、それを再実行して比較できます。
スロットリングされた場合の対処法
どこに壁があるかを測定したら、誠実な3つの選択肢があります。
- バックオフ(Back off)。すべてのGPT呼び出しを指数バックオフ再試行でラップします。429レスポンスから
x-ratelimit-reset-tokensヘッダーを読み取り、それを最初の再試行遅延として使用します。このヘッダーはOpenAIが「これだけ待て」と文字通り答えているものです。単純なtime.sleep(2 ** attempt)も機能しますが、待つ必要のなかった時間を無駄にします。 - キュー(Queue)。トラフィックがバースト的である場合、リクエストをキューに入れ、上限をわずかに下回るレートで処理します。TPMよりわずかに低い値に固定されたトークンバケットリミッターが標準的なパターンです。APIレート制限の実装方法およびAPIでのレート制限の実装で、実装のトレードオフについて詳しく解説しています。
- バッチ(Batch)。OpenAIのBatch APIは、同期呼び出しよりも高い上限で、半額の料金で実行されます。ワークロードが24時間以内の処理(夜間エンリッチメント、ドキュメント分類、埋め込み再構築など)を許容できる場合、それをBatchに移行して、ユーザー向けトラフィックのための同期クォータを解放します。
どちらかを選択する前に、スロットリングとレート制限の違いについて深く掘り下げて知りたい場合は、スロットル vs. レート制限が専門用語を理解する最短経路です。
一般的なGPT 429エラーとその意味
429エラーの3つのタイプで、実際のケースのおよそ90%をカバーします。
Rate limit reached … on requests per min (RPM)は、あなたのコードがサイズに関係なく1分間にあまりにも多くの呼び出しを発行していることを意味します。並行処理制御を追加してください。並列mapでレコードをすべて同時に発行するのではなく、ワーカープールをRPMを安全係数2で割った値に制限してください。Rate limit reached … on tokens per min (TPM)は、あなたの呼び出しが大きすぎることを意味します。プロンプトを監査してください。ほとんどのTPM超過は、時間とともに大きくなったシステムプロンプトや、ドキュメント全体をコンテキストに詰め込むRAGパイプラインに起因します。プロンプトを削減、キャッシュ、または分割してください。You exceeded your current quota, please check your plan and billing detailsは429のように見えますが、実際にはレート制限ではなく、請求に関する問題です。アカウントが月間の支出上限に達した、登録されているカードが無効になった、または前払い残高がゼロになったことを意味します。修正はコード内ではなく、請求ダッシュボードで行います。
よくある質問
ApidogでGPTのレート制限をテストするのに費用はかかりますか? いいえ、かかりません。無料プランで単一リクエストのテストや小規模な同時実行テストが可能です。より大きなテスト負荷、チームワークスペース、またはスケジュール実行が必要な場合にのみ、有料プランが必要です。Apidogの料金で詳細をご確認ください。
実際のトークンを消費せずにレート制限をテストできますか? 部分的には可能です。最も安価なベースラインチェックは、max_tokens: 1と1文字のメッセージを含む単発リクエストです。これは数セントの費用で済み、ヘッダーは完全に返ってきます。バーストテストの場合、実際のトークンを消費しますが、各呼び出しを最小限に抑えることができます。完全にオフラインでリハーサルしたい場合は、Apidogのモックサーバーを使用して429応答の形状をシミュレートし、OpenAIをまったく呼び出さずに再試行ロジックが機能することを証明できます。
ティア1のキーが同僚のティア1のキーよりも遅く感じるのはなぜですか? ティアの上限は組織単位であり、キー単位ではありません。あなたのキーが他のヘビーユーザーと共有されている組織にある場合、彼らのトラフィックと競合しています。Apidogはこれを明確に示すことができます。両方のキーから同じリクエストを並行して実行し、x-ratelimit-remaining-tokensの減少を比較してください。
どのモデルにどの制限があるか、どうすればわかりますか? レスポンスヘッダーを読んでください。ブログ記事(これを含む)の一般的な表を信用しないでください。Apidogから各モデルに安価なリクエストを1つ送信し、ヘッダーを記録してください。同じ名前でも異なるスナップショットバージョン(例:gpt-5.5とgpt-5.5-0901)を持つモデルは、異なる上限を持つことがあります。
ストリーミングリクエストは異なるカウント方法になりますか? TPMについては異なります。ストリーミングリクエストはmax_tokensに基づいてトークンを事前に予約するため、実際の完了が短かったとしても、長いmax_tokens値はTPM予算を消費してしまう可能性があります。max_tokensを現実的な最も厳密な上限に下げてください。ApidogでChatGPT APIをテストする方法でストリーミングの動作について解説しています。
Apidogのレート制限テストをチームと共有できますか? はい、できます。共有プロジェクトにリクエストとテストシナリオを保存してください。ワークスペース内の誰でも、環境を切り替えることで自分のキーに対して同じバーストを実行できます。これにより、「私のキーがスロットリングされているのか、それとも彼らのキーがスロットリングされているのか?」という疑問が10秒で解決します。
