Rate Limits
The Sentisnap API implements rate limiting to ensure fair usage and platform stability.
Limits by Plan
| Plan | Requests/Hour | Requests/Minute |
|---|---|---|
| Free | 100 | 10 |
| Start | 1000 | 50 |
| Medium | 10000 | 200 |
| Pro | 10000 | 200 |
| Enterprise | 100000 | 1000 |
Rate Limit Headers
Every response includes headers with your current rate limit status:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 950
X-RateLimit-Reset: 1704891600
X-RateLimit-Policy: 1000;w=3600| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed per hour |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the limit resets |
X-RateLimit-Policy | Rate limit policy (requests per window) |
Handling Rate Limits
When you exceed the rate limit, you'll receive a 429 Too Many Requests response:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Please slow down your requests.",
"details": {
"limit": 1000,
"remaining": 0,
"reset": 1704891600,
"retry_after": 3600
}
}
}The Retry-After header indicates how many seconds to wait before retrying.
Best Practices
- Cache responses — Store data locally to reduce API calls
- Use webhooks — Get real-time updates instead of polling
- Implement exponential backoff — Wait longer between retries after failures
- Batch requests — Use pagination efficiently, request only what you need
- Monitor usage — Track your
X-RateLimit-Remainingheader
Example: Exponential Backoff
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || Math.pow(2, i);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}Need Higher Limits?
Contact our sales team at [email protected] to discuss enterprise plans with higher rate limits.