Skip to main content

OpenAI Decisions API Explained: Typed Answers Are Not Permission to Act

A billing label should move a ticket to the right queue, not move money. That is the boundary I would preserve when adopting OpenAI’s Decisions API: let the model interpret a messy message, then let application rules decide what may happen next. A well-formed answer can still be wrong or insufficient to authorize an action.

Decisions returns a probability, a supplied category or a rubric score instead of a free-form explanation. This guide explains those answer shapes, shows a corrected JSON example, and works through threshold and caching choices. The aim is to make a small judgment useful to software while keeping evidence checks, human review and consequential actions under separate control.

OpenAI Decisions workflow: evidence becomes a typed judgment, application policy routes it, and action authority remains separate
The practical distinction
  • A typed result makes parsing simpler; it does not prove correctness.
  • A score’s average can hide a very different distribution of possible outcomes.
  • A routing threshold needs local labeled examples and a defined cost of mistakes.
  • Cached input, new input and cache writes are separate billing categories—not extra tokens to add to usage twice.

First, understand what the endpoint decides

An API is the interface software calls to request work. A typed answer has an expected shape, such as a category from a fixed list, rather than arbitrary prose. OpenAI’s October 22 changelog marks Decisions as generally available. The endpoint is POST /v1/decisions, currently using gpt-6-luna.

Think of a support desk receiving an unclear complaint. The model can interpret what the person seems to mean; code can check the account, required permissions and allowed workflow. Neither the word “billing” nor a high probability proves that an order has been charged twice.

Read Figure 1: Follow the result through the routing gate. The lower layer requires separate evidence and authority before a billing change can occur.

Typed judgment and permission belong to different layersEvidence is evaluated by the model, then application policy chooses routing or review. Actual billing changes require a separate record check and authority boundary.Typed judgment and permission belong to different layersProposed support-routing design; the model does not execute the action.EVIDENCETicket + order recordText / image / JSONMODEL JUDGMENTTyped answerDistribution / probabilityROUTING POLICYValidate + apply cutoffQueue or human reviewSEPARATE ACTION AUTHORITYBilling records + permissions + approved workflowA billing label is not permission to issue a refund.Transport success ≠ factual truth ≠ permission to act.
Keep judgment and action apartEvidence is evaluated by the model, then application policy chooses routing or review. Actual billing changes require a separate record check and authority boundary.Keep judgment and action apartProposed application design.EVIDENCETicket + order recordText / image / JSONMODEL JUDGMENTTyped answer + probabilityStill an estimateROUTING POLICYValidate + apply cutoffQueue or human reviewACTION AUTHORITYRecords + permissionsApproved billing workflowA label cannot issue a refund.Judgment is not permission.
Figure 1. Proposed responsibility map. The API supplies a typed judgment; the application must separately enforce evidence checks and action permissions. Original diagram: Tech Trend Insight. Official sources: Decisions guide.

Use ordinary code when a reliable structured rule already answers the question. Use Decisions when the judgment needs interpretation and a bounded answer is enough. For custom extracted fields or a generated explanation, OpenAI points to Responses with Structured Outputs; for requesting a tool with arguments, it points to function calling. Those tools also need application-side authorization.

OpenAI describes Decisions as about ten times faster than Responses. Treat that as a vendor comparison, not a latency promise for your workflow. Measure the same inputs and question definitions, include routing and fallback time, and check that the faster path still meets your quality bar.

Choose a condition, a category or an ordered rubric

The API reference defines three question types. A predicate estimates whether one condition is true. A choice selects from supplied values. A score uses ordered levels and returns their probability-weighted average index. A question can also return refusal; other questions in that request can still have answers.

Read Figure 2: Begin with what your code needs to receive. Departments have no natural order, so routing is a choice rather than a severity score.

Choose a condition, a category or an ordered rubricA predicate estimates a condition, a choice selects a supplied category and a score summarizes ordered level probabilities. Any question may return a refusal instead.Choose a condition, a category or an ordered rubricThe three question types answer different application questions.WHAT ANSWER DOES CODE NEED?Choose the shape before the wording.PREDICATEOne conditionprobability from 0 to 1Is damage visible?CHOICEOne supplied categorychoice + probabilitiesWhich queue?SCOREOrdered rubric levelsWeighted index averageHow severe?Any question may instead return refusal. That is not a negative answer.
Choose the output shapeA predicate estimates a condition, a choice selects a supplied category and a score summarizes ordered level probabilities. Any question may return a refusal instead.Choose the output shapeCondition, category or rubric.WHAT SHOULD CODE RECEIVE?Pick the answer shape first.PREDICATEOne condition → probabilityExample: visible damage?CHOICEOne supplied categoryExample: which queue?SCOREOrdered rubric → average indexExample: how severe?Refusal is a separate branch.It does not mean false.
Figure 2. Question-type map. Use a choice for an unordered category, not a score that invents order among departments. Original diagram: Tech Trend Insight. Official sources: Create decision reference.

Write one observable criterion at a time. “Is there visible damage?” differs from “Should we refund the customer?” The second mixes visual evidence with purchase history and policy. Distinct category descriptions reduce overlap; an other option helps when the list does not cover the request, but it is not a formal API requirement for every choice list.

For severity, define what each level means before looking at results. “Cosmetic,” “workaround available” and “fully blocked” are ordered conditions. Their numeric positions start at zero; the distance between positions is a scoring convention, not a measurement of dollars lost.

Do not throw away the distribution behind a score

For levels 0, 1 and 2, a score is 0×p0 + 1×p1 + 2×p2. Consider two worked distributions. A assigns all probability to level 1: [0, 1, 0]. B assigns half to each extreme: [0.5, 0, 0.5]. Both return an average of 1.0.

Read Figure 3: Compare the probability of level 2, not just the average. The same score can represent certainty about the middle or a split between opposite outcomes.

The same average score can hide very different uncertaintyDistribution A assigns all probability to level one. Distribution B assigns half each to levels zero and two. Both average to one but have different probability of the highest-severity level.The same average score can hide very different uncertaintyWorked distributions; bar lengths use probability 0–1 in both panels.LEVELS: 0 = COSMETIC · 1 = WORKAROUND · 2 = BLOCKEDA · ALL MASS AT THE MIDDLELevel 00Level 11Level 2001 probabilityB · SPLIT BETWEEN EXTREMESLevel 00.5Level 10Level 20.501 probabilityA: (0×0) + (1×1) + (2×0) = 1.0B: (0×0.5) + (1×0) + (2×0.5) = 1.0Same score. Different probability of a fully blocked issue: 0 versus 0.5.
One score, two distributionsDistribution A assigns all probability to level one. Distribution B assigns half each to levels zero and two. Both average to one but have different probability of the highest-severity level.One score, two distributionsWorked example; probability 0–1.LEVELS: 0 / 1 / 2Cosmetic / workaround / blockedA · ALL AT LEVEL 1001120Score = 1.0B · SPLIT EXTREMES00.51020.5Score = 1.0Same score, different risk.Probability of level 2:A = 0; B = 0.5.
Figure 3. Worked rubric calculation, not observed model output. Level indices summarize an ordered rubric; they are not physical units of business harm. Original diagram: Tech Trend Insight. Official sources: Decisions guide.

If a fully blocked issue needs urgent review, B may deserve different handling from A even though their scores match. A rule using only score >= 1 loses that distinction. Preserve the per-level probabilities when the application cares about a particular severe outcome.

Choice and score answers also have a separate confidence field. Do not silently replace it with the largest option probability or interpret it as a guaranteed accuracy percentage. Keep the fields distinct and test how each relates to labeled outcomes in your own data. Predicates expose the condition probability rather than that same choice/score confidence shape.

A corrected support-routing JSON example

Here is a proposed request body for POST /v1/decisions using fictional evidence. The input_json part contains data, inside a user message’s content array. One posted charge plus one pending charge is deliberately inconclusive evidence for a duplicate completed payment.

{
  "model": "gpt-6-luna",
  "input": [
    {
      "role": "user",
      "content": [
        {
          "type": "input_text",
          "text": "Route this fictional support ticket. Routing does not authorize a refund."
        },
        {
          "type": "input_json",
          "data": {
            "ticket": {
              "body": "I see two charges for this order."
            },
            "order": {
              "charges": [
                {
                  "id": "a",
                  "amount": 49,
                  "status": "posted"
                },
                {
                  "id": "b",
                  "amount": 49,
                  "status": "pending"
                }
              ]
            }
          }
        }
      ]
    }
  ],
  "questions": [
    {
      "type": "choice",
      "name": "department_route",
      "instructions": "Which team should review the complaint? Do not decide refund eligibility.",
      "choices": [
        {
          "value": "billing",
          "description": "Charges, invoices and payment questions."
        },
        {
          "value": "technical",
          "description": "Product malfunction or integration problems."
        },
        {
          "value": "shipping",
          "description": "Delivery or tracking problems."
        },
        {
          "value": "other",
          "description": "No suitable category or unclear request."
        }
      ]
    }
  ]
}

A hypothetical response excerpt with the documented field shapes:

{
  "answers": [
    {
      "type": "choice",
      "name": "department_route",
      "choice": "billing",
      "probabilities": [
        {
          "value": "billing",
          "probability": 0.9
        },
        {
          "value": "technical",
          "probability": 0.03
        },
        {
          "value": "shipping",
          "probability": 0.02
        },
        {
          "value": "other",
          "probability": 0.05
        }
      ],
      "confidence": 0.82
    }
  ]
}

Read choice, not a top-level value, to get the selected category. The probabilities field is an array of value/probability objects, not a dictionary keyed by department. Match the answer’s name and type before using it. Handle refusals, unknown types and transport errors explicitly rather than treating them as a negative condition.

In this example, routing to billing is reasonable; refund eligibility remains unresolved. Verify settled payment records, order relationships and the organization’s authorization policy in a separate billing workflow. Equal amounts alone do not establish a duplicate charge. Validate what the actual API returns before connecting the router to consequential actions.

Shared evidence does not create a chain of questions

The GA update raises the request limit from 200 to 400 questions and adds JSON input and question-specific images. Independent questions can share evidence. When question B depends on A’s answer, construct B in a later request rather than expecting it to read A inside the same array.

Read Figure 4: The upper branch asks two independent questions about the same product. The lower branch waits for an answer before the application chooses its follow-up.

A question list is not a chain of dependent decisionsIndependent questions can use shared product evidence in one request. A second question that depends on the first answer requires application branching and another request.A question list is not a chain of dependent decisionsConceptual call sequence; arrows show dependency, not timing.INDEPENDENT QUESTIONS: ONE SHARED INPUTPRODUCT EVIDENCEReference photo + reportQ1 · VISIBLE DAMAGE?Evaluate the shared evidence.Q2 · PRODUCT CATEGORY?Evaluate the same evidence.DEPENDENT QUESTIONS: OBSERVE A BEFORE CREATING BREQUEST AIs damage present?APP BRANCHInspect A’s answerREQUEST BAsk suitable repair type
Shared input is not a chainIndependent questions can use shared product evidence in one request. A second question that depends on the first answer requires application branching and another request.Shared input is not a chainConceptual request dependency.INDEPENDENT: SHARED EVIDENCEPRODUCT INPUTReference photo + reportQ1Visible damage?Q2Product category?DEPENDENT: TWO REQUESTSAIs damage present?APPLICATIONInspect A before composing BBAsk the suitable repair type
Figure 4. Conceptual dependency map. Sharing input does not let one question read an earlier answer in the same questions array. Original diagram: Tech Trend Insight. Official sources: Decisions guide.

Keep shared reference material in input and candidate-specific material in the relevant question instructions. Files, raw audio and item references are not interchangeable with accepted text/image/JSON parts. Conversation tool-call history is evidence for evaluation; it does not turn this endpoint into a tool-execution service.

When processing several questions, record each named outcome. A refusal on one question should not erase unrelated successful answers, nor should a successful answer hide a failed one. If your policy needs all required checks to pass, enforce that requirement in code.

Tune thresholds around mistakes, not a universal cutoff

A false positive is a condition flagged as present when it is absent. A false negative is a real condition the screen misses. For a predicate that screens reports for review, raising the cutoff may reduce false alarms while missing more reports. The right balance depends on the consequence of each error.

The following constructed set contains 100 positive and 900 negative cases. At a cutoff of 0.70, assume 90 true positives and 45 false positives. At 0.90, assume 70 true positives and 9 false positives. These are invented counts for explaining the tradeoff, not test results or recommended thresholds.

Read Figure 5: Precision asks how many positive predictions were correct; recall asks how many actual positives were found. The stricter rule improves one here while reducing the other.

A stricter cutoff changes the error mix, not just confidenceOn a fictional fixed set, a higher threshold reduces false positives from 45 to 9 while increasing false negatives from 10 to 30. Precision increases but recall falls.A stricter cutoff changes the error mix, not just confidenceConstructed 1,000-case example of a screening tradeoff.FICTIONAL LABELED SET: 100 POSITIVE + 900 NEGATIVE CASESPREDICATE CUTOFF ≥ 0.70True positives: 90 False positives: 45False negatives: 10 True negatives: 855Precision: 66.7%Recall: 90%PREDICATE CUTOFF ≥ 0.90True positives: 70 False positives: 9False negatives: 30 True negatives: 891Precision: 88.6%Recall: 70%Higher cutoff: fewer false alarms here, but more missed positives.Choose the tradeoff with labeled cases and the cost of each error.These counts are constructed to explain a tradeoff, not measured API accuracy.
Tune the error tradeoffOn a fictional fixed set, a higher threshold reduces false positives from 45 to 9 while increasing false negatives from 10 to 30. Precision increases but recall falls.Tune the error tradeoffConstructed screening example.FICTIONAL 1,000-CASE SET100 positive + 900 negativeCUTOFF ≥ 0.70True positives 90; false alarms 45Missed positives 10True negatives 855Precision 66.7%Recall 90%CUTOFF ≥ 0.90True positives 70; false alarms 9Missed positives 30True negatives 891Precision 88.6%Recall 70%Fewer false alarms can meanmore missed positives.Constructed counts, not a test.
Figure 5. Constructed counts for a predicate-screening example. Precision is true positives divided by all positive predictions; recall is true positives divided by all actual positives. Original diagram: Tech Trend Insight. Official sources: Decisions guide.

The first rule has precision 90/(90+45) = 66.7% and recall 90/100 = 90%. The stricter rule has precision 70/79 ≈ 88.6% and recall 70%. If missing a case is expensive, the second rule may be worse despite fewer false alarms.

Calibration is a different question: among labeled cases assigned probabilities near 0.8, does the condition occur roughly that often? Check that relationship separately from precision at one cutoff. Keep tuning and final evaluation samples separate, include ambiguous and out-of-scope cases, and reassess after changing questions or input populations.

Start in shadow mode: record what the proposed router would do while the existing process remains authoritative. Minimize sensitive data sent or logged, route uncertainty to review, and monitor refusal, fallback, error and routing outcomes separately. Do not choose an arbitrary fixed sample size and call the system validated.

Put the cache boundary and token charges in the same worksheet

Decisions caches an eligible matching prefix of shared input; question content lies outside that reusable prefix. A repeated long rubric inside questions therefore does not automatically receive the shared-input cache discount. The documented minimum reusable prefix is 1,024 tokens.

Read Figure 6: The dotted line is an accounting boundary, not a trust boundary. Changed question material still counts toward input even when shared reference material is reused.

Cache reuse follows the shared-input boundaryShared input can be a reusable eligible prefix. Question instructions and their images are outside that reusable prefix. Cache-read and write counts are included in total input usage.Cache reuse follows the shared-input boundaryDocumented Decisions caching boundary, shown conceptually.SHARED INPUTReference material + stable evidenceIdentical eligible prefix may receive cache-read pricing.CACHE BOUNDARY: QUESTION CONTENT IS OUTSIDE THE REUSABLE PREFIXQUESTIONSChanged instructions + candidate imagesCount as input; not this shared cache.USAGE ACCOUNTINGTotal input includes read + write subsets.Do not add them to the total again.Check cached_tokens and cache_write_tokens instead of assuming a hit.
Cache the shared evidenceShared input can be a reusable eligible prefix. Question instructions and their images are outside that reusable prefix. Cache-read and write counts are included in total input usage.Cache the shared evidenceConceptual Decisions cache boundary.SHARED INPUTStable reference materialEligible matching prefixmay receive cache pricing.CACHE BOUNDARYQuestions are outside the prefix.QUESTIONSInstructions + candidate imagesStill input tokensNot the shared-input cacheUSAGE TOTALRead / write counts are subsets.Do not double count them.Inspect actual cached_tokensand cache_write_tokens.
Figure 6. Conceptual caching map. Eligibility and matching rules still apply; repeating a long question rubric does not make question content part of the shared-input cache. Original diagram: Tech Trend Insight. Official sources: Prompt caching guide; Create decision reference.

The Standard Luna rates and Decisions pricing section list $0.10 per million uncached input tokens, $0.01 cached input, and $0.125 for default cache writes. Decisions output tokens are not charged; do not substitute Luna’s Responses output rate. Regional and long-context multipliers may apply.

Worked cost example. Assume one request reports 10,000 total input tokens, including 6,000 cache-read tokens and 2,000 cache-write tokens, with the remaining 2,000 ordinary uncached tokens. Assume Standard base rates, no regional premium and no long-context multiplier:

Read:     6,000 × $0.01 / 1,000,000  = $0.00006
Write:    2,000 × $0.125 / 1,000,000 = $0.00025
Uncached: 2,000 × $0.10 / 1,000,000  = $0.00020
Estimated token charge                       $0.00051

The read and write counts are subsets of usage.input_tokens; adding them to the total again double-counts usage. Cache-write rates are total write rates, not a surcharge added to ordinary input for the same token. Confirm the categories in actual usage, and count retries and review costs when evaluating the whole workflow.

The current Decisions reference lists only ttl: "30m". The general prompt-caching guide documents a 12-hour option specifically for Responses; do not copy it into Decisions. A minimum cache lifetime is also not a deletion deadline or a latency guarantee.

Keep retention and regional processing separate from routing

OpenAI’s data controls describe default abuse-monitoring logs of up to 30 days and ZDR eligibility with limitations. They also describe encrypted GPU-local cache state with a 24-hour expiration. Those are separate concepts from the request’s minimum cache lifetime.

The documented image exception is specific: potential child sexual abuse material (CSAM) detected by the submission classifier can be retained for manual review even under ZDR. Do not broaden that into “all safety flags” or promise that enabling ZDR removes every retention path.

Regional availability and data residency do not prove inference runs in that same region. Decisions regional processing is currently documented for the US and Europe (EEA plus Switzerland). Check the endpoint, organization eligibility and current terms before sending regulated or confidential data. This article does not determine compliance for your application.

My release rule is simple: verify the request shape, evaluate the judgment on local labeled cases, enforce permissions outside the model, and keep a reversible fallback. Typed answers make software integration more direct. They do not remove the work of deciding what evidence is sufficient and who may act on it.

Sources and scope — checked October 24, 2026. Product behavior comes from the official OpenAI documentation below. Routing gates, response numbers, score distributions, threshold counts and costs are proposed or worked examples with stated assumptions.

Official OpenAI documentation

Popular posts from this blog

OpenAI Prompt-to-Voice Explained: From Voice Description to Live Conversation

I would choose an AI voice for clarity before character. A reassuring sound helps only when listeners understand the words and the assistant handles their request correctly. OpenAI’s prompt-to-voice makes vocal style easier to configure, but a useful voice application still needs clear conversation rules, verified actions, and a deliberate data policy. OpenAI’s October 16 release notes announced text-described voices for API customers. This guide explains how a description becomes reusable configuration, how to connect it to GPT-Live, and what to check before using it with callers. A fictional help desk provides the examples; the emphasis is on understanding the workflow rather than memorizing acoustic terminology.

Grok 3’s 2025 Release: What xAI Announced, What Arrived, and What Changed

“When will Grok 3 launch?” was a moving target in February 2025. Elon Musk and xAI teased the model before the public beta announcement, so headlines often mixed a promised date with a product that was still being staged. The durable story is the timeline: a training claim, an announcement, limited access, and a later evaluation period are four different events. Key Takeaways xAI’s written Grok 3 announcement is dated February 19, 2025. That document date alone does not establish the time of a livestream or first access for every account. The beta included Grok 3, Grok 3 mini, optional Think modes, and the DeepSearch research agent. Early access was tied to Grok.com and X Premium tiers; xAI said API access was coming later at announcement time. A release date is not a quality guarantee. Check availability, rate limits, citations, and tool permissions in the environment you actually use. Open original image at full size ↗ Figure 1: Official NVIDIA–xAI visual from the October 2024 Coloss...

Meta’s VideoJAM Explained: Why Motion Coherence Matters in AI Video

VideoJAM is easy to misunderstand because its name sounds like a product. The paper presents something narrower and more useful to analyze: a framework that gives a video generator an explicit motion prior. It is designed to address temporal coherence—the way objects, bodies, and physical interactions should remain plausible as a clip unfolds—not to provide a consumer dashboard with templates or a “generate video” button. Key Takeaways VideoJAM is a research framework for video generators, not a consumer-facing app with templates or a standalone UI. The training objective predicts appearance and motion from one joint representation; Inner-Guidance uses the model’s evolving motion prediction during sampling. On VideoJAM-bench, the authors reported motion-preference results against Sora, Kling 1.5, and Runway Gen3, while visual quality and motion remain separate measures. The experiments used 256×256, 128-frame clips at 24 fps and a motion-focused 128-prompt benchmark, so the results do ...