Skip to content

Rate limits

Request budgets, not credit budgets. Enforced per API key. The numbers come from the same table the route reads.

01Limits by plan

PlanPer minutePer day
Free1005,000
Starter, Plus, Pro, Business100050,000
Enterprise10000Unlimited

02Headers

HeaderMeaning
X-RateLimit-LimitPer-minute ceiling
X-RateLimit-RemainingLeft this minute
X-RateLimit-ResetUTC epoch seconds
X-RateLimit-Daily-LimitDaily ceiling, omitted when unlimited
X-RateLimit-Daily-RemainingDaily left, omitted when unlimited
X-Request-IdQuote this
Retry-AfterOn 429 only, seconds
Headers
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 958
X-RateLimit-Reset: 1738368060
X-RateLimit-Daily-Limit: 50000
X-RateLimit-Daily-Remaining: 49958
X-Request-Id: req_abc123def456

03Handling 429

Sleep Retry-After seconds, then retry the same request.

429Response
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests. Please slow down."
  },
  "meta": {
    "request_id": "req_abc123",
    "timestamp": "2026-02-01T12:00:00Z"
  }
}
async function withRetry(url, options) {
  const res = await fetch(url, options);
  if (res.status === 429) {
    const wait = Number(res.headers.get('Retry-After') || 60);
    await new Promise((r) => setTimeout(r, wait * 1000));
    return withRetry(url, options);
  }
  return res;
}

04Check remaining

curl https://www.brainpercent.app/api/v1/user/usage \
  -H "Authorization: Bearer bp_your_key"