This is the full developer documentation for Mouse Decision API (mouse-1) # Overview > mouse-1 scores agent options in one forward pass (~100ms) and returns calibrated probabilities with zero data retention. `mouse-1` is a decision model built for agent harnesses and AI-powered software. Instead of generating text token by token and parsing prose back into control flow, it reads your `state` and evaluates up to 128 typed `questions` in a single non-autoregressive forward pass—returning a calibrated probability distribution across your options in \~40–100 ms. Keep control flow, deterministic rules, and side effects in your application code. Call `mouse-1` at narrow decision points where your system needs programmable common sense over unstructured text or structured program state. ## Primitives [Section titled “Primitives”](#primitives) Every question in a request uses one of three primitives, and every answer returns a constrained, schema-valid distribution: | Primitive | Question asks | Answer fields | Maps in code to | | ------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------- | -------------------- | | [`choice`](/docs/concepts/questions#choice) | Which of these named options (up to 1,024)? | `choice`, `probabilities`, `confidence`, `mouse` | `switch` / router | | [`noul`](/docs/concepts/questions#noul) | Is this binary condition true? | `noul` (`0.0` to `1.0`), `mouse` | `if` / gate | | [`score`](/docs/concepts/questions#score) | Which of these 2–10 ordered rubric levels applies? | `score`, `legend`, `probabilities`, `confidence`, `mouse` | threshold / rank key | Every question in a single `POST /v1/decisions` (or `POST /v1/systemone`) call is evaluated **in parallel and in isolation** against the same `state`: * **Speculative fan-out is nearly free:** `state` tokens are billed once per request regardless of how many questions you attach. Ask every question a downstream branch might need and let your code ignore the rest. * **No cross-question contamination:** Adding or removing a question never shifts another question's probabilities. * **5-minute prefix caching:** Repeating the same `state` within 5 minutes bills `state_tokens` at the cached rate (**$0.02 / 1M** instead of **$0.10 / 1M**). * **Calibrated abstention:** Fit a signed `calp1.` profile on 200+ of your own labeled examples via `POST /v1/calibrations` so every answer includes `mouse.abstain` (`true` when top probability falls below the out-of-fold cutoff for your target error rate). * **Zero data retention by default:** Every request sends `Mouse-Data-Retention: none` and `Cache-Control: no-store`. Request states, questions, answers, and calibration examples are never logged or stored. ## Endpoints [Section titled “Endpoints”](#endpoints) Base URL: `https://api.mouse.dev` (US-East) | Method & path | Description | | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`POST /v1/decisions`](/docs/api-reference#post-v1systemone) | Evaluate `choice`, `noul` (yes/no), and `score` questions in parallel against a `state` (`POST /v1/systemone` is served as an identical alias for TypeSafe System One SDKs). | | [`POST /v1/calibrations`](/docs/api-reference#post-v1calibrations) | Fit a signed confidence cutoff profile (`calp1.`) on 200–5,000 labeled examples using 5-fold out-of-fold cross-fitting. | | [`GET /v1/models`](/docs/api-reference#get-v1models) | List immutable model snapshots (`mouse-preview-2026-10-13`) and active aliases (`mouse-1`, `mouse`). | | [`GET /healthz`](/docs/api-reference#get-healthz) | Unauthenticated liveness and region probe. | ## Example request [Section titled “Example request”](#example-request) This single request routes an agent turn across four tools (`choice`) and checks whether a proposed shell command is safe to run without human approval (`noul`): ```bash curl https://api.mouse.dev/v1/decisions \ -H "Authorization: Bearer $MOUSE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "mouse-1", "state": { "task": "Rename exported function `parseToken` to `verifyToken` in src/auth.ts.", "proposed_command": "pnpm --filter @mouse/relay test" }, "questions": { "next_tool": { "type": "choice", "instructions": "Which tool should handle `task` next?", "criteria": { "edit_file": "Modify source code in a file", "grep_search": "Search for symbols across the repository", "run_tests": "Execute the test suite", "ask_user": "Ask the user for clarification" } }, "safe_to_run": { "type": "noul", "instructions": "Is `proposed_command` safe to run without human approval?" } } }' ``` ## Example response [Section titled “Example response”](#example-response) ```json { "id": "dec_8f92a1c04e1b902d", "object": "systemone.response", "model": "mouse-preview-2026-10-13", "answers": { "next_tool": { "type": "choice", "choice": "edit_file", "confidence": 0.88, "probabilities": { "edit_file": 0.91, "grep_search": 0.06, "run_tests": 0.02, "ask_user": 0.01 }, "mouse": { "calibrated": false, "p_top": 0.91, "abstain": null } }, "safe_to_run": { "type": "noul", "noul": 0.98, "mouse": { "calibrated": false, "p_top": 0.98, "abstain": null } } }, "usage": { "input_tokens": 74, "state_tokens": 26, "question_tokens": 26, "framing_tokens": 22, "image_tokens": 0, "cached_tokens": 0, "output_tokens": 0, "cost_usd": 0.0000074 }, "latency_ms": 38.2 } ``` ## Next steps [Section titled “Next steps”](#next-steps) * **[Quickstart](/docs/quickstart)** — Create an API key and run your first multi-question call in 60 seconds. * **[Build with coding agents](/docs/agents)** — Copy one prompt to deploy `mouse-1` using Cursor, Claude Code, or Codex, or point your agent at [`/llms-full.txt`](/llms-full.txt) and [`/llm.txt`](/llm.txt). * **[API Reference](/docs/api-reference)** — Complete request schemas, answer shapes, headers, and status codes. * **[Question types](/docs/concepts/questions)** — Learn how `choice`, `noul`, and `score` map to control flow and how `confidence` is calculated. * **[Migrate from Jev or OpenAI Decisions](/docs/guides/migrate)** — Side-by-side comparison and migration recipes. * **[Console Playground](/console/playground)** — Test states and questions interactively in your browser. # API reference > Complete HTTP API reference for mouse-1 — POST /v1/systemone, POST /v1/calibrations, GET /v1/models, and GET /healthz. Evaluate a `state` against a map of typed `questions` (`choice`, `noul`, `score`) in a single forward pass (\~40–100 ms) and receive structured `answers` with calibrated probability distributions. * **Base URL:** `https://api.mouse.dev` (US-East) * **Authentication:** `Authorization: Bearer sk_mouse_...` ([create an API key](/console/keys)) * **Data retention:** Zero data retention by default on every request (`Mouse-Data-Retention: none`, `Cache-Control: no-store`) * **OpenAPI 3.1 spec:** [`/openapi.json`](/openapi.json) · **Interactive Playground:** [`/console/playground`](/console/playground) | Method & endpoint | Auth | Description | | ----------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`POST /v1/decisions`](#post-v1systemone) | `Bearer sk_mouse_...` | Evaluate 1 to 128 typed `choice`, `noul` (yes/no), and `score` questions in parallel against a `state` (`POST /v1/systemone` is served as an identical alias). | | [`POST /v1/calibrations`](#post-v1calibrations) | `Bearer sk_mouse_...` | Fit a signed confidence cutoff profile (`calp1.`) on 200–5,000 labeled examples using 5-fold out-of-fold cross-fitting. | | [`GET /v1/models`](#get-v1models) | `Bearer sk_mouse_...` | List immutable model versions (`mouse-preview-2026-10-13`) and current aliases (`mouse-1`, `mouse`). | | [`GET /healthz`](#get-healthz) | None | Unauthenticated liveness and region probe. | *** ## `POST /v1/systemone` [Section titled “POST /v1/systemone”](#post-v1systemone) Evaluate up to 128 typed `questions` in parallel and in isolation against a shared `state`. ```http POST https://api.mouse.dev/v1/systemone Authorization: Bearer Content-Type: application/json ``` ### Request body [Section titled “Request body”](#request-body) | Property | Type | Required | Default | Description | | ----------------- | ------------------------------------------------ | ------------ | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `state` | `string \| object \| array \| number \| boolean` | **Required** | — | The content to evaluate (up to **65,536 tokens**). Pass a string for a single message or passage, or a JSON object/array for structured application state, tool proposals, and records. Never truncated; states over 65,536 tokens return `422 state_too_long`. | | `questions` | `Record` | **Required** | — | Non-empty map of 1 to **128** question IDs you choose to typed [`ChoiceQuestion`](#choice-question), [`NoulQuestion`](#noul-question), or [`ScoreQuestion`](#score-question) objects. Question IDs are returned as keys in `answers` and are not sent to the model during inference. | | `model` | `string` | Optional | `"mouse-1"` | Model alias (`"mouse-1"`, `"mouse"`) or immutable snapshot ID (`"mouse-preview-2026-10-13"`). | | `calibration` | `string \| null` | Optional | `null` | Optional signed calibration profile token (`"calp1.."`) returned by [`POST /v1/calibrations`](#post-v1calibrations). | | `order_invariant` | `boolean` | Optional | `false` | Score every multi-option `choice` question a second time with its options reversed and average the two distributions, removing option-order sensitivity. The reversed questions are billed again (their `question_tokens` and `framing_tokens` roughly double); the `state` prefix is shared and billed once. `noul` and `score` are never permuted. | Unknown top-level fields (for example `"temperature"`) are ignored and listed in the response's `warnings` array. Unknown fields inside a question object are refused with `422 invalid_schema`. #### Accepted aliases [Section titled “Accepted aliases”](#accepted-aliases) So that a migration is a base-URL change, the request parser also accepts, and normalizes before validation: | You send | Read as | | ---------------------------------------------------------- | ------------------------------------------- | | `input` | `state` | | `questions` as an array of objects carrying `id` or `name` | `questions` map keyed by that `id`/`name` | | `type: "predicate"` or `type: "boolean"` | `type: "noul"` | | `text` | `instructions` | | `options: ["a", "b"]` | `criteria: { "a": null, "b": null }` | | `choices: [{ value, description }]` | `criteria: { [value]: description }` | | `levels: [{ label, description }]` | `criteria: ["