レート制限とクォータ
Smart Money APIのレート制限、各サブスクリプション層の日次クォータ、API利用を最大化するための最適化戦略を理解しましょう。
概要
Smart Money APIは、サービス品質と全ユーザーへの公平性を保証するため、日次リクエストクォータを実装しています。各サブスクリプション層には異なる日次制限が含まれます。日次クォータを超過すると、UTC午前0時にクォータがリセットされるまで429 Too Many Requestsエラーが返されます。
レート制限はAPIキーごとに適用されます。各キーには独立したクォータがあります。異なるアプリケーション用に複数のキーを生成し、それぞれの利用状況を個別に監視できます。
サブスクリプション層別クォータ
| ティア |
日次リクエスト |
価格 |
機能 |
| 無料 |
20リクエスト/日 |
$0 |
BTC, ETH, SOL, 資金調達率, 清算 |
| トレーダー |
400リクエスト/日 |
$29/月 |
全シンボル, クジラポジション, OIデータ |
| プロ |
4,000リクエスト/日 |
$79/月 |
確認スコア, オンチェーンデータ, Webhook |
| エンタープライズ |
カスタム |
カスタム |
専用サポート, カスタム統合 |
すべてのAPIレスポンスには、現在のクォータ状況を示すヘッダーが含まれます:
X-Requests-Limit: 200
X-Requests-Remaining: 147
X-Requests-Reset: 1711116000
X-Requests-Reset-ISO: 2026-03-22T00:00:00Z
| ヘッダー |
説明 |
X-Requests-Limit |
1日あたりの総リクエスト許可数 (例: トレーダーは200) |
X-Requests-Remaining |
現在の日に残っているリクエスト数 |
X-Requests-Reset |
クォータがリセットされるUnixタイムスタンプ |
X-Requests-Reset-ISO |
クォータリセットのISO 8601タイムスタンプ |
リクエスト前のクォータ確認
import requests
from datetime import datetime
def check_quota_before_request(api_key):
response = requests.head(
"https://api.smartmoneyapi.com/v1/whales/events",
headers={"Authorization": f"Bearer {api_key}"}
)
limit = int(response.headers.get("X-Requests-Limit", 0))
remaining = int(response.headers.get("X-Requests-Remaining", 0))
reset_unix = int(response.headers.get("X-Requests-Reset", 0))
reset_time = datetime.fromtimestamp(reset_unix)
percent_used = (limit - remaining) / limit * 100
print(f"クォータ: {remaining}/{limit} リクエスト ({percent_used:.1f}% 使用済み)")
print(f"リセット時間: {reset_time}")
if remaining < 5:
print("警告: クォータ制限に近づいています!")
return False
return True
# リクエスト前に確認
if check_quota_before_request("sk_live_abc123xyz789"):
print("API呼び出しを安全に実行できます")
日次レートウィンドウ
レート制限は24時間のローリングウィンドウで動作します。クォータは毎日UTC午前0時(00:00 UTC)にリセットされます。正確なリセット時間は X-Requests-Reset-ISO ヘッダーで提供されます。
例: トレーダーティア (400リクエスト/日)
- 1日目 (3月21日): 00:00 UTCで200リクエスト利用可能
- 10:30 UTC: 75リクエスト実行、残り125
- 15:45 UTC: さらに100リクエスト実行、残り25
- 23:59 UTC: まだ25リクエスト残り (繰り越し不可)
- 2日目 (3月22日, 00:00 UTC): クォータが200にリセット
最適化戦略
1. APIレスポンスをキャッシュする
クジラポジションは毎秒変化しません。結果を30-60秒間キャッシュし、新しいAPI呼び出しの代わりにキャッシュデータを提供します。
import requests
import time
class CachedClient:
def __init__(self, api_key, cache_ttl=60):
self.api_key = api_key
self.cache_ttl = cache_ttl
self.cache = {}
self.cache_time = {}
def get_whale_positions(self, symbol):
cache_key = f"whales:{symbol}"
now = time.time()
# キャッシュデータが新鮮なら返す
if cache_key in self.cache:
age = now - self.cache_time[cache_key]
if age < self.cache_ttl:
print(f"キャッシュから提供 (経過時間: {age:.1f}秒)")
return self.cache[cache_key]
# 新しいデータを取得
response = requests.get(
f"https://api.smartmoneyapi.com/v1/whales/events?symbol={symbol}",
headers={"Authorization": f"Bearer {self.api_key}"}
)
data = response.json()
self.cache[cache_key] = data
self.cache_time[cache_key] = now
return data
# 使用例: 60秒間キャッシュ
client = CachedClient("sk_live_abc123xyz789", cache_ttl=60)
whales1 = client.get_whale_positions("BTCUSDT") # API呼び出し
whales2 = client.get_whale_positions("BTCUSDT") # キャッシュから
whales3 = client.get_whale_positions("BTCUSDT") # キャッシュから
2. リアルタイムデータにWebSocketを使用する
WebSocket接続は更新を即時に配信し、レート制限にカウントされません。ストリームを購読し、変更が発生するとすぐに更新を受け取ることで、必要なREST API呼び出しの数を減らせます。
3. 戦略的にリクエストをバッチ処理する
可能な場合は各シンボルごとに個別のリクエストを行う代わりに、複数のシンボルを含む1つのリクエストを作成します。これによりAPI呼び出しを最大10倍削減できます。
4. リクエスト時にフィルタリングを使用する
クエリパラメータでフィルタ(シンボル、取引所、最小ポジションサイズ)を適用し、必要なデータのみを取得することで、後処理の必要性を回避します。
レート制限エラーの処理
指数バックオフで再試行する
import requests
import time
def request_with_retry(url, api_key, max_retries=5):
for attempt in range(max_retries):
try:
response = requests.get(
url,
headers={"Authorization": f"Bearer {api_key}"},
timeout=10
)
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
# レート制限 - 指数バックオフ
wait_time = min(2 ** attempt, 300) # 最大5分
reset_time = response.headers.get("X-Requests-Reset-ISO")
print(f"レート制限. {wait_time}秒後に再試行 (リセット時間: {reset_time})")
time.sleep(wait_time)
elif response.status_code >= 500:
# サーバーエラー - 再試行
wait_time = 2 ** attempt
print(f"サーバーエラー {response.status_code}. {wait_time}秒後に再試行")
time.sleep(wait_time)
else:
# その他のエラー - 再試行しない
raise Exception(f"HTTP {response.status_code}: {response.text}")
except requests.exceptions.Timeout:
wait_time = 2 ** attempt
print(f"タイムアウト. {wait_time}秒後に再試行")
time.sleep(wait_time)
raise Exception("最大再試行回数に達しました")
# 使用例
data = request_with_retry(
"https://api.smartmoneyapi.com/v1/whales/events",
"sk_live_abc123xyz789"
)
print(data)
アップグレードの準備はできていますか?
無料ティアでは足りませんか?確認スコアやオンチェーンデータなどの高度な機能にアクセスし、より高いクォータを得るためにトレーダーまたはプロにアップグレードしてください。
価格を見る
今日からAPI利用を最適化
キャッシュを実装し、リアルタイムデータにWebSocketを使用し、レート制限を適切に処理しましょう。
ドキュメントを読む