{"record":{"id":"54071d20761fdff0","repo":"BerriAI/litellm","slug":"rate-limit-exceeded","errorCode":null,"errorMessage":"Rate limit exceeded","messagePattern":"Rate limit exceeded","errorType":"http","errorClass":"ProxyRateLimitError","httpStatus":429,"severity":"error","filePath":"litellm/proxy/hooks/dynamic_rate_limiter_v3.py","lineNumber":524,"sourceCode":"                        model=resolved_model,\n                        llm_provider=llm_provider,\n                    )\n\n            # Fail-closed guard: overall_code says OVER_LIMIT but no status\n            # matched a descriptor key we know how to translate into a 429.\n            # Refuse the request rather than silently fall through and let an\n            # over-limit request proceed to the model. Without this, a future\n            # caller wiring an unfamiliar descriptor into enforced_descriptors\n            # would silently bypass the rate limit.\n            offending: Final = next(\n                (s for s in atomic_response[\"statuses\"] if s[\"code\"] == \"OVER_LIMIT\"),\n                None,\n            )\n            verbose_proxy_logger.error(\n                \"Dynamic rate limiter: OVER_LIMIT response with unknown descriptor_key(s) — refusing request. response=%s\",\n                atomic_response,\n            )\n            raise ProxyRateLimitError(\n                detail={\n                    \"error\": \"Rate limit exceeded\",\n                    \"descriptor_key\": (offending[\"descriptor_key\"] if offending else \"unknown\"),\n                    \"rate_limit_type\": (str(offending[\"rate_limit_type\"]) if offending else \"unknown\"),\n                },\n                rate_limit_type=map_v3_rate_limit_type(offending[\"rate_limit_type\"] if offending else None),\n                headers={\n                    \"retry-after\": str(self.v3_limiter.window_size),\n                    \"x-litellm-priority\": priority or \"default\",\n                },\n                model=resolved_model,\n                llm_provider=llm_provider,\n            )\n\n        # If priority is NOT enforced (saturation below threshold) but\n        # priority_descriptors exist, increment them for tracking only — no\n        # check, no rollback. This matches the prior tracking semantics.\n        #","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/hooks/dynamic_rate_limiter_v3.py#L506-L542","documentation":"Error \"Rate limit exceeded\" thrown in BerriAI/litellm.","triggerScenarios":"Thrown at litellm/proxy/hooks/dynamic_rate_limiter_v3.py:524 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reduce request rate and retry after the rate limit window resets.","Review and raise the configured rate limits if the volume is legitimate."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}