xtekky/gpt4free · error · CloudflareError
Response {response.status}: Cloudflare detected
Error message
Response {response.status}: Cloudflare detected What it means
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.
Source
Thrown at g4f/requests/raise_for_status.py:73
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}"
)
def raise_for_status(
response: Union[Response, StreamResponse, ClientResponse, RequestsResponse],
message: str = None,
):View on GitHub (pinned to 973504e177)
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.
Defensive patterns
Strategy: fallback
Type guard
from g4f.errors import CloudflareError
def is_cloudflare_block(err: BaseException) -> bool:
return isinstance(err, CloudflareError) Try / catch
from g4f.errors import CloudflareError
for provider in providers:
try:
return await run_on(provider)
except CloudflareError:
continue # try next provider; do not hammer the blocked one Prevention
- 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
When it happens
Trigger: 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.
Common situations: Provider added/changed Cloudflare challenge; datacenter IP ranges get challenged; headless aiohttp requests (no browser TLS/JS) fail the challenge; regional Cloudflare rules.
Related errors
- Response {response.status_code}: Cloudflare detected
- Invalid secrets
- Response status: {response.status}
- Response {response.status}: OpenAI Bot detected
- Failed to obtain Turnstile token for DeepInfra request.
AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14).
Data as JSON: /api/errors/ca6df3a911847bf7.
Report an issue: GitHub.