ruvnet/ruflo · error
Too Many Requests
Error message
Too Many Requests
What it means
HTTP 429 'Too Many Requests' response produced by createRateLimiterMiddleware when limiter.consume(key) reports the quota for the client key (IP or x-forwarded-for) is exhausted; rate-limit headers (limit, remaining) are attached before the response.
Source
Thrown at v3/@claude-flow/shared/src/resilience/rate-limiter.ts:410
*/
export function createRateLimiterMiddleware(limiter: RateLimiter) {
return (req: { ip?: string; headers?: Record<string, string> }, res: {
status: (code: number) => { json: (body: unknown) => void };
setHeader: (name: string, value: string) => void;
}, next: () => void): void => {
// Get key from IP or header
const key = req.ip || req.headers?.['x-forwarded-for'] || 'anonymous';
const result = limiter.consume(key);
// Set rate limit headers
res.setHeader('X-RateLimit-Limit', String(result.total));
res.setHeader('X-RateLimit-Remaining', String(result.remaining));
res.setHeader('X-RateLimit-Reset', String(Math.ceil(result.resetAt.getTime() / 1000)));
if (!result.allowed) {
res.setHeader('Retry-After', String(Math.ceil(result.retryAfter / 1000)));
res.status(429).json({
error: 'Too Many Requests',
retryAfter: result.retryAfter,
resetAt: result.resetAt.toISOString(),
});
return;
}
next();
};
}
View on GitHub (pinned to fa13ee4ad6)
Solutions
- Back off and retry after the rate limit window resets (respect Retry-After if provided).
- Reduce request frequency, batch operations, or request a higher rate limit quota.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at v3/@claude-flow/shared/src/resilience/rate-limiter.ts:410 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
- HTTP status errors: handling 4xx and 5xx responses — how to handle 4xx and 5xx responses properly.
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/ba297de5a146d576.
Report an issue: GitHub.