Rate Limits

Rate limits, concurrency, and how to handle 429 responses.

Default limits

  • Pro — 40 memos/month, 10 concurrent, 20/minute
  • Team — 200 memos/month, 25 concurrent, 60/minute
  • Enterprise — Unlimited memos, custom rate limits

Rate limit headers

Every response includes rate limit headers:

X-RateLimit-Limit: 20
X-RateLimit-Remaining: 18
X-RateLimit-Reset: 1707840000

Handling 429 responses

When rate limited, the response includes a retryAfter field (in seconds). Implement exponential backoff:

async function deliberateWithRetry(body, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const res = await fetch('/v1/deliberate', {
      method: 'POST',
      headers: { 'Authorization': 'Bearer dm_...' },
      body: JSON.stringify(body),
    });

    if (res.status !== 429) return res.json();

    const { retryAfter } = await res.json();
    await new Promise(r =>
      setTimeout(r, (retryAfter || 2 ** i) * 1000)
    );
  }
  throw new Error('Rate limited after max retries');
}