{"record":{"id":"4f107cc596467282","repo":"xtekky/gpt4free","slug":"response-response-status-message-4f107c","errorCode":null,"errorMessage":"Response {response.status}: {message}","messagePattern":"Response (.+?): (.+?)","errorType":"exception","errorClass":"RateLimitError","httpStatus":429,"severity":"error","filePath":"g4f/requests/raise_for_status.py","lineNumber":69,"sourceCode":"                error = message.get(\"error\")\n                if isinstance(error, dict):\n                    message = error.get(\"message\")\n                else:\n                    message = message.get(\"message\", message)\n                if isinstance(error, str):\n                    message = f\"{error}: {message}\"\n            except json.JSONDecodeError:\n                message = await response.text()\n        else:\n            message = (await response.text()).strip()\n            is_html = content_type.startswith(\n                \"text/html\"\n            ) or message.lower().startswith(\"<!DOCTYPE\".lower())\n    if message is None or is_html:\n        if response.status == 520:\n            message = \"Unknown error (Cloudflare)\"\n    if response.status in (429, 402):\n        raise RateLimitError(f\"Response {response.status}: {message}\")\n    if response.status == 401:\n        raise MissingAuthError(f\"Response {response.status}: {message}\")\n    if response.status == 403 and is_cloudflare(message):\n        raise CloudflareError(f\"Response {response.status}: Cloudflare detected\")\n    elif response.status == 403 and (is_openai(message) or is_lmarena(message)):\n        raise MissingAuthError(f\"Response {response.status}: OpenAI Bot detected\")\n    elif response.status == 502:\n        raise ResponseStatusError(f\"Response {response.status}: Bad Gateway\")\n    elif response.status == 504:\n        raise RateLimitError(f\"Response {response.status}: Gateway Timeout \")\n    elif response.status == 400 and \"API key not valid\" in message:\n        raise MissingAuthError(f\"Response {response.status}: Invalid API key\")\n    else:\n        raise ResponseStatusError(\n            f\"Response {response.status}: {'HTML content' if is_html else message}\"\n        )\n\n","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/requests/raise_for_status.py#L51-L87","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nresp = await client.post(url, json=payload)\nawait raise_for_status_async(resp)\n\n// after (python)\nfrom g4f.errors import RateLimitError\ntry:\n    result = await provider.create_completion(...)\nexcept RateLimitError:\n    await asyncio.sleep(2 ** attempt)\n    result = await provider.create_completion(...)","handlingStrategy":"retry","validationCode":null,"typeGuard":"from g4f.errors import RateLimitError\ndef is_rate_limit(err: BaseException) -> bool:\n    return isinstance(err, RateLimitError)","tryCatchPattern":"from g4f.errors import RateLimitError\ntry:\n    result = await client.chat.completions.async_create(...)\nexcept RateLimitError as e:\n    if 'Response 402' in str(e):\n        switch_provider()  # payment required, retrying won't help\n    else:\n        await asyncio.sleep(min(60, 2 ** attempt))  # 429: back off and retry","preventionTips":["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"],"tags":["rate-limit","http-429","async","g4f"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}