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 pathWhat it does
POST /v1/decideAnswer one or more questions about one situation.
GET /v1/modelsThe model this endpoint serves.
GET /healthReturns {"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

FieldTypeMeaning
statetext or JSONThe situation to decide about: a message, a record, a policy and a case. JSON is passed to the model as indented JSON.
questionsobjectOne or more questions, each under a name you choose. Each answer comes back under the same name.
modeltext, optionalIgnored 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

StatusMeaning
400The body is not JSON.
401Missing, wrong, expired or revoked API token.
404Unknown path.
411No Content-Length header.
413Body over 2 MB, or a state over 200,000 characters.
422A 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).
429Over your token's per-minute or daily limit. Wait and retry.
502The model behind the endpoint did not respond. Retry with backoff.
503The 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