Make a decision
A decision in Default mode (when mode is left out) or Direct mode.
POST /api/v1/decisions. The fields, answers and errors below are rendered from the OpenAPI document.
Make a decision
POST /api/v1/decisions
One model run per stakeholder, on eevo-1 (the one model; model may be left out). mode says how: default (also when mode is left out), recommended for supporting agentic and human judgement: each option lists its consequences under consequences, and Eevo sizes them against each other and gives each option’s expected value per stakeholder. direct, for high-volume decisions and custom tasks: Eevo answers which option is best for each stakeholder in a single model call, without consequences.
Request body
application/json
Variants:
ExplicitDecisionRequest
object
model(optional)string
The one Eevo model,
eevo-1(the default when left out).- Allowed values
["eevo-1"]- Default
"eevo-1"
mode(optional)string
default(also when left out): Default mode, recommended for supporting agentic and human judgement. Each option lists its consequences; Eevo sizes them and gives each option’s expected value per stakeholder. For an answer without consequences, senddirect.- Allowed values
["default"]- Default
"default"
context(required)string
- Minimum length
1- Maximum length
20000
stakeholders(required)array
- Minimum items
1- Maximum items
8
Array items:
object
id(optional)string
- Minimum length
1- Maximum length
40- Pattern
"^[A-Za-z0-9_-]+$"
description(required)string
- Minimum length
1- Maximum length
2000
values(optional)string
- Maximum length
2000
Additional properties: not allowed.
options(required)array
- Minimum items
2- Maximum items
8
Array items:
object
id(required)string
- Allowed values
["A","B","C","D","E","F","G","H"]
description(required)string
- Minimum length
1- Maximum length
2000
consequences(required)array
- Minimum items
1- Maximum items
40
Array items:
object
id(optional)string
- Minimum length
1- Maximum length
40- Pattern
"^[A-Za-z0-9_-]+$"
description(required)string
- Minimum length
1- Maximum length
1000
label(optional)string
- Minimum length
1- Maximum length
60
stakeholders(optional)array
- Minimum items
1
Array items:
string
- Minimum length
1- Maximum length
40- Pattern
"^[A-Za-z0-9_-]+$"
valence(required)Variants:
string
- Allowed values
["benefit","harm"]
object
Additional property values:
string
- Allowed values
["benefit","harm"]
Additional properties: not allowed.
Additional properties: not allowed.
seed(optional)integer
- Minimum
0- Maximum
4294967295
async(optional)boolean
metadata(optional)object
conversation(optional)object
platform(required)string
- Allowed values
["slack","teams","google_chat","other"]
channel(optional)string
- Minimum length
1- Maximum length
200
thread_url(optional)string
- Minimum length
1- Maximum length
2000
Additional properties: not allowed.
issue(optional)object
tracker(required)string
- Allowed values
["linear","jira","github","other"]
url(required)string
- Minimum length
1- Maximum length
2000
key(optional)string
- Minimum length
1- Maximum length
100
title(optional)string
- Minimum length
1- Maximum length
300
Additional properties: not allowed.
pull_request(optional)object
platform(required)string
- Allowed values
["github","gitlab","bitbucket","azure_devops","other"]
url(required)string
- Minimum length
1- Maximum length
2000
repo(optional)string
- Minimum length
1- Maximum length
200
number(optional)integer
- Minimum
0- Exclusive minimum
true
title(optional)string
- Minimum length
1- Maximum length
300
Additional properties: not allowed.
on_behalf_of(optional)object
name(optional)string
- Minimum length
1- Maximum length
200
email(optional)string · email
- Maximum length
320
Additional properties: not allowed.
links(optional)array
- Maximum items
10
Array items:
object
url(required)string
- Minimum length
1- Maximum length
2000
label(optional)string
- Minimum length
1- Maximum length
200
Additional properties: not allowed.
Additional properties: not allowed.
revises(optional)string
- Minimum length
1- Maximum length
64
revision_note(optional)object
reason(optional)string
- Minimum length
1- Maximum length
2000
missed(required)array
- Minimum items
1- Maximum items
20
Array items:
object
kind(required)string
- Allowed values
["context","consequence","stakeholder","option","size_or_probability","other"]
description(required)string
- Minimum length
1- Maximum length
1000
Additional properties: not allowed.
Additional properties: not allowed.
share_with_org(optional)boolean
Additional properties: not allowed.
Example:
{ "model": "eevo-1", "mode": "default", "context": "Acme Corp found a data-export bug that shows some customers a wrong invoice total. A fix is ready; a log dump that would confirm it arrives in 40 minutes.", "options": [ { "id": "A", "description": "Ship the fix now.", "consequences": [ { "id": "a1", "label": "Wrong totals stop now", "description": "About 200 customers stop seeing a wrong invoice total 40 minutes sooner.", "valence": "benefit" }, { "id": "a2", "label": "Invoices to recheck", "description": "Without the log dump to confirm the fix, about 20 customers get an email asking them to recheck one invoice.", "valence": "harm" } ] }, { "id": "B", "description": "Wait for the log dump, then ship.", "consequences": [ { "id": "b1", "label": "40 more minutes of wrong totals", "description": "About 200 customers keep seeing a wrong invoice total for 40 more minutes.", "valence": "harm" } ] } ], "stakeholders": [ { "id": "customers", "description": "The affected customers", "values": "Correct invoices, no surprises." } ] }DirectDecisionRequest
object
model(optional)string
The one Eevo model,
eevo-1(the default when left out).- Allowed values
["eevo-1"]- Default
"eevo-1"
mode(required)string
direct: Direct mode, for high-volume decisions and custom tasks. Eevo answers which option is best for each stakeholder in a single model call; options carry no consequences.- Allowed values
["direct"]
context(required)string
- Minimum length
1- Maximum length
20000
options(required)array
- Minimum items
2- Maximum items
8
Array items:
object
id(required)string
- Allowed values
["A","B","C","D","E","F","G","H"]
description(required)string
- Minimum length
1- Maximum length
2000
Additional properties: not allowed.
stakeholders(required)array
- Minimum items
1- Maximum items
8
Array items:
object
id(optional)string
- Minimum length
1- Maximum length
40- Pattern
"^[A-Za-z0-9_-]+$"
description(required)string
- Minimum length
1- Maximum length
2000
values(optional)string
- Maximum length
2000
Additional properties: not allowed.
metadata(optional)object
conversation(optional)object
platform(required)string
- Allowed values
["slack","teams","google_chat","other"]
channel(optional)string
- Minimum length
1- Maximum length
200
thread_url(optional)string
- Minimum length
1- Maximum length
2000
Additional properties: not allowed.
issue(optional)object
tracker(required)string
- Allowed values
["linear","jira","github","other"]
url(required)string
- Minimum length
1- Maximum length
2000
key(optional)string
- Minimum length
1- Maximum length
100
title(optional)string
- Minimum length
1- Maximum length
300
Additional properties: not allowed.
pull_request(optional)object
platform(required)string
- Allowed values
["github","gitlab","bitbucket","azure_devops","other"]
url(required)string
- Minimum length
1- Maximum length
2000
repo(optional)string
- Minimum length
1- Maximum length
200
number(optional)integer
- Minimum
0- Exclusive minimum
true
title(optional)string
- Minimum length
1- Maximum length
300
Additional properties: not allowed.
on_behalf_of(optional)object
name(optional)string
- Minimum length
1- Maximum length
200
email(optional)string · email
- Maximum length
320
Additional properties: not allowed.
links(optional)array
- Maximum items
10
Array items:
object
url(required)string
- Minimum length
1- Maximum length
2000
label(optional)string
- Minimum length
1- Maximum length
200
Additional properties: not allowed.
Additional properties: not allowed.
revises(optional)string
- Minimum length
1- Maximum length
64
revision_note(optional)object
reason(optional)string
- Minimum length
1- Maximum length
2000
missed(required)array
- Minimum items
1- Maximum items
20
Array items:
object
kind(required)string
- Allowed values
["context","consequence","stakeholder","option","size_or_probability","other"]
description(required)string
- Minimum length
1- Maximum length
1000
Additional properties: not allowed.
Additional properties: not allowed.
share_with_org(optional)boolean
Additional properties: not allowed.
Example:
{ "model": "eevo-1", "mode": "direct", "context": "Our nightly ETL failed at 02:10. A fix is ready, but the log dump that would confirm it arrives at 03:00. Downstream dashboards refresh at 06:00.", "options": [ { "id": "A", "description": "Ship the fix now" }, { "id": "B", "description": "Wait for the log dump" } ], "stakeholders": [ { "id": "customers", "description": "The customers who read the dashboards", "values": "Correct numbers on time" }, { "id": "data-team", "description": "The data team", "values": "Reliability first; no repeated incidents" } ], "metadata": { "conversation": { "platform": "slack", "channel": "#data-team", "thread_url": "https://northwind.slack.com/archives/C04DATA/p1759561800123456" }, "issue": { "tracker": "linear", "url": "https://linear.app/northwind/issue/DATA-398", "key": "DATA-398", "title": "Nightly ETL fails on lock timeout" }, "pull_request": { "platform": "github", "url": "https://github.com/northwind/etl/pull/412", "repo": "northwind/etl", "number": 412 }, "on_behalf_of": { "name": "Maija Virtanen", "email": "maija@northwind.example" } } }
Responses
Response 200
The decision, one result per stakeholder.
application/json
Variants:
ExplicitDecisionResponse
object
id(required)string
Request id, as in the Eevo console decision log.
model(required)string
mode(required)string
- Allowed values
["default"]
overlap(required)string
- Allowed values
["correct","report","off"]
seed(required)number
results(required)array
One result per stakeholder, in request order.
Array items:
object
stakeholder(required)object
id(required)string
description(required)string
Additional properties: not allowed.
best(required)string
The option with the highest expected value for this stakeholder.
- Allowed values
["A","B","C","D","E","F","G","H"]
confidence(required)number
probabilities(required)object
P(highest EV) per option.
Additional property values:
number
ev(required)object
Expected value per option on this stakeholder's own scale, with p10-p90.
Additional property values:
object
mean(required)number
p10(required)number
p90(required)number
Additional properties: not allowed.
consequences(required)array
Array items:
object
id(required)string
Additional properties: allowed.
overlaps(required)array
Array items:
object
a(required)string
b(required)string
share(required)number
Additional properties: allowed.
Additional properties: allowed.
agreement(required)object
all_same(required)boolean
best_by_stakeholder(required)object
Additional property values:
string
- Allowed values
["A","B","C","D","E","F","G","H"]
Additional properties: not allowed.
warnings(required)array
Array items:
string
usage(required)object
input_tokens(required)number
output_tokens(required)number
ratio_records(required)number
overlap_records(required)number
Additional properties: allowed.
cost_usd(required)number
links(required)object | null
view_url(required)string
png_url(required)string
Additional properties: not allowed.
meta(required)object
Additional properties: allowed.
notes(required)string
lineage(optional)object
Where the decision sits in its revision chain: the first decision, its number (1 = first) and the one it revises.
root_id(required)string
number(required)number
previous_id(required)string | null
Additional properties: not allowed.
Additional properties: not allowed.
Example:
{ "id": "dec_7b1c0e4f9a2d4c6b8e3f5a1d2c4b6e8f", "model": "eevo-1", "mode": "default", "overlap": "correct", "seed": 20261006, "results": [ { "stakeholder": { "id": "customers", "description": "The affected customers" }, "best": "A", "confidence": 0.99, "probabilities": { "A": 0.99, "B": 0.01 }, "p_best": { "A": 0.99, "B": 0.01 }, "p_best_uncorrected": { "A": 1, "B": 0 }, "best_uncorrected": "A", "ev": { "A": { "mean": 0.52, "p10": 0.38, "p90": 0.63 }, "B": { "mean": -0.45, "p10": -0.58, "p90": -0.33 } }, "ev_uncorrected": { "A": { "mean": 0.87, "p10": 0.79, "p90": 0.95 }, "B": { "mean": -0.81, "p10": -0.9, "p90": -0.66 } }, "consequences": [ { "id": "a1", "option": "A", "description": "About 200 customers stop seeing a wrong invoice total 40 minutes sooner.", "label": "Wrong totals stop now", "valence": "benefit", "size": { "value": 1, "p10": 0.82, "p90": 1 }, "counted_share": 0.6, "overlaps_with": [ { "with": "b1", "share": 0.88 } ], "discounted_by": { "with": "b1", "type": "mirror", "overlap": 0.88, "share": 0.4, "absence_p": 0.5 } }, { "id": "a2", "option": "A", "description": "Without the log dump to confirm the fix, about 20 customers get an email asking them to recheck one invoice.", "label": "Invoices to recheck", "valence": "harm", "size": { "value": 0.18, "p10": 0.09, "p90": 0.31 }, "counted_share": 1, "overlaps_with": [], "discounted_by": null }, { "id": "b1", "option": "B", "description": "About 200 customers keep seeing a wrong invoice total for 40 more minutes.", "label": "40 more minutes of wrong totals", "valence": "harm", "size": { "value": 0.9, "p10": 0.74, "p90": 1 }, "counted_share": 0.56, "overlaps_with": [ { "with": "a1", "share": 0.88 } ], "discounted_by": { "with": "a1", "type": "mirror", "overlap": 0.88, "share": 0.44, "absence_p": 0.5 } } ], "overlaps": [ { "a": "a1", "b": "b1", "share": 0.88, "p": 0.97, "type": "mirror", "type_p": 0.95, "kind": "mirror", "absence_side": "a1", "absence_p": 0.5, "absence": { "a1": 0.5, "b1": 0.5 } } ], "removed_share": 0.41, "mc": { "draws": 1000, "solved": 1000 }, "records": { "ratio": 3, "overlap": 2 } } ], "agreement": { "all_same": true, "best_by_stakeholder": { "customers": "A" } }, "warnings": [], "usage": { "input_tokens": 6370, "output_tokens": 0, "ratio_records": 3, "overlap_records": 2 }, "cost_usd": 0.01593, "links": { "view_url": "https://eevo.io/decisions/dec_7b1c0e4f9a2d4c6b8e3f5a1d2c4b6e8f/explicit", "png_url": "https://eevo.io/api/arvo/decisions/dec_7b1c0e4f9a2d4c6b8e3f5a1d2c4b6e8f/explicit.png" }, "meta": { "tau": 0.2, "draws": 1000, "ratio_spread_scale": 0.72, "overlap_model": "eevo-1@77e90830", "correction": { "mirror": false, "kept": true } }, "notes": "EVs are on each stakeholder's own scale (largest consequence = 1); compare options within a stakeholder, not across stakeholders. Informative, not a recommendation." }DirectDecisionResponse
object
id(required)string
Request id, as in the Eevo console decision log.
model(required)string
- Allowed values
["eevo-1"]
results(required)array
One result per stakeholder, in request order.
Array items:
object
stakeholder(required)object
id(required)string
description(required)string
Additional properties: not allowed.
best(required)string
The best option for this stakeholder.
- Allowed values
["A","B","C","D","E","F","G","H"]
confidence(required)number
Probability of the best option, 0-1.
probabilities(required)object
Probability that each option is the best one.
Additional property values:
number
Additional properties: not allowed.
agreement(required)object
Whether the stakeholders share a best option. There is deliberately no combined verdict.
all_same(required)boolean
best_by_stakeholder(required)object
Additional property values:
string
- Allowed values
["A","B","C","D","E","F","G","H"]
Additional properties: not allowed.
usage(required)object
input_tokens(required)number
output_tokens(required)number
Additional properties: not allowed.
cost_usd(required)number
lineage(optional)object
Where the decision sits in its revision chain: the first decision, its number (1 = first) and the one it revises.
root_id(required)string
number(required)number
previous_id(required)string | null
Additional properties: not allowed.
Additional properties: not allowed.
Example:
{ "id": "dec_4e9a1c7b2d8f4a3e9c6b0d1f7a2e5c84", "model": "eevo-1", "results": [ { "stakeholder": { "id": "customers", "description": "The customers who read the dashboards" }, "best": "A", "confidence": 0.74, "probabilities": { "A": 0.74, "B": 0.26 } }, { "stakeholder": { "id": "data-team", "description": "The data team" }, "best": "B", "confidence": 0.63, "probabilities": { "A": 0.37, "B": 0.63 } } ], "agreement": { "all_same": false, "best_by_stakeholder": { "customers": "A", "data-team": "B" } }, "usage": { "input_tokens": 2381, "output_tokens": 0 }, "cost_usd": 0.00595 }
Response 202
Default mode only: the decision is still running after about 50 seconds (a model waking from idle takes a few minutes), or async was true. It goes on running and is billed when it completes; poll poll_url (GET /v1/decisions/{id}) every retry_after seconds until status is ok (the answer is in response) or error.
application/json
object
id(required)string
model(required)string
mode(required)string
- Value
"default"
status(required)string
- Value
"running"
progress(required)object
done(optional)integer
total(optional)integer
poll_url(required)string
The
GET /v1/decisions/{id}URL to poll.retry_after(required)integer
Seconds to wait between polls.
lineage(optional)object
Additional properties: allowed.
Response 400
The request is invalid; the message says which field and why.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 401
No valid API key.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 402
No free decisions or credit left for the request.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 403
Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 409
The model is not served yet, or the revised decision already has a newer revision.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 410
No such decision that you can see: none in your organization, or one not shared with you.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 429
Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 502
The model failed to answer, or the decision could not be completed. Nothing is billed.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Response 503
The model is starting after being idle, or a request on free decisions found it busy (free_capacity_busy); retry after Retry-After seconds. Nothing is billed.
application/json
Error
object
error(required)object
type(required)string
- Allowed values
["invalid_request","authentication","insufficient_credit","model_unavailable","model_warming","free_capacity_busy","too_many_overlap_pairs","too_many_records","revision_conflict","rate_limited","server_error"]
message(required)string
Make a decision: Default: examples
Request example
curl -X POST 'https://eevo.io/api/v1/decisions' \
-H "Authorization: Bearer $EEVO_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "eevo-1",
"mode": "default",
"context": "Acme Corp found a data-export bug that shows some customers a wrong invoice total. A fix is ready; a log dump that would confirm it arrives in 40 minutes.",
"options": [
{
"id": "A",
"description": "Ship the fix now.",
"consequences": [
{
"id": "a1",
"label": "Wrong totals stop now",
"description": "About 200 customers stop seeing a wrong invoice total 40 minutes sooner.",
"valence": "benefit"
},
{
"id": "a2",
"label": "Invoices to recheck",
"description": "Without the log dump to confirm the fix, about 20 customers get an email asking them to recheck one invoice.",
"valence": "harm"
}
]
},
{
"id": "B",
"description": "Wait for the log dump, then ship.",
"consequences": [
{
"id": "b1",
"label": "40 more minutes of wrong totals",
"description": "About 200 customers keep seeing a wrong invoice total for 40 more minutes.",
"valence": "harm"
}
]
}
],
"stakeholders": [
{
"id": "customers",
"description": "The affected customers",
"values": "Correct invoices, no surprises."
}
]
}'Make a decision: Direct: examples
Request example
curl -X POST 'https://eevo.io/api/v1/decisions' \
-H "Authorization: Bearer $EEVO_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "eevo-1",
"mode": "direct",
"context": "Our nightly ETL failed at 02:10. A fix is ready, but the log dump that would confirm it arrives at 03:00. Downstream dashboards refresh at 06:00.",
"options": [
{
"id": "A",
"description": "Ship the fix now"
},
{
"id": "B",
"description": "Wait for the log dump"
}
],
"stakeholders": [
{
"id": "customers",
"description": "The customers who read the dashboards",
"values": "Correct numbers on time"
},
{
"id": "data-team",
"description": "The data team",
"values": "Reliability first; no repeated incidents"
}
],
"metadata": {
"conversation": {
"platform": "slack",
"channel": "#data-team",
"thread_url": "https://northwind.slack.com/archives/C04DATA/p1759561800123456"
},
"issue": {
"tracker": "linear",
"url": "https://linear.app/northwind/issue/DATA-398",
"key": "DATA-398",
"title": "Nightly ETL fails on lock timeout"
},
"pull_request": {
"platform": "github",
"url": "https://github.com/northwind/etl/pull/412",
"repo": "northwind/etl",
"number": 412
},
"on_behalf_of": {
"name": "Maija Virtanen",
"email": "maija@northwind.example"
}
}
}'