Docs/Api/Rate Limits
Api

Rate Limits

API rate limiting in Inpera.

2 min read

Rate Limits

The Inpera API uses rate limiting to ensure fair usage and platform stability.

Plan Limits

Plan Rate Limit Window
Free No API access -
Pro 100 requests 15 minutes
Team 10,000 requests 15 minutes

How It Works

Rate limits are applied per user/API key within a 15-minute sliding window.

Example for Pro plan:

  • You can make 100 requests in any 15-minute period
  • Window resets continuously (not at fixed intervals)

Response Headers

Every API response includes rate limit information:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1703433600
Header Description
X-RateLimit-Limit Maximum requests per window
X-RateLimit-Remaining Requests remaining
X-RateLimit-Reset Unix timestamp when limit resets

Rate Limit Exceeded

When you exceed the rate limit, you'll receive:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "statusCode": 429,
  "message": "Rate limit exceeded. Please wait before making more requests.",
  "error": "Too Many Requests"
}

Best Practices

Implement 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) {
      const waitTime = Math.pow(2, i) * 1000; // 1s, 2s, 4s
      await new Promise(r => setTimeout(r, waitTime));
      continue;
    }
    
    return response;
  }
  throw new Error('Max retries exceeded');
}

Cache Responses

Cache GET responses to reduce API calls:

const cache = new Map();

async function getCached(url, ttl = 60000) {
  const cached = cache.get(url);
  if (cached && Date.now() - cached.time < ttl) {
    return cached.data;
  }
  
  const data = await fetch(url).then(r => r.json());
  cache.set(url, { data, time: Date.now() });
  return data;
}

Batch Requests

Combine multiple operations where possible:

// Instead of multiple calls
for (const id of annotationIds) {
  await updateStatus(id, 'resolved');
}

// Use batch endpoint (when available)
await batchUpdateStatus(annotationIds, 'resolved');

Need Higher Limits?

Contact [email protected] for custom rate limits on enterprise plans.