api.md
API reference
Full HTTP API reference for the TypeSafe evaluation endpoint.
Evaluate a state against a map of typed questions and get back structured answers, one per question. For a guided introduction, start with the primitives.
Evaluation endpoint
POST https://api.typesafe.ai/v1/systemone
Authorization: Bearer <API_KEY>
Content-Type: application/json
Request body
The top-level shape of every request. Each entry in the questions map is a typed question you name.
{
"state": "Help! My payouts have been failing for 3 days.",
"model": "jev-latest",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?"
}
}
}
Question types
A Question is one of three types, set by its type field. All three share type and instructions; each adds its own criteria.
Noul
A yes/no question. Returns the probability the answer is yes.
{
"state": "Help! My payouts have been failing for 3 days.",
"model": "jev-latest",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?",
"criteria": {
"true": "Explicitly time-sensitive",
"false": "No urgency expressed"
}
}
}
}
Choice
Picks one option from a set you define. Returns the chosen option and the full probability distribution.
{
"state": "Help! My payouts have been failing for 3 days.",
"model": "jev-latest",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new accounts"
}
}
}
}
Score
Rates the state along a rubric you define. Returns a probability-weighted value across your levels.
{
"state": "Help! My payouts have been failing for 3 days.",
"model": "jev-latest",
"questions": {
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
}
}
Response body
One answer per question, returned under the same ids you provided.
{
"model": "jev-latest",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.92
}
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}
Answer types
Every answer carries a type matching its question. Choice and Score answers also carry a confidence between 0 to 1, derived from the answer's probability distribution. See Confidence.
Noul answer
{
"model": "jev-latest",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.92
}
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}
Choice answer
{
"model": "jev-latest",
"answers": {
"department": {
"type": "choice",
"choice": "technical",
"probabilities": { "billing": 0.08, "technical": 0.85, "sales": 0.07 },
"confidence": 0.82
}
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}
Score answer
{
"model": "jev-latest",
"answers": {
"frustration": {
"type": "score",
"score": 1.6,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.05, "1": 0.3, "2": 0.65 },
"confidence": 0.78
}
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}
Errors
Errors use standard HTTP status codes with a JSON body describing what went wrong.
| Status | Meaning |
|---|---|
401 Unauthorized |
Missing or invalid API key. Check the Authorization header. |
422 Unprocessable Entity |
The request body failed validation — for example a missing required field or a malformed question. The body details the offending field. |
429 Too Many Requests |
You have exceeded your rate limit. Back off and retry after a short delay. |
529 Overloaded |
TypeSafe is temporarily overloaded. Retry after a short delay. |
Handling rate limits
When you receive a 429 Too Many Requests or 529 Overloaded response, retry the request with exponential backoff instead of retrying immediately. Our client SDKs handle this automatically, so no extra handling is needed if you use one of our SDKs with its default retry policy.