{"record":{"id":"88ad21c5d9576ce7","repo":"CloakHQ/CloakBrowser","slug":"geoip-resolution-failed-could-not-determine-miss","errorCode":null,"errorMessage":"GeoIP resolution failed: could not determine {missing joined by ' and '}","messagePattern":"GeoIP resolution failed: could not determine (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"cloakbrowser/browser.py","lineNumber":1332,"sourceCode":"\n    # None when no proxy → echo services resolve the machine's own public IP\n    proxy_url = _extract_proxy_url(proxy) if proxy else None\n\n    # When both tz/locale are explicit, resolve the exit IP for WebRTC — but only\n    # with a proxy. With no proxy the WebRTC IP would just be the real connection\n    # IP the site already sees (a no-op), so skip the third-party echo call.\n    if timezone is not None and locale is not None:\n        exit_ip = resolve_proxy_exit_ip(proxy_url) if proxy_url else None\n        return timezone, locale, exit_ip\n\n    geo_tz, geo_locale, exit_ip = resolve_proxy_geo_with_ip(proxy_url)\n    if timezone is None:\n        timezone = geo_tz\n    if locale is None:\n        locale = geo_locale\n    missing = [name for name, value in ((\"timezone\", timezone), (\"locale\", locale)) if value is None]\n    if missing:\n        raise RuntimeError(\n            \"GeoIP resolution failed: could not determine \" + \" and \".join(missing)\n        )\n    return timezone, locale, exit_ip\n\n\ndef _resolve_webrtc_args(\n    args: list[str] | None,\n    proxy: str | ProxySettings | None,\n) -> list[str] | None:\n    \"\"\"Replace --fingerprint-webrtc-ip=auto with the resolved proxy exit IP.\n\n    Returns args unchanged if no ``auto`` value is present.\n    \"\"\"\n    if not args:\n        return args\n    idx = None\n    for i, a in enumerate(args):\n        if a == \"--fingerprint-webrtc-ip=auto\":","sourceCodeStart":1314,"sourceCodeEnd":1350,"githubUrl":"https://github.com/CloakHQ/CloakBrowser/blob/d6bad5de261bedf025280ace1d14e800aee13923/cloakbrowser/browser.py#L1314-L1350","documentation":"When geoip=True (or GeoIP resolution runs), cloakbrowser resolves your exit IP's timezone and locale. If neither the caller nor the GeoIP lookup produced a timezone and/or locale, maybe_resolve_geoip raises RuntimeError listing the missing fields, because Playwright fingerprint consistency requires both values.","triggerScenarios":"Calling launch(..., geoip=True) (or geoip_enabled config) without explicit timezone/locale while the GeoIP service returns no timezone or locale data for the exit IP, e.g. an unresolvable datacenter/VPN IP.","commonSituations":"VPN/proxy exit IPs that GeoIP databases can't map; GeoIP API outage; corporate proxies with exotic egress IPs.","solutions":["Pass explicit timezone= and locale= matching your proxy's geography","Verify the GeoIP service is reachable and the exit IP is a real routable IP","Retry with a different proxy exit IP that has GeoIP data"],"exampleFix":"# before\nbrowser = cloakbrowser.launch(geoip=True)\n# after\nbrowser = cloakbrowser.launch(geoip=True, timezone=\"America/New_York\", locale=\"en-US\")","handlingStrategy":"validation","validationCode":"from cloakbrowser.browser import maybe_resolve_geoip\nimport inspect\n# ensure explicit timezone/locale before launching with geoip\ntz = my_tz or \"America/New_York\"\nloc = my_locale or \"en-US\"","typeGuard":null,"tryCatchPattern":"try:\n    browser = cloakbrowser.launch(geoip=True)\nexcept RuntimeError as e:\n    if \"GeoIP resolution failed\" in str(e):\n        browser = cloakbrowser.launch(geoip=True, timezone=tz, locale=loc)\n    else:\n        raise","preventionTips":["Always pass timezone/locale explicitly when using proxies with geoip","Test with your production exit IP before deploying"],"tags":["geoip","timezone","locale","fingerprint"],"backgroundTag":"geoip-resolution-failed","analyzedSha":"d6bad5de261bedf025280ace1d14e800aee13923","analyzedAt":"2026-08-28T14:13:12.918Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}