Key Information/Rate Limits

Rate Limits

Rate limits are enforced per API key and reset monthly. Choose a plan that fits your usage.

Limits by Plan

PlanRequests/MonthRequests/MinuteBurst Limit
Free5001020
Starter10,0003060
Pro250,000100200
Scale1,000,000400800
EnterpriseUnlimited*CustomCustom

* Enterprise plans have custom limits based on your needs. Contact sales for details.

Response Headers

Every API response includes rate limit headers to help you track your usage:

HTTP
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1705348800
HeaderDescription
X-RateLimit-LimitMaximum requests per minute for your plan
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the limit resets

Handling Rate Limits

When you exceed your limit, you'll receive a 429 response:

JSON
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "You hit your current request limit. If you’re polling live data frequently, webhooks can reduce unnecessary requests by pushing updates directly to your app. Upgrade for higher limits or use webhooks for real-time updates.",
    "docs": "https://citoapi.com/docs/rate-limits",
    "actions": [
      {
        "label": "Upgrade plan",
        "url": "https://citoapi.com/dashboard/billing/plans"
      },
      {
        "label": "Learn about webhooks",
        "url": "https://citoapi.com/webhooks/"
      }
    ],
    "upgradeUrl": "https://citoapi.com/dashboard/billing/plans",
    "webhooksUrl": "https://citoapi.com/webhooks/"
  }
}

Respect the retry_after value

Wait the specified number of seconds before retrying. Repeated violations may result in temporary bans.

Best Practices

Cache responses when possible

Store frequently accessed data locally to reduce API calls. Player stats rarely change mid-match.

Use webhooks instead of polling

Subscribe to events rather than polling every few seconds. This reduces your request count dramatically. See live webhook delivery.

Live streams count like polling

An open live stream (/cs2/live/stream, /ufc/live/stream) costs one request when it connects and one for every 15 seconds it stays open, the same as polling every 15 seconds. Open it while a match or card is live and close it afterwards. When your quota runs out, the stream sends an error event with code RATE_LIMIT_EXCEEDED and closes.

Implement exponential backoff

When retrying after errors, wait progressively longer between attempts (1s, 2s, 4s, 8s, etc.).

Monitor your usage

Check your dashboard regularly to see usage patterns and upgrade before hitting limits.

Need higher limits?

Upgrade your plan or contact us for custom enterprise pricing.

View Plans