Skip to content
DecisionNodeDecisionNdedocs
  • Guides
  • API reference
  • Examples
  • Playground

start here

  • QuickstartGet startedGet an API key, send one request with three questions, and branch your code on the typed answers. Plain HTTPS, no SDK to install.
  • POST /v1/decideAPI referenceAnswer typed questions about a state, optional images and video frames. One request, one buffered JSON response, one answer per question.
  • QuestionsConceptsQuestions say what to decide. Each one has a type that fixes the shape of its answer: a choice from your options, a score on your scale, a…
  • ConfidenceConceptsProbabilities are calibrated per question type, so a threshold means what it says on the data we measure.
  • ImagesConceptsSend up to 16 images and text in the same request. The model reads printed and handwritten text, amounts, dates, objects and layout, and…
  • Batch jobsPatternsSend up to 10,000 requests in one file and collect the answers later, at a lower price than live calls.
  • Pricing and billingYou pay for input tokens only. Output is free because the model generates no text.
↑↓ moveopen7 suggestions
Get API keyGet API key
DecisionNodeDecisionNde

Get started

  • Introduction
  • Quickstart
  • Playground
  • Console and keys
  • With coding agents
  • MCP server
  • Examples

Concepts

  • State
  • Questions
  • Choice
  • Score
  • Truth
  • Number
  • Points and boxes
  • Images
  • Video
  • Boosters
  • Confidence
  • Determinism

Models

  • DecisionNode-1.0
  • DecisionNode-1.0 Flash
  • Limits
  • Versions
  • Dedicated capacity

Fine-tuning

  • Overview
  • Prepare your dataset
  • Upload and validation
  • Start a training run
  • Watch a run
  • The quality gate
  • Use your model
  • Limits and pricing

Patterns

  • Confidence-gated routing
  • Fan-out
  • Guardrails
  • Control loops
  • Batch jobs

API reference

  • Overview
  • POST/v1/decide
  • GET/v1/models
  • POST/v1/uploads
  • Errors
  • Safety check
  • Rate limits

Sessions API

  • Sessions overview
  • POSTOpen a session
  • WSStream frames
  • DELEnd a session

Batch API

  • The batch object
  • POSTCreate a batch
  • POSTAdd requests
  • POSTFinalize a batch
  • GETRetrieve a batch
  • GETGet batch results
  • POSTCancel a batch
  • GETList batches

Pricing and billing

  • Pricing and billing
  • Refer & earn

Policies

  • Responsible use
  • Data and privacy
  • Benchmarks
  • Pricing
  • Playground
Get API key
  • Guides
  • API reference
  • Examples
  • Playground

Get started

  • Introduction
  • Quickstart
  • Playground
  • Console and keys
  • With coding agents
  • MCP server
  • Examples

Concepts

  • State
  • Questions
  • Choice
  • Score
  • Truth
  • Number
  • Points and boxes
  • Images
  • Video
  • Boosters
  • Confidence
  • Determinism

Models

  • DecisionNode-1.0
  • DecisionNode-1.0 Flash
  • Limits
  • Versions
  • Dedicated capacity

Fine-tuning

  • Overview
  • Prepare your dataset
  • Upload and validation
  • Start a training run
  • Watch a run
  • The quality gate
  • Use your model
  • Limits and pricing

Patterns

  • Confidence-gated routing
  • Fan-out
  • Guardrails
  • Control loops
  • Batch jobs

API reference

  • Overview
  • POST/v1/decide
  • GET/v1/models
  • POST/v1/uploads
  • Errors
  • Safety check
  • Rate limits

Sessions API

  • Sessions overview
  • POSTOpen a session
  • WSStream frames
  • DELEnd a session

Batch API

  • The batch object
  • POSTCreate a batch
  • POSTAdd requests
  • POSTFinalize a batch
  • GETRetrieve a batch
  • GETGet batch results
  • POSTCancel a batch
  • GETList batches

Pricing and billing

  • Pricing and billing
  • Refer & earn

Policies

  • Responsible use
  • Data and privacy
  1. docs
  2. /
  3. Get started

Use your fine-tuned model

Deploy a ready version in the console, then send its name as model on /v1/decide: decisionnode-1.0-flash@acme/fraud for the version deployed most recently, decisionnode-1.0-flash@acme/fraud:3 for one version. The response's model always names the version that answered.

on this page7 sections
  1. Deploy
  2. The name
  3. Call it
  4. List your models
  5. Errors
  6. When it has no ready capacity
  7. Price

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#

Grammar
<base>@<workspace>/<name>[:<version>]
  • <base>

    Rule
    The pinned id of the model it was trained from
    Example
    decisionnode-1.0-flash
  • <workspace>

    Rule
    Your workspace's slug, as the console shows it
    Example
    acme
  • <name>

    Rule
    The model's name, 3 to 40 of a-z, 0-9 and -
    Example
    fraud
  • :<version>

    Rule
    Optional: one version. Without it, the version deployed most recently
    Example
    :3
The parts of a fine-tuned model's name
PartRuleExample
<base>The pinned id of the model it was trained fromdecisionnode-1.0-flash
<workspace>Your workspace's slug, as the console shows itacme
<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/fraud) to follow your deployments: when you deploy version 4, the same name answers from it.
  • Send a pinned name (decisionnode-1.0-flash@acme/fraud:3) where answers must not change: it answers from that version as long as it is deployed.
  • Log the response's model. It is always the pinned name, also in the x-decisionnode-model header, 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"]
      }
    }
  }'
Response
{
  "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.

JSON
{
  "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_tunedboolean
true. 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.
statusstring
deployed, or ready: 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#

  • 400

    Type
    api_usage_error
    When
    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

    Type
    overloaded_error
    When
    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

    Type
    As on the base
    When
    A fine-tuned model answers every other error exactly as its base does; see Errors
What a fine-tuned name can get back
StatusTypeWhen
400api_usage_errorUnknown 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
529overloaded_errorThe 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 otherAs on the baseA 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.

  • Limits and pricingWhat a run and a request cost, and every limit.Read
  • GET /v1/modelsEvery field of the model list.Read
nextIntroduction

DecisionNode is built and run by Bynn Intelligence, Inc.

  • Home
  • Playground
  • Examples
  • Console
  • Responsible use
  • Terms
  • Acceptable use
  • Privacy
  • Data processing
  • Defence addendum
  • Cookies
  • Affiliate program

on this page

  1. Deploy
  2. The name
  3. Call it
  4. List your models
  5. Errors
  6. When it has no ready capacity
  7. Price