Skip to main content
POST
Set what a decision optimizes for

Authorizations

Authorization
string
header
required

An API key, sent as Authorization: Bearer <key>. Each operation lists the scope its key needs: decisions:evaluate (evaluate and read evaluations), decisions:feedback (your app's feedback) or decisions:develop (everything else, including owner feedback and the review queue). An operation listing no scope takes any scoped key. A key with no scope, or without the operation's, gets 403 INSUFFICIENT_SCOPE.

Headers

idempotency-key
string

Makes a retry safe. For 24 hours, the same key with the same request returns the first stored result (with Idempotent-Replayed: true); the same key with a different request is a 422 IDEMPOTENCY_KEY_REUSED. Keys are scoped to the organization and environment across every operation, so use a fresh key per request. A request that failed before its result was stored runs again when retried with its key.

Required string length: 1 - 255
Pattern: ^[\x20-\x7e]+$

Path Parameters

decision_id
string
required
Pattern: ^[a-z][a-z0-9_.-]{0,127}$

Body

application/json
objective
object | null
required

The decision file's objective, as written there. Null clears it, back to balanced losses.

Response

Unchanged: the body matches the current revision

decision_id
string
required
Pattern: ^[a-z][a-z0-9_.-]{0,127}$
environment
enum<string>
required

The environment of the key that made the call: production or test. Evaluations, feedback, reviews and suggestions are separate per environment; registered structures are shared.

Available options:
production,
test
revision
integer | null
required

The objective revision. Null when none was ever set here, which means balanced losses.

Required range: x >= 1
objective
object | null
required

The stored objective. Null means balanced losses: each outcome's mistakes weigh the same in total.

objective_hash
string | null
required

The objective's hash, as loop status and previews report it. Null with objective. Compare it with the decision file's to see drift.

unknown_outcomes
string[]
required

Outcomes the objective names that the decision's most recently registered structure can't produce. Their entries will be left out of scoring; check for a typo or a renamed outcome. Empty when that structure's result is a value, with no outcomes to check against.

created_at
string<date-time> | null
required
created
boolean
required

False when the body matched the current revision, so nothing was written.