Quick answer: OpenAI sunset the Assistants API on August 26, 2026, and it no longer works1, 2. Calls to /v1/assistants and /v1/threads (messages and runs included) fail. The replacement is the Responses API for model calls and tools, plus the Conversations API for chat history1. Nothing carries over automatically: you rebuild each assistant as a Responses call from your own stored configuration, point file search at your vector stores, and rebuild history from the messages your app saved2. The four steps below cover it, with code.
Is your app still calling the Assistants API? It is broken until it is migrated. Book a free 30-minute call and we will tell you what the migration involves, or have us do it: Continuum migrates production apps and verifies every flow before it ships.
Key dates
| Date | What happened | Source |
|---|---|---|
| August 26, 2025 | OpenAI notified developers the Assistants API was deprecated | OpenAI1 |
| August 26, 2026 | Assistants API shut down; replacement is the Responses API and Conversations API | OpenAI1 |
| November 30, 2026 | v1/prompts API and reusable prompt objects scheduled to shut down | OpenAI1 |
What maps to what
OpenAI's own mapping from the old objects to the new ones2:
| Assistants API (sunset) | Replacement | What changed |
|---|---|---|
| Assistant | Prompt, or config passed inline | Model, instructions and tools are no longer a stored API object |
| Thread | Conversation | Stores items (messages, tool calls, tool outputs), not just messages |
| Run | Response | Send input items, get output items back; no polling |
| Run step | Item | One general object for messages, tool calls and outputs |
What broke on August 26, 2026
Anything that touches these no longer works:
POST/GET /v1/assistants(create, list, retrieve, modify, delete)/v1/threads,/v1/threads/{id}/messages,/v1/threads/{id}/runs- The
OpenAI-Beta: assistants=v2flows built on the above - Assistant configurations and thread history stored only on OpenAI's side are unreachable
What survives: vector stores and files are separate API objects. The Responses API uses vector stores through its file_search tool3, so check that each one your app uses still exists and point the new calls at it.
The migration in four steps
Step 1: Inventory what your app still has
The Assistants endpoints no longer answer, so your own records are the source. Collect:
- Every assistant's model, instructions and tools, from your code, config or database
- The vector store and file IDs your app uses
- The chat messages your app stored, if you want history to carry over
Check which vector stores and files still exist:
from openai import OpenAI
client = OpenAI()
vector_stores = list(client.vector_stores.list(limit=100))
files = list(client.files.list())
import json
json.dump({
"vector_stores": [v.model_dump() for v in vector_stores],
"files": [f.model_dump() for f in files],
}, open("openai-inventory.json", "w"), indent=2)
Important constraint: OpenAI never had a "list threads" endpoint, and since the sunset the Assistants calls that read thread messages no longer work2. The only thread history you can carry forward is what your app saved in its own database.
Step 2: Rebuild each assistant as a Responses API call
The mental model shift: an Assistant was a stored config (model plus instructions plus tools). In the Responses API, you pass those inline on each call. There is nothing to create ahead of time.
Before (Assistants API, no longer works):
assistant = client.beta.assistants.create(
model="gpt-4o",
instructions="You are a helpful support agent.",
tools=[{"type": "file_search"}],
tool_resources={"file_search": {"vector_store_ids": ["vs_123"]}},
)
thread = client.beta.threads.create()
client.beta.threads.messages.create(thread.id, role="user", content="Hi")
run = client.beta.threads.runs.create_and_poll(thread.id, assistant_id=assistant.id)
After (Responses API):
resp = client.responses.create(
model="gpt-4o", # the model your assistant used, or a newer one
instructions="You are a helpful support agent.",
tools=[{"type": "file_search", "vector_store_ids": ["vs_123"]}],
input="Hi",
)
print(resp.output_text)
Tool mapping:
- file_search becomes a
file_searchtool withvector_store_idsinline (no moretool_resources). - code_interpreter becomes
{"type": "code_interpreter", "container": {"type": "auto"}}. - functions flatten:
{"type": "function", "name": ..., "parameters": ...}(no nestedfunctionkey).
OpenAI's guide also offers turning an assistant into a dashboard prompt object. OpenAI has since deprecated reusable prompt objects, with the v1/prompts API scheduled to shut down on November 30, 20261, so keeping the configuration in your own code (as above) avoids a second migration.
Step 3: Re-point file search at your vector stores
Add the file_search tool with your existing vector_store_ids to each Responses call, as in Step 23. If a vector store your app needs is gone, create a new one and re-upload the files before you switch traffic.
Step 4: Rebuild conversation continuity
Threads gave you multi-turn memory. You have two replacements.
Option A, previous_response_id (simplest):
r1 = client.responses.create(model="gpt-4o", input="My name is Sam.")
r2 = client.responses.create(model="gpt-4o", input="What's my name?",
previous_response_id=r1.id)
Option B, the Conversations API (persistent, closest to threads):
conv = client.conversations.create()
client.responses.create(model="gpt-4o", conversation=conv.id, input="My name is Sam.")
client.responses.create(model="gpt-4o", conversation=conv.id, input="What's my name?")
To carry old history forward, create a Conversation from the messages your app stored: client.conversations.create(items=[...]), with user turns as input_text and assistant turns as output_text2.
# stored = [{"role": "user", "text": "..."}, {"role": "assistant", "text": "..."}]
# loaded from your own database, oldest first
items = [
{
"role": m["role"],
"content": [{
"type": "input_text" if m["role"] == "user" else "output_text",
"text": m["text"],
}],
}
for m in stored
]
conv = client.conversations.create(items=items)
Migration checklist
- Listed every assistant's model, instructions and tools from your own code or database
- Confirmed which vector stores and files still exist
- Rebuilt each assistant as a
responses.createcall - Mapped file_search / code_interpreter / functions to the new tool shapes
- Re-pointed vector stores to the Responses
file_searchtool - Switched multi-turn flows to
previous_response_idor Conversations - Rebuilt old history from your stored messages, if you need it
- Removed the
OpenAI-Beta: assistants=v2header and allbeta.assistants/beta.threadscalls - Verified the migrated flows end to end
Get it migrated for you
If the app is in production, with real users and no room for a regression, this is work we do. Book a free 30-minute call and we will scope it, or start with a $299 Ship Check: a written read of your codebase that tells you what the fix involves. Fixed-price repair work runs through Ship Fix (our price, see pricing).
Sources
Market figures above are marked with a number that links here. Our own prices are marked as ours and come from our published pricing.
- 1. Deprecations: 2025-08-20 Assistants API, OpenAI, checked October 1, 2026. OpenAI's official deprecation log: developers notified August 26, 2025; shutdown date 2026-08-26; replacement Responses API and Conversations API.
- 2. Assistants migration guide, OpenAI, checked October 1, 2026. OpenAI's own migration steps; confirms the API is sunset and no longer available, maps Assistants to Prompts, Threads to Conversations, Runs to Responses, Run steps to Items, and says thread history must come from messages your app stored.
- 3. File search tool, OpenAI, checked October 1, 2026. Shows vector stores used by the Responses API through a file_search tool with vector_store_ids.