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: 1707840000Handling 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');
}