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

TierRequests/MinuteRequests/Hour
Personal1001,000
Starter1501,500
Professional2002,000
Enterprise3005,000

Monthly Quotas

Feature-specific monthly quotas:

FeaturePersonalStarterProfessionalEnterprise
Products2005001,00010,000
Content Pages1002001,00010,000
Chat Messages2501,2004,00012,000
Search Queries3,00010,00050,000150,000
Recommendations5001,8005,00025,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.