「Rate limit exceeded」「API rate limit reached」というエラーが出て困っていませんか?
このエラーは、短時間に大量のリクエストを送りすぎたために、サービス側から一時的にアクセスをブロックされている状態を示しています。
TwitterやGitHub、GoogleのAPIなど、多くのWebサービスでこのエラーに遭遇する可能性があります。
この記事では、Rate Exceeded エラーの意味から原因、具体的な解決方法まで、分かりやすく解説していきます。
Rate Exceeded エラーとは

まず、このエラーの基本的な意味を理解しておきましょう。
エラーの正式名称
Rate Limit Exceeded(レート・リミット・エクシーディッド)
日本語では「レート制限超過エラー」または「アクセス制限超過エラー」と訳されます。
簡単に言うと
Rate Exceeded エラーは、「一定時間内にリクエスト(要求)を送りすぎたので、しばらく待ってください」というメッセージです。
身近な例え:
銀行のATMで「1日の引き出し限度額を超えました」と表示されるのと似ています。
安全のために、1日や1時間あたりの利用回数・量が制限されているわけです。
よく見るエラーメッセージ
英語のエラー表示例:
Rate limit exceeded
API rate limit reached
Too many requests
429 Too Many Requests
You have exceeded your request rate
Quota exceeded
日本語表示の場合:
- 「リクエスト制限を超えました」
- 「アクセス数が上限に達しました」
- 「しばらく時間をおいてから再度お試しください」
なぜレート制限が存在するのか
そもそも、なぜサービス側がリクエスト数を制限するのでしょうか。
理由1:サーバー負荷の分散
問題:
1人のユーザーが大量のリクエストを送ると、サーバーに負荷がかかり、他のユーザーがサービスを利用できなくなります。
対策:
レート制限により、すべてのユーザーが公平にサービスを利用できるようにします。
理由2:悪意ある攻撃の防止
DDoS攻撃(分散型サービス拒否攻撃):
大量のリクエストを送ってサーバーをダウンさせる攻撃を防ぎます。
スクレイピング対策:
自動プログラムによる大量のデータ収集を防ぎます。
理由3:ビジネスモデルの保護
無料プランと有料プランの差別化:
- 無料ユーザー:1時間に100リクエストまで
- 有料ユーザー:1時間に10,000リクエストまで
このように、収益化の仕組みとしてレート制限を活用しています。
理由4:API使用の公平性
API(Application Programming Interface)を提供するサービスでは、特定のユーザーが独占的に使わないよう制限します。
Rate Exceeded エラーが発生する主な原因
このエラーが出る具体的な理由を見ていきましょう。
原因1:短時間の連続アクセス
例:
- F5キーを連打してページを更新
- 自動化スクリプトで数秒おきにAPIを呼び出し
- ブラウザで複数のタブを同時に開いて同じサービスにアクセス
原因2:プログラムのバグやループ
プログラミングの例:
# 悪い例:無限ループでAPI呼び出し
while True:
response = api.get_data() # 制限なしで呼び出し
process(response)
ループ処理に待機時間(sleep)を入れないと、一瞬で制限に達します。
原因3:複数デバイスからの同時アクセス
同じアカウントで、パソコン、スマホ、タブレットなど複数のデバイスから同時にアクセスすると、合計のリクエスト数が制限を超えることがあります。
原因4:知らないうちに大量リクエストを送るアプリ
例:
- 自動更新機能が頻繁にサーバーにアクセス
- バックグラウンドで動作するアプリが定期的にデータ取得
- ブラウザの拡張機能が自動的にAPIを呼び出し
原因5:無料プランの制限が厳しい
サービスによっては、無料プランのレート制限が非常に厳しく設定されていることがあります。
例:
- 1時間に50リクエストまで
- 1日に1,000リクエストまで
通常の使い方でも、すぐに上限に達する場合があります。
主要サービスのレート制限例
代表的なサービスのレート制限を紹介します。
Twitter API(X API)
無料プラン(Basic):
- 1ヶ月あたり10,000ツイート取得
- 書き込みは月50投稿まで
有料プラン:
- Pro:1ヶ月100万ツイート取得
- Enterprise:カスタマイズ可能
GitHub API
認証なし:
- 1時間あたり60リクエスト
認証あり:
- 1時間あたり5,000リクエスト
Google APIs
サービスによって異なる:
- YouTube Data API:1日あたり10,000クォータ単位
- Google Maps API:月28,500リクエストまで無料
- Gmail API:1ユーザーあたり1秒間に250リクエスト
OpenAI API(ChatGPT)
モデルとプランによって変動:
- 1分あたりのリクエスト数(RPM)
- 1分あたりのトークン数(TPM)
- 1日あたりのリクエスト数(RPD)
有料プランで上限が拡大されます。
Stripe API(決済サービス)
デフォルト:
- 1秒あたり100リクエスト
超過すると自動的にレート制限がかかります。
Rate Exceeded エラーの解決方法
エラーが出た時の具体的な対処法を紹介します。
解決法1:時間をおいて再試行
最もシンプルで確実な方法です。
手順:
- エラーが出たら、一旦操作を中止
- 数分~数時間待つ
- 再度アクセスを試みる
待機時間の目安:
- 1分制限の場合:1~2分待つ
- 1時間制限の場合:1時間後に再試行
- 1日制限の場合:翌日まで待つ
解決法2:リクエスト間隔を空ける
プログラムやスクリプトの場合、リクエストの間に待機時間を入れます。
Python の例:
import time
for item in data_list:
response = api.get_data(item)
process(response)
time.sleep(1) # 1秒待つ
推奨する間隔:
- 最低でも1秒
- 安全を見て2~3秒
- APIのドキュメントで推奨間隔を確認
解決法3:Retry-After ヘッダーを確認
多くのAPIは、エラーレスポンスに「いつ再試行すべきか」の情報を含めています。
HTTPレスポンスヘッダーの例:
HTTP/1.1 429 Too Many Requests
Retry-After: 3600
Retry-After: 3600
は、「3600秒(1時間)後に再試行してください」という意味です。
プログラムでの対処例:
import requests
import time
response = requests.get(api_url)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
print(f"{retry_after}秒待機します")
time.sleep(retry_after)
response = requests.get(api_url) # 再試行
解決法4:リクエスト数を減らす
不要なリクエストを削減します。
改善例:
- キャッシュを活用:一度取得したデータを保存し、再利用
- バッチ処理:複数の操作を1回のリクエストにまとめる
- 必要なデータだけ取得:無駄な情報を取得しない
キャッシュの例:
cache = {}
def get_data(item_id):
if item_id in cache:
return cache[item_id] # キャッシュから返す
response = api.get_data(item_id) # APIを呼ぶ
cache[item_id] = response
return response
解決法5:有料プランにアップグレード
頻繁にレート制限に引っかかる場合、有料プランへの移行を検討しましょう。
メリット:
- リクエスト上限が大幅に増加
- 優先的なサポート
- 追加機能の利用
判断基準:
- 業務で使用している
- 無料枠では不十分
- 時間的コストを考えると有料が効率的
解決法6:複数のAPIキーを使う(非推奨)
注意:多くのサービスで規約違反になります。
サービスによっては、複数アカウントを作成してAPIキーを使い分けることで制限を回避できますが、規約違反となり、アカウント停止のリスクがあります。
推奨しない理由:
- 利用規約違反
- アカウント停止の可能性
- 倫理的に問題
HTTPステータスコード 429 について
Rate Exceeded エラーは、HTTPステータスコード 429 で返されます。
429 Too Many Requests とは
定義:
クライアント(ユーザー側)が一定時間内に送信したリクエストが多すぎることを示すステータスコード。
レスポンスの例:
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 3600
{
"error": "Rate limit exceeded",
"message": "You have exceeded the allowed request rate. Please try again in 3600 seconds."
}
他のエラーコードとの違い
ステータスコード | 意味 | 対処法 |
---|---|---|
200 OK | 成功 | – |
400 Bad Request | リクエストが不正 | リクエスト内容を修正 |
401 Unauthorized | 認証が必要 | APIキーやトークンを確認 |
403 Forbidden | アクセス権限がない | 権限を確認 |
429 Too Many Requests | レート制限超過 | 時間をおいて再試行 |
500 Internal Server Error | サーバー側のエラー | サーバー管理者に連絡 |
503 Service Unavailable | サービス利用不可 | 時間をおいて再試行 |
プログラミングでの対策とベストプラクティス
開発者向けの実装方法です。
1. 指数バックオフ(Exponential Backoff)
失敗するたびに待機時間を倍増させる手法。
実装例(Python):
import time
import requests
def api_call_with_backoff(url, max_retries=5):
retry_count = 0
wait_time = 1 # 初期待機時間(秒)
while retry_count < max_retries:
response = requests.get(url)
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
print(f"{wait_time}秒待機します...")
time.sleep(wait_time)
wait_time *= 2 # 待機時間を2倍に
retry_count += 1
else:
raise Exception(f"エラー: {response.status_code}")
raise Exception("最大リトライ回数に達しました")
2. レートリミッター(Rate Limiter)の実装
リクエスト送信を自動的に制御するクラス。
実装例:
import time
class RateLimiter:
def __init__(self, max_requests, time_window):
self.max_requests = max_requests
self.time_window = time_window # 秒
self.requests = []
def allow_request(self):
now = time.time()
# 古いリクエストを削除
self.requests = [req for req in self.requests if now - req < self.time_window]
if len(self.requests) < self.max_requests:
self.requests.append(now)
return True
else:
return False
def wait_if_needed(self):
while not self.allow_request():
time.sleep(1)
# 使用例:1分間に60リクエストまで
limiter = RateLimiter(max_requests=60, time_window=60)
for item in data_list:
limiter.wait_if_needed()
response = api.get_data(item)
3. ライブラリを活用
多くのプログラミング言語には、レート制限を扱うライブラリがあります。
Python:
ratelimit
pyrate-limiter
backoff
JavaScript/Node.js:
bottleneck
p-limit
axios-retry
よくある質問
Q. Rate Exceeded エラーが出たら、どれくらい待てばいい?
A. エラーメッセージやサービスのドキュメントを確認してください。
多くの場合、エラーメッセージに「○分後に再試行してください」と記載されています。
記載がない場合は、以下を目安に:
- 1分制限:1~2分待つ
- 1時間制限:1時間後
- 1日制限:翌日
Q. VPNを使えば制限を回避できる?
A. できません。
レート制限は通常、IPアドレスではなく、アカウントやAPIキーに紐づいています。
VPNで接続元を変えても、同じアカウントを使っていれば制限は回避できません。
Q. 制限に達したら、アカウントが停止される?
A. 通常は停止されませんが、悪質な場合は可能性があります。
一時的なレート制限超過では、アカウント停止にはなりません。
しかし、以下の場合はアカウント停止のリスクがあります:
- 意図的に制限を回避しようとする
- 自動化ツールで大量アクセス
- 規約違反の使い方
Q. すべてのAPIにレート制限がある?
A. ほとんどのAPIにあります。
公開APIのほぼすべてに何らかのレート制限があります。
ただし、企業内部のAPIなど、限られたユーザーだけが使うAPIには制限がないこともあります。
Q. レート制限の緩いサービスはどれ?
A. サービスによって大きく異なります。
一般的に:
- 厳しい:Twitter API、Instagram API、無料の翻訳API
- やや緩い:GitHub API(認証あり)、Slack API
- 緩い:自社運営の有料API、エンタープライズプラン
まとめ:レート制限を理解して賢く付き合おう
Rate Exceeded エラーは、サービスを公平に使うための仕組みです。
エラーの要点:
- 意味:短時間に大量リクエストを送りすぎた
- 原因:連続アクセス、プログラムのバグ、無料プランの制限
- HTTPコード:429 Too Many Requests
解決方法:
- 時間をおいて再試行(最もシンプル)
- リクエスト間隔を空ける(1~3秒程度)
- Retry-After ヘッダーを確認
- キャッシュやバッチ処理で効率化
- 有料プランへのアップグレード(業務利用の場合)
プログラミングでの対策:
- 指数バックオフの実装
- レートリミッターの活用
- 専用ライブラリの使用
注意点:
- 規約違反の回避方法は使わない
- VPNや複数アカウントは効果なし・規約違反
- エラーメッセージを必ず確認
レート制限は、サービスの安定運用に欠かせない仕組みです。
この記事を参考に、エラーを理解し、適切に対処してくださいね!
コメント