Rate Limits
Standard Tier
- 100 requests per minute per wallet address
- Cached responses (within 30s) do NOT count toward rate limit
- Free endpoints (/health, /) do NOT count
Premium Tier
- 1000 requests per minute per wallet address
- Contact sales@foursec.xyz to upgrade
Rate Limit Headers
Every response includes:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1688500000
| Header | Description |
|---|---|
| X-RateLimit-Limit | Max requests per minute |
| X-RateLimit-Remaining | Remaining requests this minute |
| X-RateLimit-Reset | Unix timestamp when limit resets |
Exceeding the Limit
Returns 429 Too Many Requests:
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 30 seconds.",
"retry_after": 30
}
Best Practices
- Use caching — 30s cache means identical requests are free
- Implement retry logic with exponential backoff
- Batch related requests — fetch multiple symbols in parallel
- Monitor headers — check X-RateLimit-Remaining before bursting
Retry Example
import time
def request_with_retry(url, max_retries=3):
for attempt in range(max_retries):
response = client.get(url)
if response.status_code != 429:
return response.json()
wait = 2 ** attempt
print(f"Rate limited. Retrying in {wait}s...")
time.sleep(wait)
raise Exception("Max retries exceeded")