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 and optional images. 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.
  • ImagesConceptsSend images and text in the same request. The model reads printed and handwritten text, amounts, dates, objects and layout, and answers…
  • Batch jobsPatternsSend up to 10,000 requests in one file and collect the answers later, at half the live price.
  • 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
  • Examples

Concepts

  • State
  • Questions
  • Choice
  • Score
  • Truth
  • Number
  • Images
  • Confidence
  • Determinism

Models

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

Patterns

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

API reference

  • Overview
  • POST/v1/decide
  • GET/v1/models
  • 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

Policies

  • Responsible use
  • Data and privacy

Migrate

  • Coming from a Jev-shaped API
  • Benchmarks
  • Pricing
  • Playground
Get API key
  • Guides
  • API reference
  • Examples
  • Playground

Get started

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

Concepts

  • State
  • Questions
  • Choice
  • Score
  • Truth
  • Number
  • Images
  • Confidence
  • Determinism

Models

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

Patterns

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

API reference

  • Overview
  • POST/v1/decide
  • GET/v1/models
  • 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

Policies

  • Responsible use
  • Data and privacy

Migrate

  • Coming from a Jev-shaped API
  1. docs
  2. /
  3. Batch API

Create a batch

Upload requests as JSON Lines or a JSON array and get a batch in state draft. Nothing runs until you finalize it.

on this page6 sections
  1. Authentication
  2. Request body
  3. Response
  4. Errors
  5. Limits
  6. Notes
POSThttps://api.decisionnode.com/v1/batches
API=https://api.decisionnode.com/v1

curl "$API/batches" \
  -H "Authorization: Bearer $DECISIONNODE_API_KEY" \
  -H "Content-Type: application/x-ndjson" \
  --data-binary @tickets.jsonl

Authentication#

Authorizationheaderrequired
Bearer dn_live_..., the same key as every call. A batch belongs to the key that created it: other keys, even in the same workspace, get 404 for it.
Content-Typeheaderrequired
application/x-ndjson for JSON Lines, application/json for an array. The API also reads the first byte: [ opens an array, { a line.

Request body#

JSON Lines, one request per line, or a JSON array of the same objects. Each request is a /v1/decide body plus custom_id. An empty body or [] creates an empty draft you fill with Add requests.

{"custom_id":"ticket-48213","model":"decisionnode-latest","state":"Customer: I was charged twice and nobody has replied for 3 days.","questions":{"route":{"type":"choice","instructions":"Where should this go?","criteria":{"billing":"money","bug":"broken","account":"login"}},"refund":{"type":"truth","instructions":"Refund this automatically?"}}}
{"custom_id":"ticket-48214","model":"decisionnode-latest","state":"Customer: The app crashes every time I open the invoices tab.","questions":{"route":{"type":"choice","instructions":"Where should this go?","criteria":{"billing":"money","bug":"broken","account":"login"}},"refund":{"type":"truth","instructions":"Refund this automatically?"}}}
{"custom_id":"ticket-48215","model":"decisionnode-latest","state":"Customer: My login stopped working after I changed my email address.","questions":{"route":{"type":"choice","instructions":"Where should this go?","criteria":{"billing":"money","bug":"broken","account":"login"}},"refund":{"type":"truth","instructions":"Refund this automatically?"}}}

Each request

custom_idstringrequired
Your id for the request: 1 to 512 characters, unique in the batch. Its result line carries it back.
modelstringdefault "decisionnode-latest"
decisionnode-latest, decisionnode-flash-latest or a pinned version, and left out it is decisionnode-latest, exactly as on /v1/decide. It sets the line's price. One batch may mix models. An unknown name makes that line a failed line with the live 400; the rest of the batch runs.
statestring | object | array
The input to decide about, as on /v1/decide.
imagesarray
Images, base64 in data, as on /v1/decide. They count toward the upload size.
questionsobjectrequired
The questions, as on /v1/decide: choice, score, truth or number.

Response#

201 Created with the batch object in state draft. counters.requests counts every line; lines refused for their shape are already counted in failed.

201 Created
{
  "id": "batch_01J9ZB8Q3T",
  "state": "draft",
  "counters": {
    "requests": 3,
    "queued": 0,
    "in_progress": 0,
    "completed": 0,
    "failed": 0,
    "expired": 0,
    "cancelled": 0
  },
  "created_at": "2026-10-06T09:12:04Z",
  "finalized_at": null,
  "expires_at": null,
  "ended_at": null,
  "results_url": null,
  "results_expire_at": null,
  "price_factor": 0.5,
  "usage": { "input_tokens": 0, "output_tokens": 0 },
  "error": null
}
  1. Authentication
  2. Request body
  3. Response
  4. Errors
  5. Limits
  6. Notes
request
API=https://api.decisionnode.com/v1curl "$API/batches" \  -H "Authorization: Bearer $DECISIONNODE_API_KEY" \  -H "Content-Type: application/x-ndjson" \  --data-binary @tickets.jsonl

Errors#

  • 400

    Type
    api_usage_error
    When
    The body is neither JSON Lines nor a JSON array; a line is not a JSON object; a custom_id is missing, empty, too long or repeated; more than 10,000 requests
    What to do
    Fix the upload and send it again. Nothing was created
  • 401

    Type
    authentication_error
    When
    The key is missing, unknown or revoked
    What to do
    Check the Authorization header
  • 413

    Type
    request_too_large_error
    When
    The upload is over 256 MB
    What to do
    Split it into several batches of up to 10,000 requests
  • 429

    Type
    batch_limit_exceeded
    When
    Your key already has 10 active batches
    What to do
    Finalize or cancel a draft, or wait for a batch to end
  • 429

    Type
    batch_limit_exceeded
    When
    The call would put more than 100,000 requests in your key's active batches, drafts included
    What to do
    Wait for a batch to end, or cancel a draft you will not finalize. Nothing from the call was applied
  • 429

    Type
    rate_limit_error
    When
    Over your request rate: batch calls count against it
    What to do
    Wait Retry-After seconds, then send the same call again
  • 500

    Type
    api_error
    When
    A fault on our side
    What to do
    Retry with backoff and jitter. A 5xx can come after the call took effect: before you create again, cancel any draft the failed create left behind (see Batch errors)
  • 529

    Type
    overloaded_error
    When
    The API cannot take the call right now
    What to do
    Wait Retry-After seconds, then retry with backoff
Errors this endpoint returns
StatusTypeWhenWhat to do
400api_usage_errorThe body is neither JSON Lines nor a JSON array; a line is not a JSON object; a custom_id is missing, empty, too long or repeated; more than 10,000 requestsFix the upload and send it again. Nothing was created
401authentication_errorThe key is missing, unknown or revokedCheck the Authorization header
413request_too_large_errorThe upload is over 256 MBSplit it into several batches of up to 10,000 requests
429batch_limit_exceededYour key already has 10 active batchesFinalize or cancel a draft, or wait for a batch to end
429batch_limit_exceededThe call would put more than 100,000 requests in your key's active batches, drafts includedWait for a batch to end, or cancel a draft you will not finalize. Nothing from the call was applied
429rate_limit_errorOver your request rate: batch calls count against itWait Retry-After seconds, then send the same call again
500api_errorA fault on our sideRetry with backoff and jitter. A 5xx can come after the call took effect: before you create again, cancel any draft the failed create left behind (see Batch errors)
529overloaded_errorThe API cannot take the call right nowWait Retry-After seconds, then retry with backoff

Every error body is {"detail": {"error_type": "...", "message": "..."}}. Retry 408, 429 (rate_limit_error), 529 and any 5xx, waiting at least what Retry-After says when it is set; fix the call for the other 4xx. A 429 batch_limit_exceeded clears only when a batch ends or you cancel one. All the bodies are on Errors.

Limits#

  • Requests

    Value
    Up to 10,000
  • Upload

    Value
    256 MB, images included
  • custom_id

    Value
    1 to 512 characters, unique in the batch
  • Each request

    Value
    The live limits of /v1/decide
  • Requests in active batches per key

    Value
    100,000, drafts included, checked on this call
Limits that apply to this call
LimitValue
RequestsUp to 10,000
Upload256 MB, images included
custom_id1 to 512 characters, unique in the batch
Each requestThe live limits of /v1/decide
Requests in active batches per key100,000, drafts included, checked on this call

Notes#

  • A line the API refuses for its shape (an unknown model, a question with no options, a field of the wrong type) is accepted into the batch as a failed line with the live status and body, and never runs. The rest of the batch is unaffected.
  • Limits counted in tokens, such as the per-request token limit, are checked when the line runs: such a line comes back as the live 400.
  • A refused upload leaves nothing behind: no draft, no lines.
  • The draft counts toward your 10 active batches until you finalize or cancel it.
previousThe batch objectnextAdd requests

DecisionNode is built and run by Bynn Intelligence, Inc.

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