Skip to main content
A decision is a durable request for a human ruling: an agent or integration raises it, a person approves or declines it, and the resolution is recorded with lifecycle history. The REST surface deliberately splits authority: any API key can raise and read decisions; only a signed-in human can resolve one. Endpoints that would let an automated caller assert a human ruling return 403 direct_human_decision_action_required.
The dedicated /api/v1/decisions resource is canonical. The older decision record on /api/entities remains a compatibility read and write for older clients.

Create — POST /api/v1/decisions

Accepts Authorization: Bearer oxk_... or a web-app session. Every create requires an Idempotency-Key. Reuse the same key and body to get the original decision with 200; reuse it with a different body returns 409 idempotency_key_conflict.

shape_context is required in practice

shape defaults to generic and shape_context defaults to {}, but {} satisfies no shape. A body of only workspace_id and title therefore fails with 400 invalid_shape_context. Send the context its shape requires: Every shape also accepts an optional estimate. Note the distinction: the top-level description field is optional and is stored as the decision summary; shape_context.description is the required body of a generic decision. The smallest request that succeeds:
An option decision, with the two-option minimum:
Returns 201 with { "decision": { ... } } — keep decision.id. An idempotent replay returns the same shape with 200. This endpoint returns a bare named object, not the { data, meta } envelope.

Read — GET /api/v1/decisions

Query parameters: workspace_id (required), shape, urgency, status, limit (default 50, max 200). Returns { "decisions": [ ... ] }. The compatibility read GET /api/entities?type=decision remains available for older clients and supports its generic filters (status, initiative_id, search, ids).

Lifecycle

status values: pending, approved, declined, superseded, cancelled. The write aliases acceptedapproved and rejecteddeclined are normalized. All transitions start from pending. Resolution is human-only by design. The paths that record a ruling — PATCH /api/v1/decisions/{id} (resolutions approved, adjusted, archived, with option selection for option shapes) and the decision lifecycle actions — reject oxk_ credentials with 403. A person resolves decisions in Mission Control, or through an MCP client where orgx_decide runs under their authenticated session. Editing an existing decision is narrower still: proposal-field updates are available through the MCP orgx_write path while the decision is pending. A personal oxk_ key receives 403 even for proposal fields. Only proposal fields (title, summary, description, priority, due_at, recommended_action, blocks_task, estimate, urgency, urgency_score) are editable, and only while the decision is still pending (409 otherwise). With an API key, get the decision right at creation time.

All operations on this resource

Where the IDs come from

MCP equivalents

orgx_decide covers the full loop: create and list use the decision resource; approve and reject run under the signed-in user’s authority. orgx_search with type=decision reads the same records this page describes.