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.

HeaderWhenDescriptionExample
Retry-After429 onlySeconds to wait before the next request will succeed12

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,
)
Rate Limits · BitPredict