spicyapiドキュメント
リファレンス
本文

レート制限

読み取り・書き込み枠の仕組みと対象、他の上限、同時実行数との違いを説明します。

レート制限は短時間に送れる要求数の上限です。超えると処理せず 429(要求過多)で待ち時間を伝えます。暴走するスクリプトを防ぐ安全策で、生成総量の枠ではありません。

制限の一覧

制限初期値到達時詳細
アカウントの要求数読み取り 10 秒で 1,000 件、書き込みも別に同数Retry-After 付き 429下記
アップロード URL の要求10 秒で 1,000 件Retry-After 付き 429下記
発行済みで未使用のアップロード URL128 ファイル、または 1 GiB429。待つだけでは解消しない下記
使用量レポート1 分に 30 件、対象期間 92 日429 / 400下記、課金
利用可能残高—40201課金
キーの支出上限(日次・月次・累計)設定しなければなし40202課金
チームの日次・月次上限なし40202課金
所有チーム数・チームの人数10 / 100コンソールで 409コンソールとチーム

アカウントごとの 2 つの枠:読み取りと書き込み

/api/v1/* と互換の /v1/*、/v1beta/* は、キーでなくアカウント単位で制限します。キー単位なら増やすだけで回避できるためです。

読み取りと書き込みは、同じ量の別々の枠で数えます。初期の保護しきい値は各 10 秒で 1,000 要求、持続する速度で約 100 RPS(毎秒の要求数)、一時的に 1,000 件です。通常の有料生成を少量に制限する枠ではなく、不正利用やクライアントの暴走を防ぐ大きな保護枠です。

固定時間窓ではなくトークンバケットです。容量 1,000 を 10 秒で補充し、毎秒約 100 トークンが戻ります。各要求が 1 つ使い、継続的に補充します。固定窓と違い、期間の境界でも滑らかに戻ります。

読み取りと書き込みは別の枠を使います

読み取りは全 GET、recordInfo、jobs 一覧、chat/credit、usage、models と、料金計算だけの jobs/quote です。書き込みは残りの createTask、retry、stream、purge、common/upload-url、common/download-url、互換の chat/completions、messages、Gemini 生成です。ネイティブと互換は同じ 2 枠を共有し、/api/v1 から /v1 へ変えても枠は増えません。

ポーリングでタスク送信の枠を使い切ることはありません。 暴走する照会ループは読み取りだけを消費し、recordInfo が 429 になっても createTask は通ります。ただし要求は消費するため、本番では無用な呼び出しと遅延を減らす Webhook を優先します。

モデルカタログも読み取り枠を使います。変わらないスキーマを毎タスク取得せず、更新時刻でキャッシュし、検証失敗時に更新します。

upload-url には書き込み枠に加え、独自の 10 秒で 1,000 要求の保護があります。オブジェクト保存への書き込み許可を別に守り、通常は届かない量です。

usage は逆に、読み取り枠に加えて 1 分で 30 要求という厳しい枠があります。履歴を集計し、通常の読み取りより処理が重いためです。照合用で、ポーリングには使いません。この枠は判定不能時に常に 429 を返します。他の枠で通過する設定ができても、これは許可側に倒れません。

未使用のアップロード URL

別途、1 アカウントの発行済みで未使用の URL は最大 128 件、申告サイズの合計は 1 GiB です。追加要求は 429 と Too many pending uploads; finish existing uploads before requesting more を返し、Retry-After はありません。

待つだけでは解消しないので、汎用再試行を回し続けないでください。発行済みをアップロードして確定するか、約 20 分の URL 期限が切れると、その分の余地が空きます。多くは、スクリプトが URL を大量発行して未使用のままにする問題です。メディア参照。

すべての枠

制限はインターフェース単位で適用し、同じ範囲の要求は共通の処理を通ります。API 利用者が関係するのは最初の 5 つです。

枠対象集計単位初期の許容量
ネットワークキー確認前の全 API 要求接続元 IP。IPv6 は /641 分で 6,000 件。通常より十分高いが、同じ社内ネットワークでは共有
open_api/api/v1/*、/v1/*、/v1beta/* の書き込み。GET/HEAD 以外、jobs/quote を除くアカウント10 秒で 1,000 件。持続約 100 RPS
open_api_read同じパスの GET/HEAD、models、jobs/quoteアカウント10 秒で 1,000 件。持続約 100 RPS
upload_url/api/v1/common/upload-urlアカウント10 秒で 1,000 件。open_api に追加
api_usage/api/v1/usageアカウント1 分で 30 件。open_api_read に追加
コンソール認証済みの /console/v1/*アカウント読み取り 1 分で 120 件、書き込みも別に同数
catalogマーケティングサイトの匿名公開カタログ。/api/v1/models とは別接続元 IP1 分で 300 件

キー単位ではなくアカウント単位です

open_api と open_api_read はアカウントで数えます。キーを増やしても増量できません。キー単位ならコンソールの 1 操作で回避できてしまいます。

upload_url と api_usage は実際に別枠です。参照アップロードは open_api と upload_url、usage の読み取りは open_api_read と api_usage を使い、どちらかが尽きると 429 になります。

初期値はリリースなしで変更できます。現在値は X-RateLimit-Limit とコンソールの概要にあります。ヘッダーを基準にし、クライアントに初期値を固定しないでください。

応答ヘッダー

ヘッダー出る応答意味
X-RateLimit-Limit全応答現在の期間の許容量
X-RateLimit-Remaining全応答残りトークン
Retry-Afterレート制限の 429待つ秒数。最低 1

初期値のアカウントの通常応答には、次が付きます。

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997

X-RateLimit-Remaining は成功にも付き、429 の後でなく前から速度を落とせます。

401 ではキーが識別されないため、アカウントでなくネットワーク枠(6000)を示します。

制限時の応答

{
  "code": 429,
  "msg": "Too many requests. Retry in a moment",
  "request_id": "req_…"
}

HTTP は 429、Retry-After 付きです。

上限超過は待機列へ入れず拒否します

即時に返します。待機列へ入れると遅延が積み重なり、返らない接続になって、明確な 429 より処理しにくくなります。拒否要求は受理されていないため無料です。

対処

Retry-After を読みます。 固定間隔で連打しません。例は 5 回で止まり、前述の未使用アップロードの 429 も無限に回りません。

JavaScript
async function callRespectingLimits(url, init) {
  for (let i = 0; i < 5; i++) {
    const res = await fetch(url, init);

    if (res.status !== 429) return res;

    // The server already told you how long to wait; don't guess
    const wait = Number(res.headers.get('retry-after') ?? 1);
    await new Promise((r) => setTimeout(r, wait * 1000));
  }
  throw new Error('persistently rate-limited');
}
Python
import time, requests


def call_respecting_limits(method: str, url: str, **kwargs) -> requests.Response:
    for _ in range(5):
        res = requests.request(method, url, **kwargs)

        if res.status_code != 429:
            return res

        # The server already told you how long to wait; don't guess
        time.sleep(float(res.headers.get("retry-after", 1)))

    raise RuntimeError("persistently rate-limited")

同時実行数は別の問題

制限は送信速度で、実行中タスク数ではありません

受理して待機列へ入ると、レート制限枠を消費しなくなります。100 タスクの同時生成だけで 429 は出ません。

進行中タスクを制限するのは次で、いずれもレート制限ではありません。

  • 利用可能残高: 全進行中タスクが資金を予約します。尽きると新規は 40201。
  • 支出上限: キーの日次・月次・累計、所属チームの日次・月次、プラットフォームの日次です。どれかに達すると 40202。支出上限参照。
  • 実行容量: モデルをまったく実行できない場合は 50301。

「同時にもっと動かしたい」への答えは通常、レート制限でなく残高追加か支出上限の変更です。

増量を相談する

コンソールの概要で現在値を見られます。サポートの API 連携 で、最大の毎秒要求数、バッチの有無と規模を伝えます。審査を早められます。

それまでは同時呼び出しに上限を設け、Retry-After に従います。初期レートに合わせて不自然に低くせず、作業、生成時間、残高から同時数を決めます。

制限の仕組み自体が利用不能な場合

レート制限は外部カウンターに依存します。失敗時は設定により、許可して継続するか、拒否して枠を守ります。初期設定は拒否です。「設定を読めない」が「無制限」になってはいけません。

拒否設定では 500 でなく 429、Retry-After: 1 です。500 は障害を意味し、多くの SDK が即時再試行して負荷を増やすためです。429 と Retry-After は、必要な待機を伝えます。

429 を速く送りすぎた証拠と決め付けないでください。 どちらの場合も、Retry-After に従うのが適切です。

このページの内容