{"record":{"id":"ca6df3a911847bf7","repo":"xtekky/gpt4free","slug":"response-response-status-cloudflare-detected","errorCode":null,"errorMessage":"Response {response.status}: Cloudflare detected","messagePattern":"Response (.+?): Cloudflare detected","errorType":"exception","errorClass":"CloudflareError","httpStatus":403,"severity":"error","filePath":"g4f/requests/raise_for_status.py","lineNumber":73,"sourceCode":"                    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\ndef raise_for_status(\n    response: Union[Response, StreamResponse, ClientResponse, RequestsResponse],\n    message: str = None,\n):","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/requests/raise_for_status.py#L55-L91","documentation":"Raised when the upstream returns 403 and the response body matches g4f's Cloudflare fingerprint (is_cloudflare: 'Generated by cloudfront', 'cf-spinner-please-wait', 'Attention Required! | Cloudflare', 'cf-cloudflare-status', 'cf-please-wait', or 'Just a moment...' title). It means Cloudflare's bot protection blocked g4f's request instead of the real API answering.","triggerScenarios":"Hitting a provider behind Cloudflare bot protection whose challenge page is served with 403; typically after Cloudflare tightens rules or your IP/fingerprint gets flagged.","commonSituations":"Provider added/changed Cloudflare challenge; datacenter IP ranges get challenged; headless aiohttp requests (no browser TLS/JS) fail the challenge; regional Cloudflare rules.","solutions":["Retry later or from a different IP — Cloudflare blocks are frequently transient.","Use a browser-based provider flow in g4f (providers that use a real browser via camoufox/playwright extras) instead of plain HTTP.","Switch to a provider not behind an aggressive Cloudflare configuration.","Update g4f — provider workarounds for Cloudflare change frequently."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":"from g4f.errors import CloudflareError\ndef is_cloudflare_block(err: BaseException) -> bool:\n    return isinstance(err, CloudflareError)","tryCatchPattern":"from g4f.errors import CloudflareError\nfor provider in providers:\n    try:\n        return await run_on(provider)\n    except CloudflareError:\n        continue  # try next provider; do not hammer the blocked one","preventionTips":["Prefer API-key providers over scraped websites for reliability","Keep g4f updated — Cloudflare bypasses rot quickly","Rotate providers instead of retrying the blocked one immediately","Avoid datacenter IPs for providers known to challenge them"],"tags":["cloudflare","http-403","bot-protection","async"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}