Decisions API
Decisions API
Most model calls hand you a paragraph and leave you to pull a decision out of it: prompt for JSON, parse it, validate it, retry when it drifts. The Decisions API removes that layer. You send the state your application is in plus the questions you need answered, and each answer comes back already typed — a boolean-like likelihood, one of your named options, or a position on your own scale — with a probability attached.
It is built for the decision points inside software rather than for conversation: routing a ticket, gating a tool call, triaging a queue, scoring a submission before a human sees it.
POST https://api.beatapi.io/v1/systemone
This is TypeSafe’s own endpoint path, and the request and response bodies are theirs too — a client written against the TypeSafe API or any of its SDKs reaches this by changing the base URL and the model name, with nothing else to adapt. POST /v1/decisions is kept as an alias.
This endpoint is not /v1/chat/completions, and jev-1.13 is not available there. There are no messages in the request and no choices in the response — a decision model does not generate text.
Quick start
0.04 is the model’s likelihood that the answer is yes. Four percent — so the agent stops and asks a human, which is the point of asking.
Request
Each question takes a type, an instructions, and — depending on the type — a criteria.
The three question types
noul — a calibrated likelihood
Use it for a yes/no that deserves a threshold rather than a coin flip. The answer is a number from 0 to 1.
criteria is optional here, but explaining both sides sharpens the answer. Pick your own threshold: auto-approve above 0.9, escalate below 0.6, queue the middle for review.
noul is the type’s real name, not a typo for bool. A misspelled type is rejected with a 400 that names the three valid ones.
choice — one of your named options
criteria is an object mapping each option name to what it means. The answer names the winning option and shows the full distribution.
score — a position on your scale
criteria is an array describing the scale, lowest first. The answer is a continuous value over the array indices, starting at 0.
1.98 sits between legend["1"] and legend["2"], leaning hard on the latter — “answer today”. Round it when you need a bucket; keep the decimal when you need to sort a queue.
Several questions, one call
Ask everything you need about the same state at once. Each answer is independent, and you are billed for the state once rather than once per question.
Response
The response is synchronous: a successful HTTP response means the decision is made. There is nothing to poll and no artifacts to fetch.
Limits
- Context — 32,000 tokens for
stateandquestionscombined. - No sampling parameters.
temperature,top_p,seedand friends are not accepted; the model is deterministic in shape by design. - No streaming. The answer is a value, not a sequence of tokens.
- A
choiceneeds a non-emptycriteriaobject and ascoreneeds a non-emptycriteriaarray — both are rejected with a 400 that says which.instructionsis optional, but an empty one is rejected rather than sent.
Errors
Failed calls do not consume credits.
Billing
Decisions are billed on input tokens only — the tokens your state and questions occupy — at $0.042 per 1M input tokens. Output is not billed, because the output is a typed value rather than generated prose. usage.input_tokens in every response tells you exactly what the call counted, so you can reconcile spend per call.
Asking several questions about one state in a single call is therefore materially cheaper than sending the same state several times.

