The error, verbatim
Jump to the fix ↓NotFoundError: 404 The model `gpt-3.5-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations
Tested on
- openai (npm)
- 7.32.0
- API key
- new project, $0 credit balance
- Node / OS
- 24.14.0 / Windows 11 Pro
- Date
- October 11, 23 and 25, 2026
Contents
On October 23, 2026, OpenAI shut down a long list of models, including the ones most old tutorials and side projects still call: gpt-3.5-turbo, gpt-4, gpt-4-turbo, o1, o3-mini and o4-mini. More follow on December 1 and December 11. The dates and replacements below are from OpenAI’s deprecations page.
I called these models every 15 minutes through the shutdown, from a new API project with no credits at all. Here’s what changed, and when.
What your app gets now
Every call to a shut-down model fails with a 404:
NotFoundError: 404 The model `gpt-3.5-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations
In the SDK it’s a NotFoundError, with status 404 and code model_not_found. On October 25, I got exactly this for gpt-3.5-turbo, gpt-3.5-turbo-0125, gpt-4, gpt-4-turbo, gpt-4o-2024-05-13, gpt-4.1-nano, o1, o1-pro, o3-mini and o4-mini. client.responses.create() with o3-mini returned the same 404, so moving to the Responses API doesn’t bring a model back.
All of them stopped at once. At 17:10 UTC on October 23 (10:10 AM in San Francisco), each call still got past the model check and failed only on my missing credits. At the next check, at 17:25 UTC, every one returned the 404.
Before the shutdown, gpt-4, gpt-4-turbo and o1-pro gave a different 404 to my new project: does not exist or you do not have access to it. Now they say has been deprecated too.
| The 404 says | What it means |
|---|---|
has been deprecated, learn more here |
OpenAI shut the model down for everyone |
does not exist or you do not have access to it |
Your project can’t use it: a typo, no access, or a model it never had |
Which models, and what replaces them
These are OpenAI’s own recommended replacements:
| Shut down October 23 | Replacement |
|---|---|
gpt-3.5-turbo, gpt-3.5-turbo-0125 |
gpt-5.6-terra |
gpt-4, gpt-4-0613, gpt-4-1106-preview |
gpt-5.6-sol |
gpt-4-turbo, gpt-4-turbo-2024-04-09 |
gpt-5.6-sol |
gpt-4o-2024-05-13 |
gpt-5.6-sol |
gpt-4.1-nano, gpt-4.1-nano-2025-04-14 |
gpt-5.6-luna |
o1, o1-2024-12-17, o3-mini |
gpt-5.6-sol |
o1-pro |
gpt-5.6-sol with reasoning.mode: pro |
o4-mini |
gpt-5.6-terra |
gpt-image-1 |
gpt-image-2.5-sunburst or gpt-image-2.5-flare |
Swapping is a one-line change where your code names the model:
model: 'gpt-5.6-terra', // was 'gpt-3.5-turbo'Fine-tuned models built on these (ft-gpt-3.5-turbo, ft-gpt-4, ft-gpt-4.1-nano, ft-o4-mini, ft-babbage-002, ft-davinci-002) were shut down the same day.
Then on December 1: gpt-image-1-mini, gpt-image-1.5 and chatgpt-image-latest. On December 11: the dated gpt-5-2025-08-07, gpt-5-mini, gpt-5-nano and gpt-5-pro snapshots, plus o3 and o3-pro.
models.retrieve still lists the dead models
This version of the post recommended a free check with models.retrieve, which reads a model’s details without generating anything. After the shutdown, that check is wrong. On October 25, models.retrieve still returned gpt-3.5-turbo, o1, o3-mini, o4-mini and gpt-4.1-nano as if nothing had happened, and models.list still included them. Only a real call showed they were gone.
Check with a call instead. One message with a tiny max_completion_tokens costs almost nothing, and on a key with no credits it costs nothing:
import OpenAI from 'openai';
const client = new OpenAI({ maxRetries: 0 });
for (const model of ['gpt-3.5-turbo', 'o3-mini', 'gpt-5.6-terra']) {
try {
await client.chat.completions.create({ model, messages: [{ role: 'user', content: 'OK' }], max_completion_tokens: 16 });
console.log(`works ${model}`);
} catch (e) {
console.log(e.status === 404 ? `GONE ${model}` : `exists ${model} (${e.status})`);
}
}Run it with the key your production app actually uses. Before the shutdown, my new project already couldn’t see gpt-4 while older projects still used it.
Why a key with no credits still shows the 404
OpenAI checks a request in this order: first whether the model exists for your project, then whether you have credits, and only then the parameters. With a $0 balance, every call to a model that exists failed with 429 You have no credits remaining, even one with temperature: 5 or a made-up parameter. Calls to a missing or shut-down model failed with the 404 instead.
That order matters when you’re debugging. A 429 credit_balance_exhausted doesn’t prove your parameters are right, and it hides parameter errors until there’s money in the account.
What I couldn’t test
Whether your code keeps working after you swap the name. OpenAI only validates parameters like max_tokens, temperature or functions after the credit check, so a free key can’t show which of them the new models reject, or how their answers differ. Try the switch on a staging key with a small budget.
How this was tested
A new OpenAI API project with no credits, openai 7.32.0 on Node 24.14.0, Windows 11 Pro. On October 11, every model was checked with models.list, models.retrieve and a one-message Chat Completions call. From October 22 to 23, a script made the same call to each shut-down model every 15 minutes and logged every change with its UTC time. On October 25, I repeated all three checks. The shutdown dates and replacements are OpenAI’s, quoted from its deprecations page. No credits were spent. The scripts and the full log are public.
— N.K., end of entry No.059