OpenAI’s Decisions API Is in Public Beta. Build a Typed Router in TypeScript. OpenAI released its Decisions API in public beta on October 6, 2026, offering GPT-6 Luna with three output types — predicates, choices and scores — and claiming decisions can run up to 10× faster than GPT-6 Luna through the Responses API. A developer published a TypeScript router that validates the API's typed output at the application boundary, checking for a single named answer, handling refusals and unexpected types, and routing unknown or duplicate answers to a review queue instead of dispatching them directly. The demo runs on Node.js 22.20.0 with built-in type stripping and uses ten invented fixtures rather than live API calls. October 7, 2026 — news: OpenAI made the Decisions API available in public beta on October 6. The announcement names GPT-6 Luna and three outputs: predicates, choices and scores. OpenAI claims decisions can be up to 10× faster than GPT-6 Luna through the Responses API . That is a vendor claim, not a measurement from this build. Primary announcement https://community.openai.com/t/decisions-api-is-now-available-in-public-beta/1403877 . The engineering idea I care about is smaller than an agent loop: hand the model a bounded question, then let application code decide what happens next. A support message arrives. You need a queue, not a paragraph. The dangerous implementation is one line: dispatch answer.choice ; The useful implementation has a boundary. It knows the expected question name, the allowed routes, the answer type, and what to do when the model refuses or the response is unusable. Let's build that boundary in TypeScript. Honesty note: this is a local consumer-side demo with ten invented response fixtures. It makes no OpenAI API requests and needs no API key. It tests our routing policy, not GPT-6 Luna's accuracy, calibration, speed or refusal rate. The threshold is illustrative. The October 6 API changelog https://developers.openai.com/api/docs/changelog records the beta release at /v1/decisions . This is an availability update following the earlier preview, not a claim that the concept first appeared yesterday. The current Decisions guide https://developers.openai.com/api/docs/guides/decisions says the beta supports gpt-6-luna and text/image inputs. A predicate estimates whether a condition is true; a choice selects from your fixed values; a score evaluates ordered levels. A question's name identifies its answer. Refusals need their own handling. For a support router, a choice is a natural fit. The result can assign work to billing, technical support, or a review queue. My design keeps refunds and other consequential actions outside that router. Typed output shrinks the space of normal answers. It does not remove the need to validate external data or define failure behavior. We accept unknown , rather than pretending the network response already has a trusted TypeScript type. Then we check: department . Notice the order. A high confidence cannot rescue an unknown route. A duplicate answer cannot silently win because it happened to appear first. The code intentionally validates only the fields our application uses. It is not a complete validator for every field in the API response. Save this as router.ts . I ran it on Node.js 22.20.0 using built-in TypeScript type stripping. No npm packages are required for execution. node router.ts Type stripping runs TypeScript syntax; it does not perform a type check. python import assert from 'node:assert/strict'; const routes = 'billing', 'technical', 'other' as const; type Route = typeof routes number ; type Result = { queue: Route | 'review'; reason: string }; const object = x: unknown : x is Record