← All field notes
SaaS Development

OpenAI Assistants API Shutdown (August 26, 2026): The Complete Migration Guide

The OpenAI Assistants API was sunset on August 26, 2026 and no longer works. The replacement is the Responses API plus the Conversations API. What broke, what survives, and the migration step by step, with code.

Matthew TurleyAugust 3, 2026Updated 6 min read

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

DateWhat happenedSource
August 26, 2025OpenAI notified developers the Assistants API was deprecatedOpenAI1
August 26, 2026Assistants API shut down; replacement is the Responses API and Conversations APIOpenAI1
November 30, 2026v1/prompts API and reusable prompt objects scheduled to shut downOpenAI1

What maps to what

OpenAI's own mapping from the old objects to the new ones2:

Assistants API (sunset)ReplacementWhat changed
AssistantPrompt, or config passed inlineModel, instructions and tools are no longer a stored API object
ThreadConversationStores items (messages, tool calls, tool outputs), not just messages
RunResponseSend input items, get output items back; no polling
Run stepItemOne 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=v2 flows 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_search tool with vector_store_ids inline (no more tool_resources).
  • code_interpreter becomes {"type": "code_interpreter", "container": {"type": "auto"}}.
  • functions flatten: {"type": "function", "name": ..., "parameters": ...} (no nested function key).

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.create call
  • 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_id or Conversations
  • Rebuilt old history from your stored messages, if you need it
  • Removed the OpenAI-Beta: assistants=v2 header and all beta.assistants / beta.threads calls
  • 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. 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. 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. 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.

Scoping a SaaS build and not sure what it costs?

Leave your email and we will send back a realistic cost and timeline range for what you are building.

M
Matthew Turley, Continuum

Fractional CTO helping teams ship and migrate AI-built products.

Have us migrate your app: book a 30-minute call →
OpenAI Assistants API Sunset (Aug 26, 2026): Migrate to Responses API