developers/Rate Limits
Rate Limits
Intufind implements rate limiting to ensure fair usage and platform stability. Limits vary by subscription tier.
Per-Minute and Per-Hour Limits
| Tier | Requests/Minute | Requests/Hour |
|---|---|---|
| Personal | 100 | 1,000 |
| Starter | 150 | 1,500 |
| Professional | 200 | 2,000 |
| Enterprise | 300 | 5,000 |
Monthly Quotas
Feature-specific monthly quotas:
| Feature | Personal | Starter | Professional | Enterprise |
|---|---|---|---|---|
| Products | 200 | 500 | 1,000 | 10,000 |
| Content Pages | 100 | 200 | 1,000 | 10,000 |
| Chat Messages | 250 | 1,200 | 4,000 | 12,000 |
| Search Queries | 3,000 | 10,000 | 50,000 | 150,000 |
| Recommendations | 500 | 1,800 | 5,000 | 25,000 |
For current pricing, see intufind.com/pricing.
Monitoring Usage
Every API response includes rate limit and quota data in the response body:
{
"usage": {
"rateLimit": {
"remaining": { "perMinute": 45, "perHour": 950 },
"resetTime": 1733180400000
},
"quota": {
"current": 150,
"limit": 10000,
"resetDate": "2026-04-01"
}
}
}
import { createClient, searchProducts } from '@intufind/ai-sdk';
const client = createClient({
baseUrl: 'https://api.intufind.com',
auth: process.env.INTUFIND_SECRET_KEY!,
});
const response = await searchProducts({
client,
body: { text: 'running shoes' },
});
if (response.data?.usage?.quota) {
const { current, limit } = response.data.usage.quota;
console.log(`Quota: ${current} / ${limit}`);
}
Handling 429 Responses
When you exceed rate limits, the API returns 429 Too Many Requests:
{
"error": {
"message": "Rate limit exceeded",
"code": "RATE_LIMITED"
},
"retryAfter": 30
}
Exponential Backoff
async function withRetry<T>(
fn: () => Promise<T>,
maxRetries = 3
): Promise<T> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await fn();
} catch (error: any) {
const isRateLimited = error?.response?.status === 429;
if (!isRateLimited || attempt === maxRetries - 1) throw error;
const delay = Math.pow(2, attempt) * 1000;
await new Promise((r) => setTimeout(r, delay));
}
}
throw new Error('Unreachable');
}
const results = await withRetry(() =>
searchProducts({ client, body: { text: 'query' } })
);
Best Practices
Use Bulk Operations
Instead of individual requests, use bulk endpoints to stay within rate limits:
# One request instead of 100
curl -X POST https://api.intufind.com/products/bulk \
-H "Authorization: Bearer if_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"products": [...]}'
Cache Responses
Cache search results and recommendations to reduce API calls:
const cacheKey = `search_${query}`;
let results = cache.get(cacheKey);
if (!results) {
const response = await searchProducts({
client,
body: { text: query },
});
results = response.data;
cache.set(cacheKey, results, 300); // 5 minutes
}
Monitor Before You Hit Limits
Use the usage data in every response to proactively throttle before hitting 429.
Quota Resets
- Rate limits reset per minute and per hour as specified
- Monthly quotas reset on the 1st of each month at 00:00 UTC
Increasing Limits
- Upgrade your tier — Professional and Enterprise have higher limits
- Contact sales — Custom limits available for Enterprise customers
- Optimize usage — Bulk operations and caching reduce calls significantly
Contact sales@intufind.com to discuss your needs.