OpenAI Prompt Objects End Nov 30: Keep Your pmpt_ IDs, Add Versions

Contents
  1. What is OpenAI shutting down, and when?
  2. How do you keep a pmpt_ call working without changing code?
  3. Should prompts live in code or in a prompt library?
  4. What does calling a prompt by id cost?
  5. How do you try a new version on part of production?
  6. How do you test a version before it ships?
  7. What should you do before November 30?
  8. FAQ
  9. What happens to OpenAI stored prompts on November 30, 2026?
  10. Can I keep calling a pmpt_ id after the shutdown?
  11. What replaces OpenAI Evals?
  12. Related reading

OpenAI is shutting down reusable prompt objects and the v1/prompts API on November 30, 2026, and its Evals dashboard and API on the same day. OpenAI says those objects are “scheduled to shut down” and does not say what a Responses API call with prompt={"id": "pmpt_..."} will return afterwards, so the prompt text has to move somewhere else first. We recreated a prompt under its pmpt_ id in the Synthorai prompt library and pointed an OpenAI SDK call at the Synthorai gateway (an API proxy that sits between an application and the model providers), changing only the base URL and the key: the request was served by library version 2 when it asked for version "2", and by the production version when it asked for none.

TL;DR

  • OpenAI’s prompt objects and v1/prompts API shut down on November 30, 2026; OpenAI evals go read-only on October 31.
  • A Responses call with prompt={"id": "pmpt_...", "version": "2"} was served by version 2 of a Synthorai library prompt with that id; only the base URL changed.
  • Moving a library prompt’s production label reached live calls in 8 to 9 s under steady traffic.
  • A test fixed before the run caught an edit that broke a rule in 16% of answers; an earlier 40-row run passed it.

This post is the overview of a three-part guide series on the prompt library. Each section below summarizes one guide with its measured numbers and links to it for the code and the console screenshots. All runs are from October 19 and 20, 2026, and the code is at github.com/synthorai-io/use-cases under prompt-library/.

What is OpenAI shutting down, and when?

OpenAI’s deprecations page lists two shutdowns that land on the same day:

WhatAnnouncedChangeShut down
Reusable prompts: prompt objects and the v1/prompts APIJune 3, 2026prompt creation de-emphasized in the platformNovember 30, 2026
Evals platform: dashboard and APIJune 3, 2026existing evals read-only from October 31, 2026November 30, 2026

A prompt object is a prompt saved in the OpenAI dashboard and called by its pmpt_ id, with optional versions and variables. OpenAI’s migration guide recommends moving the prompt text out of the prompt object and into application code, passing it as input to the Responses API, and versioning it through git, code review and tests. The guide does not say what a request with a pmpt_ id returns after the shutdown.

How do you keep a pmpt_ call working without changing code?

You recreate the prompt in a prompt library under the same id and point the client at a gateway that serves it. The Synthorai gateway reads the prompt field of a /v1/responses request: when its id matches a library prompt, the library answers, and a numeric version picks that library version. This is the call our demo made; apart from the base URL and the key it is what an application written against OpenAI sends:

import os
from openai import OpenAI

# The only change: the base URL and the key.
client = OpenAI(base_url="https://synthorai.io/v1", api_key=os.environ["SYNTHORAI_API_KEY"])

raw = client.responses.with_raw_response.create(
    model="gpt-6-luna",
    prompt={"id": "pmpt_68f2a1c09d4e4b7a8c3f5e21d0b97a64", "version": "2"},
    input="Where is order A-50977? It has been a week.",
)
print(raw.headers["x-synthorai-prompt-version"])   # 2
print(raw.parse().output_text)
CallServed byInput tokensOutput tokensCost
prompt={"id": ..., "version": "2"}library version 292177$0.0000977
prompt={"id": ...}library version 1, the production label96207$0.0001131

Both answers came from GPT-6 Luna, the model stored on the library versions. The demo’s pmpt_ id is made up; in a migration you use your own. Three more checks on October 20 cover what a migrated application sends:

RequestResult
"variables": {"product": "garden tools"} inside promptthe value filled the version’s {{product}}; the answer began “We sell garden tools online.”
model: "gpt-4o" in the requestreplaced by the model stored on the version, GPT-6 Luna
"version": "7", a version the library does not have404 prompt_not_found, “has no version 7”

The last row is the step that is easy to miss. An OpenAI version number maps to the library version with the same number, so a call that pins "version": "7" needs a library v7. Recreate the versions your code pins in order, so their numbers line up, or change those calls to the version you recreated.

OpenAI’s documentation describes no API that reads a prompt object back, and we found no export, so copy each prompt’s text and settings out of the OpenAI dashboard while it is still there. In the console, build a Responses request body from the copied text and paste it into a new prompt’s import, which reads its messages, model, parameters, tools and output schema into a first version, or write the version in the editor.

Should prompts live in code or in a prompt library?

OpenAI recommends code. A library is the choice if you want to change a prompt without a deploy, at the cost of one more service on the request path:

Prompts in codePrompts in a library, called by id
Ship a changea code change, a review, a deploymove a label; reached calls in 8 to 9 s in our runs
Roll backrevert and deploymove the label back
Send 10% of traffic to a new versionyour own flag or routera rollout setting on the label
Reviewgit diff and pull requeststhe version diff in the console; changes are not in your repository
Test before shippingyour own test runnertest sets and eval runs on the prompt
Dependencynone beyond the model providerthe gateway must be reachable to resolve the prompt

The last row is the cost of a library. The Synthorai gateway answers from the last copy of a prompt it read for up to 24 hours if the library cannot be read, and returns 503 only for a prompt it has no recent copy of. A team that wants both can export a library prompt with every version as JSON into its repository.

What does calling a prompt by id cost?

A call by id costs nothing extra: a call by prompt_id sent a median of 114.5 prompt tokens over 20 pairs, the same as the identical request written out in code. The gateway fills in the version’s messages, model and parameters and sends the provider an ordinary request. Calls that cannot be served, such as a missing variable or an unknown id, fail with a 400 or 404 before any model runs and are not billed. A label is a named pointer such as production or staging that names one version at a time, and a moved production label reached calls a median of 8.0 to 8.5 s after the move while calls arrived every half second, and on the first call after 15 s without traffic. Prompt versioning has the code, the five error cases and the timing method.

How do you try a new version on part of production?

You give the production label a second version and a share, and the gateway splits calls by session id (the X-Session-Id header that groups one conversation’s calls), so a conversation never changes version halfway. In our 10% rollout, 16 of 200 sessions (8.0%) went to the candidate, and all 400 sessions across the 10% and 50% runs kept one version. End users identified by a _user label, the request’s user field or safety_identifier also stayed on one version. The candidate was the same prompt moved from GPT-6 Luna to DeepSeek V4.1 Flash. It answered faster, a median 3.1 s against 4.9 s, and at the 10% share alone its 71 calls cost 1.92 times as much per call as production’s. A/B test a prompt change shows how the per-version totals caught it.

How do you test a version before it ships?

You run the new version and the current one on a fixed test set and grade every answer against written checks: patterns, JSON schemas, latency and cost limits, or a model acting as judge. Our v2 shortened the system text and dropped the rule “always state the order number”. On 110 messages no earlier run had used, v2 left the order number out of 18 answers (16%) and v1 out of none, with Fisher’s exact test, which gives the probability of a difference this large by chance, at p = 3.6 × 10⁻⁶ in a test fixed before the run. One earlier 40-row run had passed v2 on every row. The judge, Claude Sonnet 5.5, made up most of the test cost: about a tenth of a cent per row. Test a prompt before it ships has the sizing rule that follows from it.

For teams leaving OpenAI Evals, this is the replacement inside the prompt library, with one difference to plan for: a test run started through the API is run by the caller, which calls both versions, grades the answers and writes the results back. The console runs the same tests from the browser.

What should you do before November 30?

Five steps cover the migration:

  • List every pmpt_ id your code calls, with the versions it pins.
  • Copy each prompt’s text and settings out of the OpenAI dashboard while it is still there.
  • Decide per prompt whether it moves into code (OpenAI’s recommendation) or into a library under the same id.
  • Recreate library prompts under their pmpt_ ids, with every pinned version under its original number, and point the client’s base URL at the gateway; check the X-Synthorai-Prompt-Version header on a first call.
  • Move evals you rely on before October 31, when OpenAI’s become read-only.

FAQ

What happens to OpenAI stored prompts on November 30, 2026?

OpenAI’s deprecations page says reusable prompt objects and the v1/prompts API are scheduled to shut down on November 30, 2026. OpenAI’s migration guide recommends moving prompt text into application code; it does not say what a request with a pmpt_ id returns after that date.

Can I keep calling a pmpt_ id after the shutdown?

You can if a gateway serves that id from its own prompt library. In our test, an OpenAI SDK call with prompt={"id": "pmpt_...", "version": "2"} sent to the Synthorai gateway was answered by library version 2; only the base URL and key changed. A pinned version must exist in the library under the same number, or the call returns 404.

What replaces OpenAI Evals?

Any test runner that calls two prompt versions on fixed inputs and grades the answers can replace it. In a prompt library, test sets and eval runs sit next to the prompt, and the move dialog shows a version’s last run before it ships.

← Back to blog