Understand API usage limits and optimization strategies
All API requests are subject to rate limiting to ensure fair usage and system stability
100
requests per minute
10,000
requests per day
1,000
requests per minute
100,000
requests per day
10,000
requests per minute
Unlimited
custom quotas available
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-LimitMaximum requests allowed per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when limit resets
Retry-AfterSeconds to wait before retry (429 only)
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
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)
);
}
}
}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}'}
)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
Maximum simultaneous connections per API key: