OpenAI Shuts Down Sora 2 and GPT-3.5 Models This Week: Audit Your App

Akshit Ahuja
Co-Founder & Lead Engineer

OpenAI's deprecations page lists two shutdowns this week. On September 24, 2026 the Videos API and every Sora 2 model (sora-2, sora-2-pro and their dated snapshots) are removed. On September 28, 2026 four legacy GPT models are removed: gpt-3.5-turbo-instruct, gpt-3.5-turbo-1106, babbage-002 and davinci-002, with gpt-5.6-terra listed as the replacement.
If your app was generated by an AI tool in 2024 or 2025, there is a decent chance one of those strings is sitting in it. This post is the checklist for finding out, fixing it, and making the next retirement boring. It does not cover fine-tuned models; if you fine-tuned babbage-002 or davinci-002, the base model going away takes the fine-tune with it and the retraining is a separate job.
What is being shut down
| Shutdown date | Model or system | Listed replacement | What it means for an app |
|---|---|---|---|
| 2026-09-24 | Videos API | none listed | Video generation feature stops entirely |
| 2026-09-24 | sora-2, sora-2-pro and dated snapshots | none listed | Same; no OpenAI video model to switch to |
| 2026-09-28 | gpt-3.5-turbo-instruct | gpt-5.6-terra | Legacy Completions endpoint calls fail |
| 2026-09-28 | gpt-3.5-turbo-1106 | gpt-5.6-terra | Chat Completions calls with this model fail |
| 2026-09-28 | babbage-002, davinci-002 | gpt-5.6-terra | Base models and any fine-tunes on them stop |
The Sora row is the expensive one. OpenAI announced the Videos API removal on March 24, 2026, six months ahead, and lists no replacement. A product that generates clips through it needs another provider, and swapping video providers is a product change (different lengths, resolutions, latency, pricing), not a config change.
The GPT-3.5 rows are the common one. gpt-3.5-turbo-instruct in particular shows up in older AI-generated code because it was the cheapest model that took a plain prompt string.
A model deprecation is an announced date after which an API model name stops responding. OpenAI announces most of them months ahead on one page; the app does not get an email, the developer account does.
Step 1: find every model name in the codebase
AI tools do not centralise model names. In the apps we get sent, the same string appears in the route handler, a helper, a test fixture and sometimes a Vercel cron. Start with a grep:
grep -rniE "gpt-3\.5|gpt-4|gpt-5|sora|babbage|davinci|text-embedding|o[134]-mini|model:\s*['\"]" \
--include=*.ts --include=*.tsx --include=*.js --include=*.py --include=*.json \
--exclude-dir=node_modules --exclude-dir=.next .Then check the places grep cannot see:
- Vercel or Railway environment variables (a variable named
OPENAI_MODELcounts). - The database, if the app stores per-user or per-workspace model choices.
- Third-party libraries with their own defaults: the Vercel AI SDK, LangChain and LlamaIndex each ship a default model name that applies when you pass none.
- The OpenAI dashboard usage page, which shows tokens by model for the last 30 days. This is the source of truth for what is actually being called, including calls from code you forgot about.
Step 2: replace, then re-test the prompt
For the GPT-3.5 models the replacement is gpt-5.6-terra. The catch is the request shape. gpt-3.5-turbo-instruct used the legacy Completions endpoint:
// Before: legacy Completions call, stops working 2026-09-28
const res = await openai.completions.create({
model: 'gpt-3.5-turbo-instruct',
prompt: `Summarise this ticket:\n${ticket}`,
max_tokens: 200,
})
const text = res.choices[0].textThe current shape:
// After: one model name, read from config
const res = await openai.responses.create({
model: process.env.OPENAI_MODEL ?? 'gpt-5.6-terra',
input: `Summarise this ticket:\n${ticket}`,
max_output_tokens: 200,
})
const text = res.output_textTwo things change beyond the model name. The response field is different (output_text instead of choices[0].text), so any parsing code needs a second look. And the model behaves differently: a prompt tuned to get a 3.5-era model to return bare JSON will often return the same JSON wrapped in prose from a newer model. Run every prompt through the new model with five to ten real inputs before deploying, and compare the outputs by eye. Ten minutes here saves an incident.
If the app used babbage-002 or davinci-002 as a base for a fine-tune, the fine-tuned model stops with the base. There is no automatic migration; you retrain on a current base model with the same dataset.
Step 3: make the next one fail at deploy time
The fix that stops this from recurring is small.
- One config value. Every call reads the model name from one place (an environment variable or a single constant). The grep from step 1 should end with one hit.
- A startup check. At boot, or in a health endpoint, call
GET /v1/models/{model}for each configured model. If OpenAI returns 404, fail the health check. On Vercel, a failing health check in a preview deployment stops you from promoting it. - Log the model name on every call. When a call errors, the log line should include the model string. The 3 AM debugging session gets ten minutes shorter.
- A calendar entry. OpenAI's deprecations page has a "current deprecations" table at the top. Check it monthly. The lead time is usually three to six months, which is enough if someone is looking.
What we did not test
We have not benchmarked gpt-5.6-terra against gpt-3.5-turbo-instruct on quality or latency, so we are not claiming it is better or worse for your prompts; we are only reporting it as OpenAI's listed replacement. And we have not migrated a Sora 2 integration to another video provider this month, so we have no timing number for that.
If your app has an AI feature nobody on the team fully owns, that is the situation our AI agent development work usually starts from. Our post on Vercel function timeouts in AI apps covers the other failure that tends to show up in the same audit.
Frequently asked questions
- What happens to an API call to a shut-down OpenAI model?
- It returns an error instead of a completion. Your code has to handle that error, and most AI-generated code does not; it either shows a blank result or crashes the request. Check every place that calls the API for a catch branch that tells the user something and logs the model name.
- Is gpt-5.6-terra a drop-in replacement for gpt-3.5-turbo-instruct?
- Not at the code level. gpt-3.5-turbo-instruct used the legacy Completions endpoint with a plain prompt string. Current models use the Responses or Chat Completions endpoints with a messages structure. Expect to change the request shape, re-check output parsing, and re-run any prompt that depended on the old model's exact wording.
- How do I know which OpenAI models my app calls if I did not write it?
- Search the codebase for model strings and for the environment variable names the AI tool used. Then check the OpenAI dashboard usage page, which lists calls by model for the last 30 days. Anything with usage against a retired model needs a change before its shutdown date.
- Will this keep happening?
- Yes. OpenAI's page lists retirements on May 12, 2026 (DALL·E), August 10, 2026 (gpt-5.2-chat-latest and gpt-5.3-chat-latest, replaced by gpt-5.6-sol) and now September. Treat model names as configuration with an owner, the same way you treat a dependency version.
Sources
#OpenAI #model deprecation #Sora 2 #gpt-3.5-turbo-instruct #gpt-5.6 #AI agents #production #vibe-coded apps

Akshit Ahuja
Co-Founder & Lead Engineer
Backend systems specialist who thrives on building reliable, scalable infrastructure. Akshit handles everything from API design to third-party integrations, ensuring every product HeyDev ships is production-ready.


