Developers
Decision API
Version 1, 11 October 2026
CheckingAsking api.launchables.ai
Send a situation and one or more typed questions. Myles answers each question with a decision and a calibrated probability for every option, so you choose the confidence at which a decision is automated and route the rest to a person.
The API runs on infrastructure you control, or on a dedicated endpoint we host for your pilot. Requests go to https://api.launchables.ai. API tokens are issued with pilot access: request access.
Quick start
One request, one yes or no decision:
curl https://api.launchables.ai/v1/decide \
-H "Authorization: Bearer $LAUNCHABLES_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"state": "Customer bought the item 12 days ago and has no receipt. Policy: refunds within 30 days with proof of purchase.",
"questions": {
"refund": {
"type": "noul",
"instructions": "Is a refund permitted under the policy?"
}
}
}'{
"model": "myles-g-12b",
"answers": {
"refund": { "type": "noul", "noul": 0.04 }
},
"usage": { "input_tokens": 96, "output_tokens": 1 }
}noul is the probability that the answer is yes. Here, 0.04: a refund is very unlikely to be permitted.
Authentication
Every request to /v1/decide carries your API token as a bearer token: Authorization: Bearer YOUR_TOKEN. Tokens start with launchables_ and are issued to each tester or team by Launchables. A missing, wrong, expired or revoked token returns 401. Keep tokens on your servers; never put them in a browser or an app.
Each token has its own limits: requests per minute and requests per day, set when it is issued. Going over either returns 429; wait and retry. Ask us if you need higher limits for a test.
Endpoints
| Method and path | What it does |
|---|---|
| POST /v1/decide | Answer one or more questions about one situation. |
| GET /v1/models | The model this endpoint serves. |
| GET /health | Returns {"status": "ok"} when the endpoint is up. No key needed. |
For compatibility with existing decision-model clients, POST /v1/systemone accepts the same request and returns the same response.
The request
| Field | Type | Meaning |
|---|---|---|
state | text or JSON | The situation to decide about: a message, a record, a policy and a case. JSON is passed to the model as indented JSON. |
questions | object | One or more questions, each under a name you choose. Each answer comes back under the same name. |
model | text, optional | Ignored when an endpoint serves one model. |
Each question is read separately, in parallel, against the same state.
Question types
noul: yes or no
Optional criteria describe what each answer means. The response gives noul, the probability of yes.
"eligible": {
"type": "noul",
"instructions": "Does the applicant meet the residency rule?",
"criteria": {
"true": "Lived in the UK for at least 3 of the last 5 years",
"false": "Residency not shown, or under 3 years"
}
}choice: one of several labels
criteria maps each label to a short description (or is a list of labels). The response gives the chosen label and a probability for every label. Up to 26 labels per question.
"route": {
"type": "choice",
"instructions": "Which team should handle this message?",
"criteria": {
"billing": "Payments, invoices and refunds",
"returns": "Returning or exchanging an item",
"technical": "The product does not work",
"other": "Anything else"
}
}"route": {
"type": "choice",
"choice": "returns",
"probabilities": { "billing": 0.06, "returns": 0.89, "technical": 0.01, "other": 0.04 }
}score: a level on an ordered scale
criteria is a list of level descriptions, lowest first; levels are numbered from 0. The response gives the most likely level, the probability-weighted score and a probability for every level.
"priority": {
"type": "score",
"instructions": "How urgent is this complaint?",
"criteria": ["Routine", "Needs a reply this week", "Needs a reply today", "Safety risk, act now"]
}"priority": {
"type": "score",
"score": 1.92,
"level": 2,
"probabilities": { "0": 0.03, "1": 0.12, "2": 0.75, "3": 0.10 }
}Several questions at once
curl https://api.launchables.ai/v1/decide \
-H "Authorization: Bearer $LAUNCHABLES_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"state": {"from": "J. Smith", "message": "Charged twice for order 4471, need the extra payment back"},
"questions": {
"route": {"type": "choice", "instructions": "Which team?", "criteria": ["billing", "returns", "technical", "other"]},
"refund": {"type": "noul", "instructions": "Is the customer asking for money back?"},
"priority": {"type": "score", "instructions": "How urgent?", "criteria": ["Routine", "This week", "Today"]}
}
}'From Python
import os, requests
def decide(state, questions, endpoint="https://api.launchables.ai"):
response = requests.post(
f"{endpoint}/v1/decide",
headers={"Authorization": f"Bearer {os.environ['LAUNCHABLES_API_TOKEN']}"},
json={"state": state, "questions": questions},
timeout=30,
)
response.raise_for_status()
return response.json()["answers"]
answers = decide(
"Customer bought the item 12 days ago and has no receipt.",
{"refund": {"type": "noul", "instructions": "Is a refund permitted?"}},
)
if answers["refund"]["noul"] >= 0.9:
print("approve")
elif answers["refund"]["noul"] <= 0.1:
print("decline")
else:
print("send to a person")Using the probabilities
Pick a threshold per decision on your own held-out cases: automate above it, send the rest to a person. A higher threshold automates fewer cases with fewer errors. We help pilot partners set and certify these thresholds against their own data.
Errors
| Status | Meaning |
|---|---|
400 | The body is not JSON. |
401 | Missing, wrong, expired or revoked API token. |
404 | Unknown path. |
411 | No Content-Length header. |
413 | Body over 2 MB, or a state over 200,000 characters. |
422 | A question cannot be answered: unknown type, missing criteria for a choice or score, more than 26 options, more than 16 questions in one request, or a state and question longer than the model's context window (16,384 tokens). |
429 | Over your token's per-minute or daily limit. Wait and retry. |
502 | The model behind the endpoint did not respond. Retry with backoff. |
503 | The API is switched off for testing or maintenance. Try again later. |
Every error comes back as JSON with one field:
{ "error": "what went wrong" }Privacy
The endpoint does not store states, questions or answers. Its access log records only the method, the path, the status and the time taken.
Limits
- Up to 26 options or levels per question.
- Up to 16 questions and 1 MB per request; a state up to 60,000 characters.
- Typical time per question: tens of milliseconds on one GPU. Questions in one request run in parallel.