Skip to content
NeuralRepo
Get Support

Rate Limits

NeuralRepo enforces a per-user daily request limit on programmatic access. The limit applies only to requests authenticated with an API key or a bearer token. Requests carrying only the nrepo_session cookie — that is, the web app — are exempt, because a single page load makes many calls and the quota exists for scripted access.

PlanLimit
Free100 requests per day
Pro10,000 requests per day

The counter is keyed on your user id and the UTC date, so it resets at 00:00 UTC. It is a single quota per account: every API key, MCP token, and bearer session you hold draws from the same bucket.

RequestCounted?
Any /api/v1/* call with X-API-KeyYes
Any /api/v1/* call with Authorization: BearerYes — session tokens included
Any /api/v1/* call with only the session cookieNo
GET /api/v1/healthNo — it runs before the middleware chain
A request that then fails with 400/404Yes — the counter increments before your handler runs
A request rejected with 429No — the counter is already at the limit and is not raised further

Reads count exactly as much as writes. There is no separate write quota.

When you exceed your daily limit, the API responds with 429 Too Many Requests:

{
"error": "Rate limit exceeded"
}

Because the window is a whole day, retrying within the same session will not succeed. Back off so that a transient failure does not turn into a retry storm, but treat a sustained 429 as a signal to stop for the day rather than to keep trying.

async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.status !== 429) return res;
// No Retry-After is sent — back off on a fixed schedule.
const delay = Math.pow(2, attempt) * 1000;
await new Promise((resolve) => setTimeout(resolve, delay));
}
throw new Error("Rate limit exceeded after retries");
}

Three other caps are easy to mistake for rate limiting, because two of them return 200 with less data rather than an error:

CapPlanWhat you see
50 unarchived ideasFreePOST /ideas returns 403 idea_limit_reached
10 semantic searches per monthFreeGET /ideas/search returns keyword results with semantic_limit_reached: true
Duplicate detections hiddenFreeGET /ideas/duplicates returns { "duplicates": [] }

The semantic-search counter is monthly (not daily) and is consumed before the search runs, so a search that fails or matches nothing still spends one of the ten.

  • Batch operations. PATCH /ideas/bulk updates up to 50 ideas for one request, and POST /map/relations accepts up to 50 links in one call.
  • Cache responses when possible to reduce request volume.
  • Spread requests evenly across the day rather than sending bursts.
  • Watch your own count. Nothing in the response tells you how much quota is left, so track request counts client-side if you are near the Free limit.
StatusMeaning
429 Too Many RequestsDaily quota exhausted; resets at 00:00 UTC