[ OPEN ] $5 FREE CREDITDECISION RUNS, V1 API
Ask a question.Get a probabilityfor every answer.
Send the thing being decided about and typed questions: yes/no, one of up to 20 options, or an ordered score. Neon 1.1 reads each answer from a closed label set and returns a probability you can threshold.
export OPENTYPE_API_KEY="otsk_..."
curl https://api.opentype.dev/v1/runs \
-H "Authorization: Bearer $OPENTYPE_API_KEY" \
-H "Idempotency-Key: ticket-40318" \
-H "Content-Type: application/json" \
-d '{
"kind": "decision",
"state": {"subject": "Card declined twice on renewal", "invoice": "INV-40318"},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {"type": "noul", "instructions": "Does this need a reply within an hour?"},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {"billing": "charges, refunds", "access": null, "outage": null, "other": null}
}
},
"max_output_tokens": 64
}'export OPENTYPE_API_KEY="otsk_..."
curl https://api.opentype.dev/v1/runs \
-H "Authorization: Bearer $OPENTYPE_API_KEY" \
-H "Idempotency-Key: ticket-40318" \
-H "Content-Type: application/json" \
-d '{
"kind": "decision",
"state": {
"subject": "Card declined twice on renewal",
"invoice": "INV-40318"
},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {
"type": "noul",
"instructions": "Does this need a reply within an hour?"
},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {
"billing": "charges, refunds",
"access": null,
"outage": null,
"other": null
}
}
},
"max_output_tokens": 64
}'const res = await fetch("https://api.opentype.dev/v1/runs", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENTYPE_API_KEY}`,
"Idempotency-Key": "ticket-40318",
"Content-Type": "application/json",
},
body: JSON.stringify({
"kind": "decision",
"state": {"subject": "Card declined twice on renewal", "invoice": "INV-40318"},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {"type": "noul", "instructions": "Does this need a reply within an hour?"},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {"billing": "charges, refunds", "access": null, "outage": null, "other": null}
}
},
"max_output_tokens": 64
}),
});
const run = await res.json();
if (!res.ok) throw new Error(`${run.error.code} (${run.error.request_id})`);
console.log(run.decision.answers.urgent.probability);const res = await fetch("https://api.opentype.dev/v1/runs", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENTYPE_API_KEY}`,
"Idempotency-Key": "ticket-40318",
"Content-Type": "application/json",
},
body: JSON.stringify({
"kind": "decision",
"state": {
"subject": "Card declined twice on renewal",
"invoice": "INV-40318"
},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {
"type": "noul",
"instructions": "Does this need a reply within an hour?"
},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {
"billing": "charges, refunds",
"access": null,
"outage": null,
"other": null
}
}
},
"max_output_tokens": 64
}),
});
const run = await res.json();
if (!res.ok) throw new Error(`${run.error.code} (${run.error.request_id})`);
console.log(run.decision.answers.urgent.probability);import os, requests
res = requests.post(
"https://api.opentype.dev/v1/runs",
headers={
"Authorization": f"Bearer {os.environ['OPENTYPE_API_KEY']}",
"Idempotency-Key": "ticket-40318",
},
json={
"kind": "decision",
"state": {"subject": "Card declined twice on renewal", "invoice": "INV-40318"},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {"type": "noul", "instructions": "Does this need a reply within an hour?"},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {"billing": "charges, refunds", "access": None, "outage": None, "other": None}
}
},
"max_output_tokens": 64
},
timeout=130,
)
run = res.json()
if not res.ok:
raise RuntimeError(f"{run['error']['code']} ({run['error']['request_id']})")
print(run["decision"]["answers"]["urgent"]["probability"])import os, requests
res = requests.post(
"https://api.opentype.dev/v1/runs",
headers={
"Authorization": f"Bearer {os.environ['OPENTYPE_API_KEY']}",
"Idempotency-Key": "ticket-40318",
},
json={
"kind": "decision",
"state": {
"subject": "Card declined twice on renewal",
"invoice": "INV-40318"
},
"instructions": "You triage billing support tickets.",
"questions": {
"urgent": {
"type": "noul",
"instructions": "Does this need a reply within an hour?"
},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {
"billing": "charges, refunds",
"access": None,
"outage": None,
"other": None
}
}
},
"max_output_tokens": 64
},
timeout=130,
)
run = res.json()
if not res.ok:
raise RuntimeError(f"{run['error']['code']} ({run['error']['request_id']})")
print(run["decision"]["answers"]["urgent"]["probability"])01 / How a run works
One request, one routed read, one probability per answer.
Nothing is spent until the questions pass admission and your credits cover the run. The router picks a healthy, decision-capable route; if none exists you get a 503 and no charge. A decision makes one call, with no repair.
02 / What comes back
The probabilities are the response. There is no prose to parse.
Every answer comes from the label set you defined. A completed run names the model that answered, what it read from, and, once settled, what it cost.
{
"urgent": {
"type": "noul",
"instructions": "Does this need a reply within an hour?"
},
"queue": {
"type": "choice",
"instructions": "Which queue owns this ticket?",
"criteria": {
"billing": "charges, refunds",
"access": null,
"outage": null,
"other": null
}
}
}your labels are the answer set
{
"run_id": "run_0f3a9c2e7b1d4e8fa5c6d7e8f9a0b1c2",
"kind": "decision",
"state": "completed",
"input_digest": "9f2c41d0...",
"output_digest": "41ab77e2...",
"decision": {
"answers": {
"urgent": {
"type": "noul",
"probability": 0.83,
"label_mass": 0.991,
"answered_within_labels": true
},
"queue": {
"type": "choice",
"choice": "billing",
"probabilities": {
"billing": 0.71,
"access": 0.06,
"outage": 0.14,
"other": 0.09
},
"confidence": 0.71,
"label_mass": 0.964,
"answered_within_labels": true
}
},
"draws": 1,
"read": "slot_constrained",
"model": "neon-1.1",
"stages": [["queue", "urgent"]]
},
"usage": {
"input_tokens": 412,
"output_tokens": 23
},
"cost_micros": 19,
"cost_basis": "provider_reported",
"replayed": false
}probabilities range-checked
{
"error": {
"code": "insufficient_credits",
"message": "the organization's credit balance ...",
"request_id": "req_7c01b3e4..."
}
}refused before any call, free
03 / Where it runs
You never pick the model.
The router does.
| Family | Provider | Run kind | Where | Status |
|---|---|---|---|---|
| Neon 1.1 | opentype | decision | OpenType | in catalog |
| OpenAI | open_ai | verdict | external | adapter, no route |
| Anthropic | anthropic | verdict | external | adapter, no route |
| GLM | glm | verdict | external | adapter, no route |
| DeepSeek | deep_seek | verdict | external | adapter, no route |
04 / Pricing
Prepaid credits. $5 on us to start.
Every new account gets $5 of credit, once per verified email address. Top up $5 to $1,000 in the console. Each run is charged its settled cost_micros; refusals before the model call are free.
Free credit
$5on sign-up
Granted once per verified email address.
- open sign-up for everyone
- API keys with scopes
- decision runs on Neon 1.1
- usage, ledger and quota
Neon 1.1
$0.042/ 1M tokens
42,000 micro-USD per million input and per million output tokens, as of 2026-09-24.
- charged the settled cost_micros
- cost_basis says reported or estimated
- a replayed key is never charged twice
- 402 insufficient_credits, never a debt
Top-ups
$5-$1,000
Paid by card through Stripe, credited when Stripe confirms.
- prepaid, no subscription
- optional auto-recharge
- invoices in the Stripe portal
- credited exactly once per payment
05 / Questions
Asked before the first run.
Neon 1.1 is priced at 42,000 micro-USD per million input tokens and the same per million output tokens ($0.042 per 1M), as of 2026-09-24.
A run is charged its settled cost_micros. The sample on this page, 412 tokens in and 23 out, settles at 19 micro-USD.
The run is refused with 402 insufficient_credits before any model call. Nothing is created, reserved or charged. Top up in the console, then retry with the same Idempotency-Key.
Yes, optionally. A request may set "model": "neon-1.1" or "neon-latest". Omit it and OpenType routes the run for you.
Every decision response reports decision.model as "neon-1.1", so a probability can be traced back to the model that answered.
The API accepts verdict runs (messages plus a JSON Schema), and adapters for OpenAI, Anthropic, GLM and DeepSeek are built. No verdict route is in the catalog yet, so a verdict run returns 503 no_route_available today, and nothing is charged.
No. A run stores hex SHA-256 digests of the normalized input and of the answer, plus usage and cost. The input text itself is not stored.
Not yet. No service level agreement is published, and no latency figure is promised.
Ask a typed question.
Threshold the answer.
Sign-up is open to everyone. Every new account starts with $5 of credit, and you top up only when you need more.