Rate Limits
Rate limits are enforced per API key using a moving window algorithm.
Limits
Requests per minute300
Window typeMoving window
Limit scopePer API key
Limits are configurable via server-side environment variables. Contact us if your integration requires a higher limit.
Response headers
When a rate limit is exceeded the API returns HTTP 429 with a Retry-After header indicating how many seconds to wait before retrying.
| Header | When | Description | Example |
|---|---|---|---|
Retry-After | 429 only | Seconds to wait before the next request will succeed | 12 |
Handling 429s
Use exponential backoff to retry, respecting the Retry-After value from the response header.
429 Response
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 12 seconds.",
"status": 429
}
}import requests
import time
def request_with_retry(url, headers, max_retries=5):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 10))
# Exponential backoff with server hint
wait = max(retry_after, 2 ** attempt)
print(f"Rate limited. Waiting {wait}s before retry {attempt + 1}/{max_retries}")
time.sleep(wait)
continue
response.raise_for_status()
return response.json()
raise Exception("Max retries exceeded")
headers = {"X-API-Key": "bp_live_your_key_here"}
data = request_with_retry(
"https://api.bitpredict.ai/v1/strategies",
headers=headers,
)