Rate Limiting and Quotas

Understand Smart Money API rate limits, daily quotas for each subscription tier, and optimization strategies to maximize your API usage.

Overview

Smart Money API implements daily request quotas to ensure service quality and fairness across all users. Each subscription tier includes a different daily limit. When you exceed your daily quota, you receive a 429 Too Many Requests error until your quota resets at midnight UTC.

Rate limits are applied per API key. Each key has its own independent quota. You can generate multiple keys for different applications and monitor usage for each separately.

Quotas by Subscription Tier

Tier Daily Requests Price Features
Free 200 requests/day $0 BTC, ETH, SOL, funding rates, liquidations
Trader 1,000 requests/day $29/month All symbols, whale positions, OI data
Pro 5,000 requests/day $79/month Confirmation scores, on-chain data, webhooks
Enterprise Custom Custom Dedicated support, custom integrations

Rate Limit Response Headers

Every API response includes headers indicating your current quota status:

HTTP Headers
X-Requests-Limit: 200 X-Requests-Remaining: 147 X-Requests-Reset: 1711116000 X-Requests-Reset-ISO: 2026-03-22T00:00:00Z
Header Description
X-Requests-Limit Total requests allowed per day (e.g., 200 for Trader)
X-Requests-Remaining Requests remaining in current day
X-Requests-Reset Unix timestamp when quota resets
X-Requests-Reset-ISO ISO 8601 timestamp for quota reset

Checking Quota Before Making Requests

Python
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"Quota: {remaining}/{limit} requests ({percent_used:.1f}% used)") print(f"Resets at: {reset_time}") if remaining < 5: print("WARNING: Approaching quota limit!") return False return True # Check before making requests if check_quota_before_request("sk_live_abc123xyz789"): print("Safe to proceed with API calls")

Daily Rate Window

Rate limits operate on a 24-hour rolling window. Your quota resets daily at midnight UTC (00:00 UTC). The exact reset time is provided in the X-Requests-Reset-ISO header.

Example: Trader Tier (1,000 requests/day)

  • Day 1 (Mar 21): 200 requests available at 00:00 UTC
  • 10:30 UTC: Made 75 requests, 125 remaining
  • 15:45 UTC: Made 100 more requests, 25 remaining
  • 23:59 UTC: Still 25 requests remaining (can't carry over)
  • Day 2 (Mar 22, 00:00 UTC): Quota resets to 200

Optimization Strategies

1. Cache API Responses

Whale positions don't change every second. Cache results for 30-60 seconds and serve cached data instead of making new API calls.

Python
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() # Return cached data if still fresh if cache_key in self.cache: age = now - self.cache_time[cache_key] if age < self.cache_ttl: print(f"Served from cache (age: {age:.1f}s)") return self.cache[cache_key] # Fetch fresh data 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 # Usage: Cache for 60 seconds client = CachedClient("sk_live_abc123xyz789", cache_ttl=60) whales1 = client.get_whale_positions("BTCUSDT") # API call whales2 = client.get_whale_positions("BTCUSDT") # From cache whales3 = client.get_whale_positions("BTCUSDT") # From cache

2. Use WebSocket for Real-Time Data

WebSocket connections deliver updates instantly without counting against your rate limit. Subscribe to streams and receive updates as they happen, reducing the number of REST API calls needed.

3. Batch Requests Strategically

Make one request with multiple symbols when possible instead of separate requests for each symbol. This reduces API calls by up to 10x.

4. Use Filtering at Request Time

Apply filters (symbol, exchange, min_position_size) in query parameters to get exactly the data you need, avoiding the need for post-processing.

Handling Rate Limit Errors

Retry with Exponential Backoff

Python
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: # Rate limited - back off exponentially wait_time = min(2 ** attempt, 300) # Max 5 minutes reset_time = response.headers.get("X-Requests-Reset-ISO") print(f"Rate limited. Retrying in {wait_time}s (resets at {reset_time})") time.sleep(wait_time) elif response.status_code >= 500: # Server error - retry wait_time = 2 ** attempt print(f"Server error {response.status_code}. Retrying in {wait_time}s") time.sleep(wait_time) else: # Other error - don't retry raise Exception(f"HTTP {response.status_code}: {response.text}") except requests.exceptions.Timeout: wait_time = 2 ** attempt print(f"Timeout. Retrying in {wait_time}s") time.sleep(wait_time) raise Exception("Max retries exceeded") # Usage data = request_with_retry( "https://api.smartmoneyapi.com/v1/whales/events", "sk_live_abc123xyz789" ) print(data)

Ready to Upgrade?

Free tier not enough? Upgrade to Trader or Pro for higher quotas and access to advanced features like confirmation scores and on-chain data.

View Pricing

Optimize Your API Usage Today

Implement caching, use WebSocket for real-time data, and handle rate limits gracefully.

Read Documentation
Start free — 200 calls/day, no card

Get live whale flow, funding, open interest and on-chain data across 3 exchanges from one API. Free tier, no credit card, upgrade any time.

Start free →
Try the live API console → (no account needed)
Get your API key in 30 seconds

Ready to build? Grab a free API key (200 calls/day, no card) and start pulling live whale, funding and on-chain data.

Get your API key →