アカウント
レート制限
プランごとの毎分リクエスト数(Free 5、Pro 100、Team 3,000)と、キーごとの RPM 上限、1 日の USD 上限、モデル許可リストを説明します。レート制限ヘッダー、Idempotency-Key、429 エラーの処理も載せています。
レート制限は、残高とサービスを保護します。上限は API キーごとの毎分リクエスト数(RPM)で数えられ、キーには 1 日の USD 利用上限も設定できます。
プランごとの上限
| プラン | 毎分リクエスト数 |
|---|---|
| Free | 5 |
| Pro | 100 |
| Team | 3,000 |
| Enterprise | 3,000+ |
上限を引き上げるには、料金ページでアップグレードしてください。
キーごとの上限
API キーでキーを作成または編集するときに、次を設定できます。
| 上限 | 効果 |
|---|---|
| RPM 上限 | このキーの毎分リクエスト数に上限を設けます。実際の上限は、キーの上限とプランの上限の低いほうです。 |
| 1 日の USD 上限 | キーが本日(UTC)にこの金額を使い切ると、翌日まで以降のリクエストは 429 daily_limit_reached を返します。 |
| モデル許可リスト | このキーでは、リストにあるモデル ID のみ使用できます。それ以外は 403 model_not_allowed を返します。 |
RPM のウィンドウは 1 分で、キーごとに数えられます。そのため、アプリごとに別のキーを使えば上限は共有されませんが、すべてのキーはプランの上限で制限されます。
レート制限ヘッダー
すべての生成レスポンス(成功とエラーのどちらも)で現在の状況が分かるため、上限に達した後ではなく達する前に速度を落とせます。
| ヘッダー | 意味 |
|---|---|
X-RateLimit-Limit | このキーで、現在の 1 分間のウィンドウに許可されるリクエスト数。 |
X-RateLimit-Remaining | ウィンドウ内の残りのリクエスト数。 |
X-RateLimit-Reset | ウィンドウがリセットされるまでの秒数。 |
ブラウザークライアントも読み取れます(Access-Control-Expose-Headers に含まれています)。
バーストと同時実行
上限を超えたリクエストはすぐには拒否されず、キューで待機し、1分間のウィンドウが空き次第開始します。アカウントごとに同時に実行されるのは最大10件で、残りはいずれかが終わるまで待ちます。リクエストの開始前に、その推定最大コストが実行中のリクエストの分と合わせて残高から確保されるため、並列リクエストが残高を超えて消費することはありません。60秒以内に開始できないリクエストは Retry-After 付きで 429(rate_limited または concurrency_limit)を返し、コストが残高に収まらなくなったリクエストは 402 insufficient_balance を返します。
Idempotency-Key による安全な再試行
ネットワークエラーが起きると、リクエストが届いたかどうか分からなくなることがあります。Idempotency-Key ヘッダー(120 文字以内の一意の文字列、たとえば UUID)を送信し、同じキーで再試行してください。最初のリクエストがすでにモデルへ送信されていた場合、再試行はジョブを二重に実行して課金するのではなく、409 idempotency_conflict を返します。最初のリクエストがモデルに届く前に失敗した場合は、キーが解放され、再試行は通常どおり実行されます。キーは、アカウントごとに 24 時間のあいだ 1 回だけ使用できます。
curl https://api14.com/api/v1/images/generations \
-H "Authorization: Bearer $API14_KEY" \
-H "Idempotency-Key: 6f1c2a3e-order-1842" \
-H "Content-Type: application/json" \
-d '{"model": "black-forest-labs/flux-3-image", "prompt": "a red bicycle"}'
上限に達したとき
リクエストが多すぎる場合
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"error": {
"message": "Rate limit of 5 requests per minute exceeded.",
"type": "rate_limit_error",
"code": "rate_limited"
}
}
Retry-After に示された秒数だけ待ってから再試行してください。公式の OpenAI SDK は、429 のレスポンスをバックオフ付きで自動的に再試行します(デフォルトは 2 回。maxRetries / max_retries で設定できます)。
1 日の利用上限
{
"error": {
"message": "This API key reached its daily spend limit.",
"type": "rate_limit_error",
"code": "daily_limit_reached"
}
}
次の UTC 日になるまで、再試行しても解決しません。想定内のトラフィックである場合は、API キーでキーの 1 日の上限を引き上げるか、削除してください。
上流の制限
プロバイダーには独自の制限があり、:free のモデルバリアントではより厳しくなります。プロバイダーがリクエストをレート制限した場合、その 429 がそのまま返されます。モデルのフォールバックまたはプロバイダールーティングを使って、プロバイダー間で負荷を分散してください。
コードでの上限の処理
Retry-Afterに従い、指数バックオフとジッターを加えて再試行します。rate_limited(後で再試行)と、daily_limit_reachedおよびinsufficient_balance(再試行しても解決しない)を区別します。- バックグラウンドジョブは一度にすべて実行せず、キューに入れます。
- 長いレスポンスはストリーミングします。ストリーミングされた 1 つのリクエストは 1 リクエストとして数えられます。
import time
from openai import OpenAI, RateLimitError
client = OpenAI(base_url="https://api14.com/api/v1", api_key="sk-api14-...", max_retries=0)
for attempt in range(5):
try:
r = client.chat.completions.create(model="openai/gpt-5-mini", messages=[{"role": "user", "content": "Hi"}])
break
except RateLimitError as e:
if e.code == "daily_limit_reached":
raise
time.sleep(int(e.response.headers.get("retry-after", 2 ** attempt)))
すべてのステータスコードはエラーを参照してください。