Rate Limits
Understand API rate limits and quotas for different plans.
Pro Feature
The Kanman API has rate limits to ensure fair usage and system stability.
Monthly Quotas
| Plan | API Calls/Month |
|---|---|
| Pro | 12,000 |
| Teams | 60,000 |
Quotas reset on the first day of each calendar month.
Checking Your Usage
Via Headers
Every API response includes usage headers:
X-RateLimit-Limit: 12000
X-RateLimit-Remaining: 11847
X-RateLimit-Reset: 2024-02-01T00:00:00Z
| Header | Description |
|---|---|
X-RateLimit-Limit |
Your monthly quota |
X-RateLimit-Remaining |
Calls remaining this month |
X-RateLimit-Reset |
When quota resets (ISO 8601) |
Via Settings
Check usage in the Kanman app:
- Go to Settings > API Tokens
- View API Usage section
- See current month’s usage and remaining quota
Quota Exceeded
When you exceed your quota:
Response
{
"error": {
"code": "quota_exceeded",
"message": "Monthly API quota exceeded",
"limit": 12000,
"reset": "2024-02-01T00:00:00Z"
}
}
HTTP Status
HTTP/1.1 429 Too Many Requests
What to Do
- Wait for monthly reset
- Purchase a quota top-up
- Upgrade to Teams plan
Top-Up Packages
Purchase additional API calls:
| Package | Calls | Price | Type |
|---|---|---|---|
| API Calls +10k | +10,000/month | €9/month | Subscription |
Top-ups are recurring subscriptions that add to your base quota.
Purchasing
- Go to Settings > Subscription
- Click Add API Calls
- Complete checkout
- Additional quota applies immediately
Optimization Tips
Reduce API Calls
- Batch reading: Fetch boards with projects in one call
- Cache responses: Store data locally when appropriate
- Use webhooks: Get push notifications instead of polling
Efficient Polling
If you must poll:
// Bad: Polling every second
setInterval(() => fetchTasks(), 1000);
// Good: Poll every 5 minutes
setInterval(() => fetchTasks(), 5 * 60 * 1000);
// Better: Use webhooks instead
Example: Efficient Sync
// Instead of individual task fetches
for (const taskId of taskIds) {
await fetch(`/tasks/${taskId}`); // 100 calls!
}
// Fetch all tasks in a project at once
await fetch(`/projects/${projectId}/tasks`); // 1 call!
Rate Limit Best Practices
Handle 429 Errors
async function apiCall(url, options, retries = 3) {
const response = await fetch(url, options);
if (response.status === 429 && retries > 0) {
// Get reset time from header
const resetTime = response.headers.get('X-RateLimit-Reset');
const waitTime = new Date(resetTime) - new Date();
// If reset is soon, wait. Otherwise, fail.
if (waitTime < 60000) { // Less than 1 minute
await sleep(waitTime);
return apiCall(url, options, retries - 1);
}
}
return response;
}
Monitor Usage
function checkRateLimits(response) {
const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
const limit = parseInt(response.headers.get('X-RateLimit-Limit'));
const usagePercent = ((limit - remaining) / limit) * 100;
if (usagePercent > 80) {
console.warn(`API usage at ${usagePercent.toFixed(1)}%`);
// Alert your team or adjust behavior
}
}
Per-Second Limits
In addition to monthly quotas, there are per-second limits:
| Plan | Requests/Second |
|---|---|
| Pro | 10 |
| Teams | 30 |
Exceeding per-second limits returns 429 Too Many Requests with a Retry-After header.
Exempt Operations
Some operations don’t count toward quotas:
- Token validation (authentication check)
- Health check endpoint
- OPTIONS requests (CORS preflight)
Related Topics
- Authentication - API tokens
- Errors - Error handling
- Webhooks - Event notifications
Last updated: January 1, 0001
Try Kanman