Deploy#
Open the version in Fine-tuning and choose Deploy. It shows deploying and then deployed, from which moment its names answer requests; if it shows deploy failed, deploy it again. Up to 3 versions can be deployed at once in a workspace. Undeploy stops a version: from that moment its names are unknown to the API.
The name#
<base>@<workspace>/<name>[:<version>]| Part | Rule | Example |
|---|---|---|
<base> | The pinned id of the model it was trained from | decisionnode-1.0-flash |
<workspace> | Your workspace's slug, as the console shows it | acme |
<name> | The model's name, 3 to 40 of a-z, 0-9 and - | fraud |
:<version> | Optional: one version. Without it, the version deployed most recently | :3 |
- Send the plain name (
decisionnode-1.0-flash@acme/) to follow your deployments: when you deploy version 4, the same name answers from it.fraud - Send a pinned name (
decisionnode-1.0-flash@acme/) where answers must not change: it answers from that version as long as it is deployed.fraud:3 - Log the response's
model. It is always the pinned name, also in thex-decisionnode-modelheader, so you know which version decided.
Call it#
curl https://api.decisionnode.com/v1/decide \
-H "Authorization: Bearer $DECISIONNODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "decisionnode-1.0-flash@acme/fraud",
"state": {
"claim": {
"merchant": "Taxi Stockholm",
"total": "512.40",
"currency": "SEK",
"receipt_total": "312.40",
"prior_claims_90d": 1
}
},
"questions": {
"fraud": {
"type": "truth",
"instructions": "Is this claim fraudulent?"
},
"route": {
"type": "choice",
"instructions": "What should happen to this claim?",
"criteria": {
"pay": "pay the claim in full",
"partial": "pay only the part the receipt documents",
"decline": "refuse the claim"
}
},
"risk": {
"type": "score",
"instructions": "How risky is this claim?",
"criteria": ["none", "low", "medium", "high"]
}
}
}'{
"model": "decisionnode-1.0-flash@acme/fraud:3",
"answers": {
"fraud": { "type": "truth", "truth": 0.08 },
"route": {
"type": "choice",
"choice": "partial",
"confidence": 0.86,
"probabilities": { "decline": 0.04, "partial": 0.91, "pay": 0.05 }
},
"risk": {
"type": "score",
"score": 1.83,
"confidence": 0.71,
"legend": { "0": "none", "1": "low", "2": "medium", "3": "high" },
"probabilities": { "0": 0.02, "1": 0.2, "2": 0.71, "3": 0.07 }
}
},
"usage": { "input_tokens": 118, "output_tokens": 0 }
}The request is any request the base takes: the same questions, images, videos and boosters. Ask the questions the model was trained on, in the same words, for the gain the gate measured; other questions are answered too, without the gate's measure behind them.
List your models#
GET /v1/models lists your workspace's fine-tuned models beside ours, for your workspace's keys only: the plain name of every model with a deployed version, and every deployed or ready version under its pinned name. Only deployed entries answer.
{
"models": [
{
"name": "decisionnode-1.0-flash@acme/fraud",
"description": "Claims fraud, trained on 2,400 decisions",
"release_date": "2026-10-09",
"version": "decisionnode-1.0-flash@acme/fraud:3",
"fine_tuned": true,
"base": "decisionnode-1.0-flash",
"adapter_version": 3,
"status": "deployed"
},
{
"name": "decisionnode-1.0-flash@acme/fraud:3",
"description": "Claims fraud, trained on 2,400 decisions",
"release_date": "2026-10-09",
"version": "decisionnode-1.0-flash@acme/fraud:3",
"fine_tuned": true,
"base": "decisionnode-1.0-flash",
"adapter_version": 3,
"status": "deployed"
},
{
"name": "decisionnode-1.0-flash@acme/fraud:4",
"description": "Claims fraud, trained on 2,400 decisions",
"release_date": "2026-10-09",
"version": "decisionnode-1.0-flash@acme/fraud:4",
"fine_tuned": true,
"base": "decisionnode-1.0-flash",
"adapter_version": 4,
"status": "ready"
}
]
}The fields of a fine-tuned entry
fine_tunedbooleantrue. Our own models' entries do not carry it.basestring- The base's pinned id.
adapter_versioninteger- The version number; on a plain name, the version it answers from.
statusstringdeployed, orready: trained and passed the gate, but not deployed, so its name is refused.versionstring- As on every entry: the pinned name this entry answers from.
Errors#
| Status | Type | When |
|---|---|---|
400 | api_usage_error | Unknown model: <name>: a name that does not exist, a version that is not deployed (a ready one included), or another workspace's model. The answer is the same in every case and never says whether a name exists elsewhere |
529 | overloaded_error | The model has no ready capacity, typically on its first request after a quiet spell: wait Retry-After, then retry. It never falls back to another model |
| Any other | As on the base | A fine-tuned model answers every other error exactly as its base does; see Errors |
When it has no ready capacity#
A fine-tuned model that has not been called for a while can take a few minutes to become ready again. Until it is, its requests answer 529 overloaded_error with Retry-After: wait that long and retry, as you would any 529 (the SDKs do it for you). A fine-tuned model never falls back to its base or to DecisionNode-1.0 Flash: you asked for your own model, so nothing else answers in its place, and the fallback field has no effect on it.
- Expect it after a quiet spell, not under steady traffic: a model that keeps receiving requests stays ready.
- Retry from a queue, not inline, where a decision can wait a few minutes; for one that cannot, decide with the base model meanwhile and log which model answered.
Price#
A request to a fine-tuned model costs its base's price per input token plus $0.02 per million input tokens: $0.062 on DecisionNode-1.0 and $0.055 on DecisionNode-1.0 Flash at the proposed base prices. Output stays free. Usage shows each fine-tuned model under its pinned name. See Limits and pricing.