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
- 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).
- Allow chatgpt.com and the script's download hosts through the proxy or egress rules.
- On 404, update to a current codex build; the endpoint moved.
- 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
- Allowlist chatgpt.com and the installer's download hosts in proxy and egress configurations.
- Watch for 4xx statuses persisting across cycles: they indicate configuration drift or a moved endpoint, not transient failure.
- Note that run() swallows per-cycle errors and retries hourly; add logging when you need per-cycle visibility.
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
- standalone Codex updater exited with status {status}
- timeout
- network error: {0}
- too many redirects
- route-aware request timed out
AI-assisted analysis of openai/codex@339751715c (2026-08-25).
Data as JSON: /api/errors/393b4a64bba37cac.
Report an issue: GitHub.