xtekky/gpt4free · error · RateLimitError
Response {response.status}: {message}
Error message
Response {response.status}: {message} What it means
Raised by g4f's async raise_for_status helper when an upstream provider returns HTTP 429 (Too Many Requests) or 402 (Payment Required). g4f wraps every provider HTTP call, so any aiohttp/StreamResponse with status 429/402 and a non-ok body becomes a RateLimitError. The message embeds the parsed body: JSON responses are unwrapped to their 'error'/'message' field, others are passed as text.
Source
Thrown at g4f/requests/raise_for_status.py:69
error = message.get("error")
if isinstance(error, dict):
message = error.get("message")
else:
message = message.get("message", message)
if isinstance(error, str):
message = f"{error}: {message}"
except json.JSONDecodeError:
message = await response.text()
else:
message = (await response.text()).strip()
is_html = content_type.startswith(
"text/html"
) or message.lower().startswith("<!DOCTYPE".lower())
if message is None or is_html:
if response.status == 520:
message = "Unknown error (Cloudflare)"
if response.status in (429, 402):
raise RateLimitError(f"Response {response.status}: {message}")
if response.status == 401:
raise MissingAuthError(f"Response {response.status}: {message}")
if response.status == 403 and is_cloudflare(message):
raise CloudflareError(f"Response {response.status}: Cloudflare detected")
elif response.status == 403 and (is_openai(message) or is_lmarena(message)):
raise MissingAuthError(f"Response {response.status}: OpenAI Bot detected")
elif response.status == 502:
raise ResponseStatusError(f"Response {response.status}: Bad Gateway")
elif response.status == 504:
raise RateLimitError(f"Response {response.status}: Gateway Timeout ")
elif response.status == 400 and "API key not valid" in message:
raise MissingAuthError(f"Response {response.status}: Invalid API key")
else:
raise ResponseStatusError(
f"Response {response.status}: {'HTML content' if is_html else message}"
)
View on GitHub (pinned to 973504e177)
Solutions
- Back off and retry with exponential delay (RateLimitError means the provider, not g4f, is refusing).
- Switch provider or rotate to another model/provider in g4f to distribute load.
- If 402: top up credits or use a free provider — the endpoint requires payment.
- Add client-side rate limiting (semaphore / token bucket) around g4f calls.
Example fix
// before
resp = await client.post(url, json=payload)
await raise_for_status_async(resp)
// after (python)
from g4f.errors import RateLimitError
try:
result = await provider.create_completion(...)
except RateLimitError:
await asyncio.sleep(2 ** attempt)
result = await provider.create_completion(...) Defensive patterns
Strategy: retry
Type guard
from g4f.errors import RateLimitError
def is_rate_limit(err: BaseException) -> bool:
return isinstance(err, RateLimitError) Try / catch
from g4f.errors import RateLimitError
try:
result = await client.chat.completions.async_create(...)
except RateLimitError as e:
if 'Response 402' in str(e):
switch_provider() # payment required, retrying won't help
else:
await asyncio.sleep(min(60, 2 ** attempt)) # 429: back off and retry Prevention
- Throttle calls per provider below documented rate limits
- Use a semaphore to cap concurrent g4f requests
- Cache identical prompts to avoid duplicate calls
- Distinguish 402 (needs payment) from 429 (needs waiting) by parsing the status in the message
When it happens
Trigger: Calling any async g4f provider client (e.g. AsyncClient.chat.completions.create) where the upstream API answers 429 after you exceed its quota, or 402 when the provider demands payment/credits for the endpoint.
Common situations: Free-tier provider quotas exhausted; too many concurrent requests to one provider; a key with zero balance hitting a paid endpoint; running bulk scripts without throttling.
Related errors
- Response {response.status_code}: {message}
- No coins left. Log in with a different account or wait a whi
- Response {response.status}: Gateway Timeout
- Failed to chat: {response.status} {error_text}
- Failed to decode JSON from PhindAi response: {text}
AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14).
Data as JSON: /api/errors/4f107cc596467282.
Report an issue: GitHub.