openai/codex · error · anyhow::Error

standalone Codex updater request failed with status {status}

Error message

standalone Codex updater request failed with status {status}

What it means

fetch_installer_script issues a GET against the hardcoded INSTALL_URL https://chatgpt.com/codex/install.sh through the route-aware HTTP pool. Transport failures surface as separate errors; this one means the request completed and the server answered a non-success HTTP status, which the client reports as InstallerResponse::Unsuccessful and converts into this bail. The loop then retries on the next hourly cycle.

Source

Thrown at codex-rs/app-server-daemon/src/update_loop.rs:205

    drop(stdin);
    let status = child
        .wait()
        .await
        .context("failed to wait for standalone Codex updater")?;

    if status.success() {
        Ok(())
    } else {
        anyhow::bail!("standalone Codex updater exited with status {status}")
    }
}

#[cfg(unix)]
async fn fetch_installer_script(http: &impl InstallerHttp) -> Result<Vec<u8>> {
    match http.get(INSTALL_URL).await? {
        InstallerResponse::Success(body) => Ok(body),
        InstallerResponse::Unsuccessful { status } => {
            anyhow::bail!("standalone Codex updater request failed with status {status}")
        }
    }
}

#[cfg(unix)]
#[derive(Clone, Debug, PartialEq, Eq)]
enum InstallerResponse {
    Success(Vec<u8>),
    Unsuccessful { status: u16 },
}

#[cfg(unix)]
/// HTTP boundary used to download the standalone installer.
///
/// Implementations must issue a GET for the supplied URL, return exact response bytes for a
/// successful status, and report a non-success status without buffering its response body.
trait InstallerHttp: Send + Sync {
    fn get<'a>(

View on GitHub (pinned to 339751715c)

Solutions

  1. Check the status directly: curl -I https://chatgpt.com/codex/install.sh and map the code (403/451 proxy or region, 404 outdated build, 429/5xx transient).
  2. Allow chatgpt.com and the script's download hosts through the proxy or egress rules.
  3. On 404, update to a current codex build; the endpoint moved.
  4. On 429 or 5xx, wait: the hourly loop retries automatically and there is nothing to fix locally.
Defensive patterns

Strategy: retry

Validate before calling

// Pre-flight the endpoint before enabling the update loop in
// restricted environments:
let resp = reqwest::get("https://chatgpt.com/codex/install.sh").await?;
if !resp.status().is_success() {
    return Err(anyhow!("egress blocks the installer: HTTP {}", resp.status()));
}

Try / catch

match fetch_result {
    Ok(script) => { /* proceed */ }
    Err(err) if err.to_string().contains("request failed with status") => {
        // HTTP-level failure: retry with backoff on 5xx/429, fail fast with
        // a proxy or URL hint on 4xx.
        tracing::warn!(error = err.to_string(), "install script fetch failed; retrying next cycle");
    }
    Err(err) => return Err(err),
}

Prevention

When it happens

Trigger: An update tick where chatgpt.com answers 4xx or 5xx for the install script: 403 or 451 from an intercepting proxy or regional block, 404 if the endpoint was retired, 429 rate limiting, or 5xx during a CDN incident; also the unit test installer_fetch_rejects_non_success_status feeding Unsuccessful deliberately.

Common situations: Locked-down corporate networks with TLS-inspecting proxies; CI environments with egress allowlists that omit chatgpt.com; transient CDN outages; stale builds after the install endpoint moves.

Related errors


AI-assisted analysis of openai/codex@339751715c (2026-08-25). Data as JSON: /api/errors/393b4a64bba37cac. Report an issue: GitHub.