Rate Limits
Understand API rate limits and quotas for the Crove REST API.
Rate Limits
The Crove API enforces rate limits to ensure fair usage and platform stability. Limits vary by plan.
Rate limit overview
| Plan | API Calls / Month | Rate Limit |
|---|---|---|
| Starter | 1,000 | 60 requests/minute |
| Pro | 10,000 | 120 requests/minute |
| Business | 50,000 | 300 requests/minute |
| Enterprise | Custom | Custom |
Checking your rate limit
Use the rate limit endpoint to check your current usage:
GET /api/external/v1/rate-limitResponse
{
"data": {
"plan": "Pro",
"limit": 10000,
"used": 2450,
"remaining": 7550,
"resetsAt": "2026-03-01T00:00:00Z"
}
}Example
curl -X GET https://crove.app/api/external/v1/rate-limit \
-H "Authorization: Bearer YOUR_API_KEY"Rate limit headers
Every API response includes rate limit information in the headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Time when the rate limit window resets (Unix timestamp) |
Exceeding the rate limit
When you exceed the rate limit, the API returns a 429 Too Many Requests response:
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Please retry after 45 seconds.",
"retryAfter": 45
}
}The Retry-After header indicates how many seconds to wait before making another request.
Monthly quota
In addition to per-minute rate limits, each plan has a monthly API call quota. When the monthly quota is exhausted:
{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "Monthly API quota exceeded. Upgrade your plan or wait until the quota resets."
}
}Monthly quotas reset on the first day of each calendar month.
Best practices
- Implement retry logic — When you receive a
429, wait for theRetry-Afterperiod and retry - Use exponential backoff — For retries, double the wait time with each attempt
- Cache responses — Store template and document data locally to reduce API calls
- Batch operations — Create multiple documents in fewer API calls when possible
- Monitor usage — Check your rate limit endpoint regularly to stay within quota
Example retry logic (JavaScript)
async function apiRequest(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || 60;
console.log(`Rate limited. Retrying in ${retryAfter}s...`);
await new Promise(resolve =>
setTimeout(resolve, retryAfter * 1000)
);
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}Need higher limits?
If your use case requires higher rate limits or API quotas, contact our sales team to discuss enterprise plans with custom limits.