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

  1. Retry later or from a different IP — Cloudflare blocks are frequently transient.
  2. Use a browser-based provider flow in g4f (providers that use a real browser via camoufox/playwright extras) instead of plain HTTP.
  3. Switch to a provider not behind an aggressive Cloudflare configuration.
  4. 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

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


AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14). Data as JSON: /api/errors/ca6df3a911847bf7. Report an issue: GitHub.