Skip to main content
Rate limits are shared across all 20+ sports APIs. Your daily quota applies to your combined usage of Football, Basketball, Tennis, Hockey, Cricket, and all other sports.

Overview

SportsAPI Pro uses rate limiting to ensure fair usage and maintain service quality for all users. Rate limits are applied on a daily basis and reset at midnight UTC.

Plan Limits

PlanDaily RequestsMonthly RequestsPrice
Free1003,000$0
Pro7,500225,000$29/mo
Ultra75,0002,250,000$99/mo
Mega150,0004,500,000$249/mo
Need more? Contact us for custom enterprise plans.

Rate Limit Headers

Every API response includes headers to help you track your usage:
HeaderDescription
X-RateLimit-LimitYour daily request limit
X-RateLimit-RemainingRequests remaining today
X-RateLimit-ResetUnix timestamp when quota resets

Example Headers

HTTP/1.1 200 OK
X-RateLimit-Limit: 7500
X-RateLimit-Remaining: 7234
X-RateLimit-Reset: 1705449600
Content-Type: application/json

Handling Rate Limits

When you exceed your rate limit, the API returns a 429 Too Many Requests response:
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Daily quota exceeded. Resets at midnight UTC.",
    "reset_at": "2024-01-17T00:00:00Z"
  }
}

Best Practices

Cache API responses to reduce unnecessary requests. Most sports data doesn’t change frequently.
// Example: Cache standings for 5 minutes
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes

let cachedStandings = null;
let cacheTime = 0;

async function getStandings(baseUrl, competitionId) {
  if (cachedStandings && Date.now() - cacheTime < CACHE_TTL) {
    return cachedStandings;
  }
  
  const response = await fetch(
    `${baseUrl}/standings?competitionId=${competitionId}`,
    { headers: { 'x-api-key': API_KEY } }
  );
  cachedStandings = await response.json();
  cacheTime = Date.now();
  
  return cachedStandings;
}

// Works for all 20+ sports!
const footballStandings = await getStandings(
  'https://v2.football.sportsapipro.com', 1
);
const basketballStandings = await getStandings(
  'https://v2.basketball.sportsapipro.com', 132
);
const tennisStandings = await getStandings(
  'https://v2.tennis.sportsapipro.com', 5
);
Check rate limit headers in every response and implement warning thresholds:
function checkRateLimit(response) {
  const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
  const limit = parseInt(response.headers.get('X-RateLimit-Limit'));
  
  const usagePercent = ((limit - remaining) / limit) * 100;
  
  if (usagePercent > 80) {
    console.warn(`Warning: ${usagePercent.toFixed(1)}% of daily quota used`);
  }
}
When rate limited, wait and retry with exponential backoff:
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);
    
    if (response.status !== 429) {
      return response;
    }
    
    const resetTime = parseInt(response.headers.get('X-RateLimit-Reset'));
    const waitTime = Math.min(
      (resetTime * 1000) - Date.now(),
      Math.pow(2, i) * 1000
    );
    
    await new Promise(resolve => setTimeout(resolve, waitTime));
  }
  
  throw new Error('Max retries exceeded');
}

Check Your Usage

Use the /status endpoint to check your current usage (available on all sport APIs):
curl -X GET "https://v2.football.sportsapipro.com/status" \
  -H "x-api-key: YOUR_API_KEY"

Response

{
  "success": true,
  "account": {
    "email": "you@example.com",
    "account_type": "Pro"
  },
  "usage": {
    "requests_today": 1234,
    "requests_this_month": 45678,
    "total_requests": 123456,
    "daily_limit": 7500,
    "remaining_today": 6266
  }
}
The usage shown includes requests to all 20+ sports APIs. Your remaining quota applies across all sports.

Multi-Sport Usage Tips

When building multi-sport applications, consider these strategies:
During peak usage, prioritize live game updates over less time-sensitive data like standings or historical stats.
Different sports have different update frequencies. NBA games have more scoring events than football matches, so adjust your polling accordingly.
Use filter parameters to get multiple competitions in a single request instead of making separate calls.

Upgrading Your Plan

If you consistently hit your rate limits, consider upgrading:

View Plans

Compare plan features and pricing

Contact Sales

Discuss custom enterprise solutions