Rate Limiting

Understanding rate limits, soft caps, and burn protection

Rate Limiting

TessRadar uses a multi-layered rate limiting system to ensure fair usage.


Rate Limits by Plan

PlanCreditsRequests/SecondResearch/Day
Developer25,00010 rps100
Business50,00020 rps300
Professional75,00050 rps800

Rate Limit Headers

Every response includes rate limit information:

HeaderDescription
X-RateLimit-LimitRequests allowed per second
X-RateLimit-RemainingRequests remaining in window
X-RateLimit-ResetUnix timestamp when limit resets
Retry-AfterSeconds to wait before retry

When Limits Are Exceeded

429 Response

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Retry after 1 second."
  }
}

Response Headers

HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1736455268
Retry-After: 1

Soft Caps

AI endpoints have daily soft caps to prevent abuse. After hitting the cap, requests are throttled (not blocked).

Research Endpoint

PlanDaily LimitAfter Limit
Developer1001 per 30 seconds
Business3001 per 30 seconds
Professional8001 per 30 seconds

Soft Cap Response

{
  "error": {
    "code": "SOFT_CAP_EXCEEDED",
    "message": "Daily research limit reached. Throttled to 1 request per 30s."
  }
}

Soft caps reset daily at midnight UTC.


Burn Protection

Prevents runaway credit spending from bugs or automation errors.

PlanMax Credits/Minute
Developer300
Business600
Professional1,200

Burn Protection Response

{
  "error": {
    "code": "BURN_PROTECTION",
    "message": "Credit limit per minute exceeded."
  }
}

Handling Rate Limits

Basic Retry Logic

async function fetchWithRetry(url: string, options: RequestInit) {
  const response = await fetch(url, options);
  
  if (response.status === 429) {
    const retryAfter = response.headers.get('Retry-After') || '1';
    await new Promise(r => setTimeout(r, parseInt(retryAfter) * 1000));
    return fetchWithRetry(url, options);
  }
  
  return response;
}

Exponential Backoff

async function fetchWithBackoff(
  url: string, 
  options: RequestInit, 
  maxRetries = 3
) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);
    
    if (response.status !== 429) return response;
    
    const retryAfter = response.headers.get('Retry-After') || '1';
    const delay = parseInt(retryAfter) * 1000 * Math.pow(2, i);
    
    await new Promise(r => setTimeout(r, delay));
  }
  
  throw new Error('Max retries exceeded');
}

Best Practices

  1. Cache responses - Reduce API calls by caching data
  2. Monitor headers - Track remaining requests in each response
  3. Use appropriate endpoints - Choose cheaper endpoints when possible
  4. Implement backoff - Use exponential backoff for retries

Need Higher Limits?

Upgrade your plan or contact support@tessradar.com for enterprise limits.

On this page