Back to Documentation
Documentation / API Reference / Rate Limits & Quotas

Rate Limits & Quotas

Understand API usage limits and optimization strategies

Rate Limit Overview

All API requests are subject to rate limiting to ensure fair usage and system stability

Rate Limit Tiers

Free Tier

100

requests per minute

10,000

requests per day

Professional

1,000

requests per minute

100,000

requests per day

Enterprise

10,000

requests per minute

Unlimited

custom quotas available

Rate Limit Headers

Every API response includes rate limit information in headers:

HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1706543400
Retry-After: 42
X-RateLimit-Limit

Maximum requests allowed per window

X-RateLimit-Remaining

Requests remaining in current window

X-RateLimit-Reset

Unix timestamp when limit resets

Retry-After

Seconds to wait before retry (429 only)

429 Rate Limit Response

HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1706543400
Retry-After: 42

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Retry after 42 seconds.",
    "retryAfter": 42,
    "limit": 1000,
    "resetAt": "2026-01-29T16:30:00Z"
  }
}

Important: Implement exponential backoff when receiving 429 responses

Handling Rate Limits

Exponential Backoff (Node.js)

async function makeRequestWithRetry(url, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      const response = await fetch(url, {
        headers: {
          'Authorization': `Bearer ${process.env.API_KEY}`
        }
      });
      
      if (response.status === 429) {
        const retryAfter = parseInt(
          response.headers.get('Retry-After') || '1'
        );
        const delay = Math.min(retryAfter * 1000, 60000);
        
        console.log(`Rate limited. Waiting ${delay}ms...`);
        await new Promise(resolve => setTimeout(resolve, delay));
        continue;
      }
      
      return await response.json();
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      await new Promise(resolve => 
        setTimeout(resolve, Math.pow(2, i) * 1000)
      );
    }
  }
}

Python Example

import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

def get_api_client():
    session = requests.Session()
    retry = Retry(
        total=3,
        backoff_factor=1,
        status_forcelist=[429, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('https://', adapter)
    return session

# Usage
client = get_api_client()
response = client.get(
    'https://api.cognexiaai.com/v1/crm/contacts',
    headers={'Authorization': f'Bearer {API_KEY}'}
)

Optimization Strategies

Use Bulk Endpoints

Create/update multiple records in a single request instead of individual calls

Implement Caching

Cache responses locally and respect Cache-Control headers

Use Webhooks

Subscribe to events instead of polling for updates

GraphQL Field Selection

Request only the fields you need to reduce response size

Concurrent Request Limits

Maximum simultaneous connections per API key:

Free Tier5
Professional50
Enterprise500

Next Steps