Rate Limits & Quotas
Rate Limits
SearchJet enforces rate limits to ensure fair usage and service stability. This page explains the limits for each plan and how to handle rate limiting.
Limits by Plan
| Plan | Daily Search Limit | Index Operations | API Keys |
|---|---|---|---|
| Free | 100 searches/day | 1,000 documents | 2 keys |
| Pro | 10,000 searches/day | 100,000 documents | 10 keys |
| Business | Unlimited | Unlimited | Unlimited |
Checking Your Quota
Use the Client Info endpoint to check your current usage:
GET /v1/client-info
curl -X GET "https://app.searchjetengine.com/v1/client-info" \
-H "Authorization: Bearer sj_srch_xxxxxxxxxxxxxxxx"
const response = await fetch(
'https://app.searchjetengine.com/v1/client-info',
{
headers: { 'Authorization': 'Bearer sj_srch_xxxxxxxxxxxxxxxx' }
}
);
const data = await response.json();
console.log(data.limits);
// { daily_limit: 10000, used_today: 150 }
import httpx
response = httpx.get(
"https://app.searchjetengine.com/v1/client-info",
headers={"Authorization": "Bearer sj_srch_xxxxxxxxxxxxxxxx"},
)
data = response.json()
print(data["limits"])
# {"daily_limit": 10000, "used_today": 150}
Response:
{
"meilisearch_host": "https://ms-xxxx.searchjetengine.com",
"meilisearch_key": "xxxxxxxx",
"active": true,
"index": "site_123",
"domain": "example.com",
"plan": "pro",
"limits": {
"daily_limit": 10000,
"used_today": 150
},
"usage_limits": {
"max_indexed_pages": 100000,
"search_queries_per_month": 300000
}
}
Reporting Usage
For high-volume integrations, report usage to keep quotas accurate:
POST /v1/report-usage
import httpx
response = httpx.post(
"https://app.searchjetengine.com/v1/report-usage",
headers={"Authorization": "Bearer sj_prv_xxxxxxxxxxxxxxxx"},
json={"operation": "search", "count": 50, "index": "site_123"},
)
print(response.json()) # {"success": true}
Handling Rate Limits (429)
When you exceed your daily limit, the API returns 429 Too Many Requests:
{
"error": "rate_limit_exceeded",
"message": "Daily search limit exceeded. Upgrade your plan for higher limits.",
"retry_after": 3600
}
Best practices for handling 429:
- Implement exponential backoff - Wait before retrying
- Cache search results - Reduce duplicate API calls
- Show cached results - Display previous results when limited
- Notify users - Inform users when limits are reached
async function searchWithRetry(query, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(
`https://app.searchjetengine.com/v1/search?q=${encodeURIComponent(query)}`,
{ headers: { 'Authorization': 'Bearer sj_srch_xxx' } }
);
if (response.status === 429) {
const retryAfter = response.headers.get('retry-after') || 60;
console.log(`Rate limited. Retrying in ${retryAfter}s...`);
await new Promise(r => setTimeout(r, retryAfter * 1000));
continue;
}
return response.json();
}
throw new Error('Max retries exceeded');
}
Upgrading Your Plan
To increase your limits, visit your dashboard at app.searchjetengine.com or contact support@searchjetengine.com.