Quick answer: OpenAI is shutting down the Assistants API on August 26, 2026. After that date, every call to /v1/assistants, /v1/threads, and /v1/threads/runs stops working. The replacement is the Responses API (plus the Conversations API for chat history). OpenAI has stated it will not provide an automated tool to migrate Threads to Conversations, you rebuild assistants as Responses API calls and recreate threads yourself. This guide walks the entire migration with code.
Migrating now? The free Assistants Rescue tool exports your assistants, vector stores, and files to JSON and generates the exact Responses API code to replace them, entirely in your browser (your API key never leaves the page).
What is happening, and the exact date
- August 26, 2026: the Assistants API (beta) sunsets. The endpoints return errors.
- It was announced on August 26, 2025, a one-year deprecation window.
- OpenAI's recommended path is the Responses API (for the model calls and tools) plus the Conversations API (for persisting chat history).
- There is no automated migration tool from OpenAI. This is the single most-quoted line from their own migration notes, and it is why most teams are doing this by hand.
What breaks after August 26, 2026
Anything that touches these stops working:
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 - Your stored assistant configurations and thread history become unreachable
Your vector stores and files persist, they move to the Responses API's File Search tool. But the assistant definitions and threads do not carry over automatically.
The migration in three steps
Step 1: Back up your account now
Even if you migrate later, export first. After the deadline this data is gone. You can list assistants, vector stores, and files via the API:
from openai import OpenAI
client = OpenAI()
assistants = list(client.beta.assistants.list(limit=100))
vector_stores = list(client.vector_stores.list(limit=100))
files = list(client.files.list())
import json
json.dump({
"assistants": [a.model_dump() for a in assistants],
"vector_stores": [v.model_dump() for v in vector_stores],
"files": [f.model_dump() for f in files],
}, open("assistants-backup.json", "w"), indent=2)
Important constraint: OpenAI has no "list threads" endpoint, threads are only retrievable by ID. So you can only export the threads whose IDs your app stored in its own database. The Assistants Rescue tool does all of the above in the browser, and takes a pasted list of thread IDs.
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):
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",
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).
Step 3: 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 thread history forward, read each thread's messages by ID and recreate them as Conversation items (input_text for user turns, output_text for assistant turns).
Migration checklist
- Backed up assistants, vector stores, and files to JSON
- Exported the thread IDs your app stored (threads cannot be listed)
- 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_search tool
- Switched multi-turn flows to
previous_response_idor Conversations - Removed the
OpenAI-Beta: assistants=v2header - Verified everything before August 26, 2026
FAQ
When exactly does the Assistants API shut down? August 26, 2026.
Is there an official automated migration tool? No. OpenAI has explicitly said it will not provide one for Threads to Conversations.
Do my vector stores and files survive? Yes. Re-point them to the Responses API's file_search tool.
Can I export all my threads automatically? No, there is no list-threads endpoint. You can only fetch threads whose IDs you saved.
What happens if I miss the deadline? The endpoints return errors and the stored data is unreachable, you would rebuild from scratch with no backup.
Migrate in minutes, or get it done for you
The free Assistants Rescue tool exports your account and generates the Responses API code for every assistant, in your browser. If you are migrating a production app with real traffic and cannot afford a regression, Continuum runs full, verified migrations of AI-built and AI-integrated apps.