Decisions API goes GA: a fast, low-cost judgment endpoint, explained
The 2026-10-22 announcement makes the Decisions API generally available: POST /v1/decisions, gpt-6-luna only, uncached input at $0.10 per 1M tokens with free output, up to 400 questions per request. The beta first shipped 2026-10-06.
The Decisions API is OpenAI's answer to the cases that need an answer, not a generation: ask structured questions about text, image, or JSON evidence and get typed, probability-bearing answers back. On 2026-10-22 an official announcement made it generally available, and the official guide now documents the full request shape, the three question types, and the pricing. This article lays out every material fact at the GA point in time — announcement wording, guide parameters, the SDK timeline, and the same-day breaking change — each one traceable to a source loaded for this batch.
1. The official wording at GA
The announcement arrived as the official news RSS item of 2026-10-22 19:00 GMT, titled "Build more responsive apps with the Decisions API", with a one-line description: Fast, focused, low-cost decisions for any application (the article page returned 403 to this site that day; the facts here come from the RSS fetch). The substance lives in the official guide, whose opening lines set the frame:
- The Decisions API evaluates text, images, and JSON and returns typed answers about 10x faster than the Responses API. — an officially stated relative speedup ("about 10x") with no absolute latency figures or benchmark methodology attached.
- Send requests to
POST /v1/decisionsusinggpt-6-luna, the only currently supported model. — the endpoint and its single supported model, stated outright.
There is also a Playground at platform.openai.com/decisions for trying questions before writing code.
2. Request and answer shapes
The request has three parts, quoted from the guide's own table:
| Field | Purpose |
|---|---|
model | The model that evaluates the request; currently only gpt-6-luna |
input | Shared evidence: a text string, or an ordered array of messages, tool calls, and tool outputs |
questions | What to evaluate: each question's type, instructions, and any allowed choices or score levels |
The response is an answers array; give each question a unique name and the API echoes it back. The three question types:
| Type | Use it to | Main result |
|---|---|---|
predicate | Check a condition (visible damage, passage relevance) | probability: a 0-1 estimate that the condition is true |
choice | Select one option (department, content category) | choice: one of your supplied values |
score | Rate against ordered levels (issue severity) | score: the probability-weighted average of level indices, which can fall between levels |
Both choice and score return probabilities over discrete options plus a separate confidence field. Answer objects also have a refusal type — the official sample code branches on it explicitly. The guide's selection boundary is equally blunt: Structured Outputs for generating objects that follow your own JSON schema, function calling for tool requests, Decisions for typed answers.
3. A complete request (the guide's own example)
This is the support-ticket example from the official guide (an input_json block passes structured evidence inside a user message, no string serialization needed):
{
"model": "gpt-6-luna",
"input": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Evaluate the ticket using the order evidence."
},
{
"type": "input_json",
"data": {
"ticket": { "body": "Please refund the duplicate charge." },
"order": { "charges": [49, 49] }
}
}
]
}
],
"questions": [
{
"type": "predicate",
"name": "duplicate_charge",
"instructions": "Does the ticket describe a duplicate charge supported by the order?"
}
]
}
The equivalent SDK call (the official product-photo damage check):
import base64
from openai import OpenAI
client = OpenAI()
decision = client.decisions.create(
model="gpt-6-luna",
input=[
{
"role": "user",
"content": [
{"type": "input_text", "text": "Inspect the product in this photo."},
{"type": "input_image", "image_url": f"data:image/png;base64,{image_base64}"},
],
}
],
questions=[
{
"type": "predicate",
"name": "visible_damage",
"instructions": "Does the product have visible damage, such as a crack, tear, or dent? Ignore shadows and damage to the packaging.",
}
],
)
answer = decision.answers[0]
if answer.type == "refusal":
print(f"Refused: {answer.name}")
elif answer.type == "predicate":
print(f"Visible damage probability: {answer.probability}")
(In the sample, image_base64 stands for the official example's local-image base64 encoding line and its Path import, compressed here into a variable reference — everything else is quoted verbatim.)
4. What GA adds over the beta
The guide's what's-new section lists nine additions on the way to GA, quoted in order: prompt caching; images in question instructions (each question gets its own images to compare against shared evidence); input_json structured input; the per-request question cap raised from 200 to 400; hosted image inputs (publicly accessible HTTP or HTTPS image URLs alongside inline base64 data URLs); conversation history (messages alongside function and custom tool calls and their outputs, matched by call_id); organization usage reporting (token usage and request counts); native GPT-Live integration (Live calls Decisions directly, or triggers on input/output transcripts); and Private Link.
Conversation history has explicit input boundaries (the guide's table): user messages carry text, images, and JSON; developer or system messages carry input text only, with system treated as developer; assistant messages carry output text or refusals; function or custom tool outputs carry text and images. Files, audio, and item references are not supported.
5. Pricing and compliance boundaries
The guide's Pricing and availability section is this article's only first-party pricing source; the numbers, in order:
- Uncached input with
gpt-6-lunacosts $0.10 per 1M tokens; cache reads get discounted input pricing and cache writes are charged, at rates matching the standardgpt-6-lunaprompt caching rates; - Output tokens are not charged;
- Regional processing premiums and long-context input pricing multipliers still apply;
- These rates apply only to
/v1/decisions— the same model through other endpoints follows the standard model and processing-tier pricing (the standardgpt-6-lunarate is not in this guide and remained unverified in any source loadable by this site as of 2026-10-23); - Compliance: ZDR and HIPAA support for eligible customers; data residency in all supported API regions; regional processing in the United States and Europe (EEA + Switzerland).
6. The exact caching rules
The guide states the caching semantics outright: by default an implicit cache breakpoint sits at the end of the shared input, so existing requests benefit without changing the request body; the reusable prefix must contain at least 1,024 tokens, and question content does not count toward that threshold; everything inside questions, including question-specific images, sits outside the reusable prefix. Three controls: prompt_cache_key partitions reuse by a caller-provided key; text or image content parts in shared input can carry prompt_cache_breakpoint: {"mode": "explicit"} to mark boundaries; prompt_cache_options.mode set to "explicit" uses only marked boundaries, and a request with none does not use caching at all. Breakpoints are not supported in question instructions. Observability runs through usage.input_tokens_details.cached_tokens and cache_write_tokens — both are already included in usage.input_tokens, so do not add them again.
7. The SDK timeline and the GA-day breaking change
- 2026-10-06 (first beta landing): openai-python v3.26.0 (#4033) and openai-node v7.30.0 (#2886) each merged add standalone Decisions support — identically titled in both packages' release notes.
- 2026-10-16 (caching and Live): v3.32.0 / v7.35.0 added Decisions prompt caching and wired Decisions into Live session triggers (covered in this site's earlier piece, linked under Next steps).
- 2026-10-22 (GA day): python v3.37.0 (#4158, published_at 2026-10-22T20:03:54Z) and node v7.43.0 (published_at 2026-10-22T21:31:14Z) shipped the same breaking change — the Live response's question
instructionsbecamestring | an array of structured parts(text/image/JSON), so calling string methods on it directly breaks (the node release notes' example:question.instructions.trim()); Decisions request inputs gained new message roles and tool-history items, so exhaustive switches need new branches; and node'sDecisionInputMessagebecame a union, so code extending the old interface must useDecisionInputMessage.DecisionInputUserMessage. The official notes state that existing string instructions and user-message inputs keep working.
8. Next steps
- For the mechanism that triggers Decisions inside Live sessions (triggers, the three question types, delegation), see openai-python 3.32.0 and openai-node 7.35.0: prompt-created voices, Live audio fixtures, and Decisions in Live.
- For gpt-6-luna's official positioning in the GPT-6 family (the low-cost, high-throughput tier), see The GPT-6 family grows: gpt-6-sol, gpt-6-luna, gpt-6.1-sol land in the official SDKs.
- For the overall model-selection framework, see The complete guide to GPT models (2026-07): GPT-5.6 Sol, Terra, Luna.
Key points
- The GA announcement appeared as the official news RSS item of 2026-10-22 19:00 GMT, 'Build more responsive apps with the Decisions API' (description reads: Fast, focused, low-cost decisions for any application; the article page returned 403 to this site that day); the official guide states The Decisions API is now generally available and points to a Playground at platform.openai.com/decisions
- Shape: POST /v1/decisions with a model / input / questions triple; the response is an answers array echoing each question's name; gpt-6-luna is the only currently supported model (the guide's own words); officially about 10x faster than the Responses API — a relative claim with no latency figures or benchmark methodology attached
- Three question types: predicate returns probability (a 0-1 estimate); choice returns one of your supplied options; score returns the probability-weighted average of ordered level indices; choice and score also carry a probability distribution and a separate confidence field; answers include a refusal type (the sample code branches on answer.type === "refusal")
- Pricing (the guide's Pricing and availability section): uncached input at $0.10 per 1M tokens with gpt-6-luna; cache reads discounted and cache writes charged at the standard gpt-6-luna caching rates; output tokens not charged; regional processing premiums and long-context multipliers still apply; the rate applies to /v1/decisions only, and the same model through other endpoints follows standard pricing; ZDR and HIPAA for eligible customers, data residency in all supported API regions, regional processing in the US and Europe (EEA + Switzerland)
- New since beta (the guide's what's-new list): prompt caching (implicit breakpoint at the end of shared input, prefix of at least 1,024 tokens), images in question instructions, input_json structured input, 400 questions per request (up from 200), hosted image URLs (public HTTP/HTTPS), conversation history (messages plus function/custom tool calls and outputs paired by call_id), organization usage reporting, native GPT-Live integration, and Private Link
- Timeline: beta first shipped 2026-10-06 (openai-python v3.26.0 #4033 / openai-node v7.30.0 #2886, both titled add standalone Decisions support); caching and Live integration landed 2026-10-16 in v3.32.0/v7.35.0; on GA day (2026-10-22) python v3.37.0 #4158 and node v7.43.0 carried a breaking change — the Live response's question.instructions is now a string or an array of text/image/JSON parts, DecisionInputMessage became a union, and the old forms remain supported
Frequently asked questions
Official references
- AnnouncementBuild more responsive apps with the Decisions API (official announcement; fetched by this site via the official news RSS)
- DocsDecisions guide (official guide, developers.openai.com)
- Changelogopenai-python #4033: add standalone Decisions support (first beta landing)
- Changelogopenai-python v3.37.0 Release Notes (Decisions type breaking change)
- Changelogopenai-node v7.43.0 Release Notes (Decisions type breaking change)
Related articles
OpenAI SDKs Ship Four Releases in One Day: safety_identifier and Translation (v3.33-3.34, v7.36-7.37)
On 2026-10-17 openai-python shipped v3.33.0/v3.34.0 and openai-node shipped v7.36.0/v7.37.0: safety_identifier reached image requests and responses, Realtime Translation sessions landed, and node added GPT-4 alias shutdown notices.
Read articleopenai-python 3.32.0 and openai-node 7.35.0: prompt-created voices, Live audio fixtures, and Decisions in Live
Both official SDKs shipped on 2026-10-16: voices created from a text description (Live only), 30-second Live audio fixtures, Decisions transcript triggers, and prompt caching for the Decisions API - all from the CHANGELOGs and tag sources.
Read articleBrowser and Computer Toolsets (1/4) Land in the OpenAI SDKs: BrowserToolset Turns Driver Methods into Function Tools
On 2026-10-14 the official SDKs shipped four releases: openai-python 3.30/3.31 and openai-node 7.33/7.34. The (1/4) browser and computer toolsets headline: BrowserToolset wraps a caller-supplied driver as ordinary function tools.
Read articleSubscribe to GPTMap Weekly
One email every Monday: curated OpenAI updates, deep dives, and best practices. No ads, unsubscribe anytime.
Submitting opens Buttondown in a new tab to confirm your subscription.