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:

  1. Go to Settings > API Tokens
  2. View API Usage section
  3. 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

  1. Wait for monthly reset
  2. Purchase a quota top-up
  3. 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

  1. Go to Settings > Subscription
  2. Click Add API Calls
  3. Complete checkout
  4. Additional quota applies immediately

Optimization Tips

Reduce API Calls

  1. Batch reading: Fetch boards with projects in one call
  2. Cache responses: Store data locally when appropriate
  3. 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)

Last updated: January 1, 0001

Try Kanman