Skip to main content

Rate Limit Tiers

TierRequests/HourBurst/Minute
Standard1,000100
Premium5,000500
Contact your account manager to upgrade to Premium tier.

Rate Limit Headers

All responses include rate limit information:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1706634000
HeaderDescription
X-RateLimit-LimitMaximum requests per hour
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when limit resets

Rate Limit Response

When rate limited, you’ll receive a 429 response:
{
  "success": false,
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded",
    "details": {
      "retry_after": 3600,
      "limit": 1000,
      "remaining": 0
    }
  }
}

Best Practices

async function requestWithBackoff(url, options, 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') || 60;
    await new Promise(r => setTimeout(r, retryAfter * 1000));
  }
  throw new Error('Max retries exceeded');
}
Persona profiles rarely change. Cache them for 1 hour:
const CACHE_TTL = 60 * 60 * 1000; // 1 hour
const cache = new Map();

async function getPersonas() {
  const cached = cache.get('personas');
  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }
  
  const data = await fetchPersonas();
  cache.set('personas', { data, timestamp: Date.now() });
  return data;
}
Send topics to multiple personas in one request instead of multiple requests:
// Good: One request
await createTopic(content, [persona1, persona2, persona3]);

// Bad: Three requests
await createTopic(content, [persona1]);
await createTopic(content, [persona2]);
await createTopic(content, [persona3]);
Track your rate limit usage:
function trackRateLimit(response) {
  const remaining = response.headers.get('X-RateLimit-Remaining');
  const limit = response.headers.get('X-RateLimit-Limit');
  
  if (remaining < limit * 0.1) {
    console.warn(`Rate limit warning: ${remaining}/${limit} remaining`);
  }
}

Endpoint-Specific Limits

Some endpoints have additional limits:
EndpointLimit
POST /topics100/hour
GET /personas1000/hour
GET /topics/{id}1000/hour

Need Higher Limits?

Contact [email protected] to discuss:
  • Premium tier upgrades
  • Enterprise custom limits
  • Dedicated infrastructure