Four causes, one statistically likely
A model 404 has four parents. The ID was retired. The ID carries a typo or the wrong snapshot suffix. The model lives on a different endpoint, since some 2026 models are served only through the Responses API and 404 on /v1/chat/completions. Or your account or region was never granted access. The response looks identical in all four cases.
What's shifted is the odds. Typos haven't gotten more common; retirements have. With nine IDs leaving in one October wave and the Assistants API sunsetting on August 26, 2026, a model that vanished on purpose is the explanation that fits most of these failures this year.
What it returns
HTTP/1.1 404 Not Found
{
"error": {
"message": "The model `gpt-4o-2024-05-13` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"code": "model_not_found"
}
}
The wording does two jobs at once: "does not exist or you do not have access" covers every cause without revealing which one applies to you. The backticked ID echoes whatever your request carried, so a stale snapshot suffix or a transposed character shows up right in the error text.
Check the graveyard first
October 23, 2026 is the date that matters. benchr's deprecations record lists nine OpenAI IDs going dark that day: gpt-4o-2024-05-13, gpt-4-0613, gpt-4-turbo, gpt-4-1106-preview, gpt-3.5-turbo-0125, o1, o1-pro, o3-mini, and o4-mini. The official replacements are GPT-5.5 and GPT-5.4 mini.
If your ID sits on that list, you're done diagnosing. The retirement-wave record maps every ID to its successor, the gpt-4o page covers the heaviest-traffic migration, and the tracker shows which shutdowns come next so the following 404 doesn't surprise you either.
The config fix
The durable version of this fix is a startup check: ask the API what your key can see, and refuse to boot on an ID that isn't there.
// Node: verify the configured model at startup
const MODEL = process.env.OPENAI_MODEL ?? "gpt-5";
const res = await fetch("https://api.openai.com/v1/models", {
headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
});
const { data } = await res.json();
if (!data.some((m) => m.id === MODEL)) {
console.error(`Model "${MODEL}" is not available to this key.`);
console.error("Retired? Official replacements: GPT-5.5 or GPT-5.4 mini.");
process.exit(1);
}
Keep the model ID in config or an environment variable rather than scattered through call sites. Retirements arrive on a published calendar, and a swap should be a one-line change with a deploy, not an afternoon of grep.