By default the router tries our listings in routing order and fails over before the first byte — never mid-answer. Prices are each provider's own list price; you pay $0.03 in / $0.00 out per 1M, whichever runs the request. Uptime is our own measurement; an hour stays grey until it has a sample. Open the row for the provider's specs and policies.
curl https://api.routerplus.com/v1/decisions \
-H "Authorization: Bearer $TM_API_KEY" -H "content-type: application/json" \
-d '{"model":"fastino/gliner-2.5-decide",
"state":"Help! My payouts have been failing for 3 days.",
"schema":{"classifications":[
{"task":"Which team should handle this?",
"labels":["billing: Payments and refunds","technical: Bugs and outages"]},
{"task":"Is this urgent?","labels":["yes","no"]}]}}'
# answers["Which team should handle this?"].label and .confidence, answers["Is this urgent?"].labelimport os, httpx r = httpx.post("https://api.routerplus.com/v1/decisions", headers={"Authorization": f"Bearer {os.environ['TM_API_KEY']}"}, json={"model": "fastino/gliner-2.5-decide", "state": "Help! My payouts have been failing for 3 days.", "schema": {"classifications": [{"task": "Is this urgent?", "labels": ["yes", "no"]}]}}) r.json()["answers"]["Is this urgent?"] # {"label": "yes" | "no", "confidence": 0–1}
const r = await fetch("https://api.routerplus.com/v1/decisions", { method: "POST", headers: { authorization: `Bearer ${process.env.TM_API_KEY}`, "content-type": "application/json" }, body: JSON.stringify({ model: "fastino/gliner-2.5-decide", state: "Help! My payouts have been failing for 3 days.", schema: { classifications: [{ task: "Is this urgent?", labels: ["yes", "no"] }] } }), }); const { answers } = await r.json(); // answers["Is this urgent?"]: { label: "yes" | "no", confidence: 0–1 }
| prompt | $0.03 |
| completion | $0 |
Every billed response carries usage.cost — recompute your bill from the wire.
An hour counts at the best provider's uptime: a request goes to another provider when one fails. Grey hours have no sample yet.