{"record":{"id":"e395e5c02f2cb177","repo":"xtekky/gpt4free","slug":"response-response-status-code-invalid-api-key","errorCode":null,"errorMessage":"Response {response.status_code}: Invalid API key","messagePattern":"Response (.+?): Invalid API key","errorType":"exception","errorClass":"MissingAuthError","httpStatus":400,"severity":"error","filePath":"g4f/requests/raise_for_status.py","lineNumber":118,"sourceCode":"        ) or response.text.startswith(\"<!DOCTYPE\")\n        message = response.text\n    if message is None or is_html:\n        if response.status_code == 520:\n            message = \"Unknown error (Cloudflare)\"\n    if response.status_code in (429, 402):\n        raise RateLimitError(f\"Response {response.status_code}: {message}\")\n    if response.status_code == 401:\n        raise MissingAuthError(f\"Response {response.status_code}: {message}\")\n    if response.status_code == 403 and is_cloudflare(response.text):\n        raise CloudflareError(f\"Response {response.status_code}: Cloudflare detected\")\n    elif response.status_code == 403 and is_openai(response.text):\n        raise MissingAuthError(f\"Response {response.status_code}: OpenAI Bot detected\")\n    elif response.status_code == 502:\n        raise ResponseStatusError(f\"Response {response.status_code}: Bad Gateway\")\n    elif response.status_code == 504:\n        raise RateLimitError(f\"Response {response.status_code}: Gateway Timeout \")\n    elif response.status_code == 400 and \"API key not valid\" in message:\n        raise MissingAuthError(f\"Response {response.status_code}: Invalid API key\")\n    else:\n        raise ResponseStatusError(\n            f\"Response {response.status_code}: {'HTML content' if is_html else message}\"\n        )\n","sourceCodeStart":100,"sourceCodeEnd":123,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/requests/raise_for_status.py#L100-L123","documentation":"Sync variant: HTTP 400 with 'API key not valid' in the body raises MissingAuthError('Invalid API key'). Google-style APIs report bad keys as 400, and g4f normalizes that to an auth error for easier catching.","triggerScenarios":"Synchronous g4f calls to Gemini/Google-style providers with a malformed or revoked key that the API rejects at 400.","commonSituations":"Typo'd or truncated key; key deleted in AI Studio; wrong vendor's key; key restricted from the requested model.","solutions":["Regenerate and correctly configure the provider API key.","Verify key/vendor match.","Test the key with a direct provider API call.","Review key restrictions in the provider console."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import re, os\ndef gemini_key_ok() -> bool:\n    k = os.environ.get('GEMINI_API_KEY', '')\n    return bool(re.fullmatch(r'[A-Za-z0-9_\\-]{30,}', k))\n\nassert gemini_key_ok()","typeGuard":"from g4f.errors import MissingAuthError\ndef is_invalid_key(err: BaseException) -> bool:\n    return isinstance(err, MissingAuthError) and 'Invalid API key' in str(err)","tryCatchPattern":"from g4f.errors import MissingAuthError\ntry:\n    resp = g4f.ChatCompletion.create(model, messages)\nexcept MissingAuthError as e:\n    if 'Invalid API key' in str(e):\n        raise SystemExit('Regenerate the provider key and re-run')\n    raise","preventionTips":["Sanity-check key length/format before runs","Regenerate, don't retry, on invalid-key errors","Match key to provider","Audit provider dashboards for revoked keys"],"tags":["api-key","http-400","auth","sync"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}