Rate Limits

Rate Limits

Sports Stack API implements rate limiting to ensure fair usage and system stability.

Rate Limit Policy

  • Default Limit: 1000 requests per hour per API key
  • Burst Limit: Up to 100 requests per minute
  • Rate Limit Headers: Included in all responses

Rate Limit Headers

Every API response includes rate limit information:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1640995200

Header Descriptions

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per hour
X-RateLimit-RemainingNumber of requests remaining in current window
X-RateLimit-ResetUnix timestamp when rate limit resets

Handling Rate Limits

429 Too Many Requests

When you exceed the rate limit, you'll receive a 429 status code:

{
  "error": "Rate Limit Exceeded",
  "message": "You have exceeded the rate limit. Please try again later.",
  "retry_after": 3600
}

Best Practices

1. Monitor Rate Limit Headers

import requests
import time

def make_request(url, headers):
    response = requests.get(url, headers=headers)

    # Check rate limit
    remaining = int(response.headers.get('X-RateLimit-Remaining', 0))

    if remaining < 10:
        reset_time = int(response.headers.get('X-RateLimit-Reset', 0))
        wait_time = reset_time - int(time.time())
        print(f"Rate limit low. Waiting {wait_time} seconds...")
        time.sleep(wait_time)

    return response

2. Implement Exponential Backoff

import time
import random

def make_request_with_backoff(url, headers, max_retries=5):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)

        if response.status_code != 429:
            return response

        # Exponential backoff with jitter
        wait_time = (2 ** attempt) + random.uniform(0, 1)
        time.sleep(wait_time)

    raise Exception("Rate limit exceeded after retries")

3. Cache Responses

Cache API responses to reduce request volume:

from functools import lru_cache
import time

@lru_cache(maxsize=100)
def get_teams(league_id, cache_time=300):
    # Cache for 5 minutes
    return requests.get(
        f"https://api.sportsstack.io/api/v1/teams?league_id={league_id}",
        headers=headers
    ).json()

4. Use Webhooks Instead of Polling

Instead of polling the API, use webhooks for real-time updates:

  • Set up webhooks for entity changes
  • Receive notifications automatically
  • Reduce API request volume significantly

See Webhooks Guide for details.

Rate Limit Tiers

Different API key tiers have different rate limits:

TierRequests/HourBurst Limit
Free1,000100/min
Pro10,000500/min
EnterpriseCustomCustom

Contact support to upgrade your rate limits.

Monitoring Usage

Monitor your API usage in the dashboard:

  1. Navigate to Settings → API Usage
  2. View request counts and rate limit status
  3. Set up alerts for rate limit warnings

Related Documentation