{"openapi":"3.1.0","info":{"title":"Eevo API","version":"1","description":"Eevo, Upright’s consequential decision model: a decision with its options and stakeholders in, each stakeholder’s best option out. Every request carries an API key of your organization (`Authorization: Bearer eevo_sk_…`), created in the Eevo console."},"servers":[{"url":"https://eevo.io"}],"security":[{"apiKey":[]}],"paths":{"/api/v1/decisions":{"post":{"operationId":"createDecision","summary":"Make a decision","description":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ExplicitDecisionRequest"},{"$ref":"#/components/schemas/DirectDecisionRequest"}]}}}},"responses":{"200":{"description":"The decision, one result per stakeholder.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ExplicitDecisionResponse"},{"$ref":"#/components/schemas/DirectDecisionResponse"}]}}}},"202":{"description":"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`.","content":{"application/json":{"schema":{"type":"object","required":["id","model","mode","status","progress","poll_url","retry_after"],"properties":{"id":{"type":"string"},"model":{"type":"string"},"mode":{"type":"string","const":"default"},"status":{"type":"string","const":"running"},"progress":{"type":"object","properties":{"done":{"type":"integer"},"total":{"type":"integer"}}},"poll_url":{"type":"string","description":"The `GET /v1/decisions/{id}` URL to poll."},"retry_after":{"type":"integer","description":"Seconds to wait between polls."},"lineage":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/decisions/{id}":{"get":{"operationId":"getDecision","summary":"Get a decision","description":"A decision of your organization with its stored request and response, chosen decision, revisions and assessments.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"responses":{"200":{"description":"The decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRecord"}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateDecisionSharing","summary":"Share a decision, or stop sharing it","description":"Whether everyone in your organization sees the decision (`shared_with_org: true`), or only the person who created the API key it was made with, and the key itself (`false`). It applies to every revision of the decision. Only for a decision made with this key (403 otherwise); its creator can also change it in the console. A decision that is not shared stays hidden from everyone else, admins included, also after its owner leaves the organization. New decisions follow the key’s setting (API keys in the console), or `share_with_org` on the request. Free.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"shared_with_org":{"type":"boolean"}},"required":["shared_with_org"],"additionalProperties":false}}}},"responses":{"200":{"description":"The decision with its sharing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRecord"}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/decisions/{id}/chosen":{"post":{"operationId":"reportChosen","summary":"Report what was done","description":"One report for the whole decision: the option carried out (or `none`); whether it was each stakeholder’s best is derived from it. Reporting again replaces the report. Free.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"followed":{"type":"boolean"},"chosen_option":{"type":"string","enum":["A","B","C","D","E","F","G","H","none"]},"decided_by":{"type":"string","enum":["agent","human"]},"note":{"type":"string","minLength":1,"maxLength":2000},"reported_by":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email"}},"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"The decision with its chosen decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRecord"}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/decisions/{id}/publication":{"post":{"operationId":"publishDecision","summary":"Publish a decision page","description":"Gives the decision a public page on eevo.io (`publication.url` in the answer) that anyone with the link can read without signing in: the context, options, stakeholders and the result, nothing that names your organization, key or people. The link is an unguessable token. Only for a finished decision made with this key whose result is stored (403 for another key’s decision, 400 for one with no stored result). While a decision is published its request and response are kept past the key’s retention, since the page shows them; its metadata and notes, which the page does not show, expire as before. Publishing a published decision changes nothing. Free.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"responses":{"200":{"description":"The decision with its `publication`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRecord"}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"unpublishDecision","summary":"Take a decision page down","description":"Takes the public page down: the link stops working for good (publishing again gives a new one). Content whose retention has already ended is deleted at the next daily sweep. Free.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"responses":{"200":{"description":"The decision, with `publication` null.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRecord"}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/decisions/{id}/assessments":{"post":{"operationId":"assessDecision","summary":"Record whether you agree","description":"Whether Eevo’s best option is right in your judgement, per stakeholder. Each call adds an assessment. Free.","parameters":[{"name":"id","in":"path","required":true,"description":"The decision id (`dec_…`) its creation returned.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"overall":{"type":"string","enum":["agree","partly","disagree"]},"stakeholders":{"type":"array","items":{"type":"object","properties":{"stakeholder":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"best_correct":{"type":"string","enum":["yes","no","unsure"]},"would_choose":{"type":"string","enum":["A","B","C","D","E","F","G","H","none"]},"confidence":{"type":"number","minimum":0,"maximum":1},"reason":{"type":"string","minLength":1,"maxLength":2000}},"required":["stakeholder","best_correct"],"additionalProperties":false},"minItems":1,"maxItems":8},"assessor":{"type":"object","properties":{"kind":{"type":"string","enum":["agent","human"]},"agent":{"type":"string","minLength":1,"maxLength":100},"model":{"type":"string","minLength":1,"maxLength":100}},"additionalProperties":false},"on_behalf_of":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email"}},"additionalProperties":false},"note":{"type":"string","minLength":1,"maxLength":2000}},"required":["overall","stakeholders"],"additionalProperties":false}}}},"responses":{"200":{"description":"The assessment.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/systemone":{"post":{"operationId":"askQuestions","summary":"Ask typed questions","description":"The SystemOne-compatible API, which works like any decision model: typed questions (choice, score, noul) about any state, answered in one pass with probabilities.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","enum":["eevo-1"],"default":"eevo-1"},"state":{"anyOf":[{"type":"string","minLength":1,"maxLength":50000},{"type":"object","additionalProperties":{}}]},"questions":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["choice"]},"instructions":{"type":"string","maxLength":2000},"criteria":{"type":"object","additionalProperties":{"type":"string","maxLength":2000}}},"required":["type","criteria"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["score"]},"instructions":{"type":"string","maxLength":2000},"criteria":{"type":"array","items":{"type":"string","maxLength":500},"minItems":2,"maxItems":64}},"required":["type","criteria"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["noul"]},"instructions":{"type":"string","maxLength":2000}},"required":["type"],"additionalProperties":false}]}},"metadata":{"type":"object","properties":{"conversation":{"type":"object","properties":{"platform":{"type":"string","enum":["slack","teams","google_chat","other"]},"channel":{"type":"string","minLength":1,"maxLength":200},"thread_url":{"type":"string","minLength":1,"maxLength":2000}},"required":["platform"],"additionalProperties":false},"issue":{"type":"object","properties":{"tracker":{"type":"string","enum":["linear","jira","github","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"key":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["tracker","url"],"additionalProperties":false},"pull_request":{"type":"object","properties":{"platform":{"type":"string","enum":["github","gitlab","bitbucket","azure_devops","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"repo":{"type":"string","minLength":1,"maxLength":200},"number":{"type":"integer","exclusiveMinimum":true,"minimum":0},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["platform","url"],"additionalProperties":false},"on_behalf_of":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email"}},"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2000},"label":{"type":"string","minLength":1,"maxLength":200}},"required":["url"],"additionalProperties":false},"maxItems":10}},"additionalProperties":false},"share_with_org":{"type":"boolean"}},"required":["state","questions"],"additionalProperties":false,"example":{"model":"eevo-1","state":"Support ticket: a customer was charged twice for an €80 order because of an error in our billing system. Agents may refund up to €50 without approval.","questions":{"action":{"type":"choice","instructions":"What should the support agent do?","criteria":{"refuse":"Refuse, and cite the €50 limit","partial":"Refund €50 and ask the customer to contact billing for the rest","refund":"Refund the €80 duplicate charge and record the exception"}},"urgency":{"type":"score","instructions":"How urgent is the ticket?","criteria":["Not urgent","Somewhat urgent","Urgent","Critical"]},"fraud":{"type":"noul","instructions":"The customer is attempting fraud."}}}}}}},"responses":{"200":{"description":"One answer per question.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Request id, as in the Eevo console decision log."},"model":{"type":"string"},"answers":{"type":"object","additionalProperties":{"type":"object","properties":{"type":{"type":"string","enum":["choice","score","noul"]}},"required":["type"],"additionalProperties":true}},"usage":{"type":"object","properties":{"input_tokens":{"type":"number"},"output_tokens":{"type":"number"}},"required":["input_tokens","output_tokens"],"additionalProperties":false}},"required":["model","answers","usage"],"additionalProperties":false,"example":{"model":"eevo-1","answers":{"action":{"type":"choice","choice":"refund","confidence":0.71,"probabilities":{"refuse":0.07,"partial":0.22,"refund":0.71}},"urgency":{"type":"score","score":2,"confidence":0.58,"legend":{"0":"Not urgent","1":"Somewhat urgent","2":"Urgent","3":"Critical"},"probabilities":{"0":0.03,"1":0.31,"2":0.58,"3":0.08}},"fraud":{"type":"noul","noul":0.04}},"usage":{"input_tokens":412,"output_tokens":0}}}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/receipts":{"get":{"operationId":"listReceipts","summary":"List payment receipts","description":"Your organization’s payments, newest first: credit purchases, auto-recharges and refunds, each with its Stripe receipt (`receipt_url`, downloadable as a PDF), for bookkeeping. Any API key of the organization can read them. A receipt link opens for anyone who has it and shows the buyer’s email, billing address and the card’s last four digits, so treat the links like the receipts themselves. `amount_usd` is the credit before tax; the receipt shows the tax paid. Free.","parameters":[{"name":"from","in":"query","required":false,"description":"The earliest payment date (ISO date or date-time, inclusive).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"The date the period ends (ISO date or date-time, exclusive).","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"At most this many payments (default 100).","schema":{"type":"integer","minimum":1,"maximum":300}}],"responses":{"200":{"description":"The payments, newest first.","content":{"application/json":{"schema":{"type":"object","properties":{"receipts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"created_at":{"type":"string"},"kind":{"type":"string","enum":["purchase","auto_recharge","refund"]},"amount_usd":{"type":"number","description":"The credit added in USD, before tax (negative for a refund)."},"description":{"type":"string","nullable":true},"receipt_url":{"type":"string","nullable":true,"description":"Stripe's receipt; null when Stripe gave none."}},"required":["id","created_at","kind","amount_usd","description","receipt_url"],"additionalProperties":false}}},"required":["receipts"],"additionalProperties":false}}}},"400":{"description":"The request is invalid; the message says which field and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No free decisions or credit left for the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Only the person who made the decision, or the API key it was made with, can change who sees it or publish it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The model is not served yet, or the revised decision already has a newer revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"No such decision that you can see: none in your organization, or one not shared with you.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached (see Retry-After), or your organization already has 3 Default mode decisions running; send it when one is done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The model failed to answer, or the decision could not be completed. Nothing is billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"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.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An Eevo API key, `eevo_sk_…`."}},"schemas":{"DirectDecisionRequest":{"type":"object","properties":{"model":{"type":"string","enum":["eevo-1"],"default":"eevo-1","description":"The one Eevo model, `eevo-1` (the default when left out)."},"mode":{"type":"string","enum":["direct"],"description":"`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."},"context":{"type":"string","minLength":1,"maxLength":20000},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["A","B","C","D","E","F","G","H"]},"description":{"type":"string","minLength":1,"maxLength":2000}},"required":["id","description"],"additionalProperties":false},"minItems":2,"maxItems":8},"stakeholders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"description":{"type":"string","minLength":1,"maxLength":2000},"values":{"type":"string","maxLength":2000}},"required":["description"],"additionalProperties":false},"minItems":1,"maxItems":8},"metadata":{"type":"object","properties":{"conversation":{"type":"object","properties":{"platform":{"type":"string","enum":["slack","teams","google_chat","other"]},"channel":{"type":"string","minLength":1,"maxLength":200},"thread_url":{"type":"string","minLength":1,"maxLength":2000}},"required":["platform"],"additionalProperties":false},"issue":{"type":"object","properties":{"tracker":{"type":"string","enum":["linear","jira","github","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"key":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["tracker","url"],"additionalProperties":false},"pull_request":{"type":"object","properties":{"platform":{"type":"string","enum":["github","gitlab","bitbucket","azure_devops","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"repo":{"type":"string","minLength":1,"maxLength":200},"number":{"type":"integer","exclusiveMinimum":true,"minimum":0},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["platform","url"],"additionalProperties":false},"on_behalf_of":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email"}},"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2000},"label":{"type":"string","minLength":1,"maxLength":200}},"required":["url"],"additionalProperties":false},"maxItems":10}},"additionalProperties":false},"revises":{"type":"string","minLength":1,"maxLength":64},"revision_note":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":2000},"missed":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["context","consequence","stakeholder","option","size_or_probability","other"]},"description":{"type":"string","minLength":1,"maxLength":1000}},"required":["kind","description"],"additionalProperties":false},"minItems":1,"maxItems":20}},"required":["missed"],"additionalProperties":false},"share_with_org":{"type":"boolean"}},"required":["mode","context","options","stakeholders"],"additionalProperties":false,"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"}}}},"ExplicitDecisionRequest":{"type":"object","properties":{"model":{"type":"string","enum":["eevo-1"],"default":"eevo-1","description":"The one Eevo model, `eevo-1` (the default when left out)."},"mode":{"type":"string","enum":["default"],"default":"default","description":"`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, send `direct`."},"context":{"type":"string","minLength":1,"maxLength":20000},"stakeholders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"description":{"type":"string","minLength":1,"maxLength":2000},"values":{"type":"string","maxLength":2000}},"required":["description"],"additionalProperties":false},"minItems":1,"maxItems":8},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["A","B","C","D","E","F","G","H"]},"description":{"type":"string","minLength":1,"maxLength":2000},"consequences":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"description":{"type":"string","minLength":1,"maxLength":1000},"label":{"type":"string","minLength":1,"maxLength":60},"stakeholders":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"minItems":1},"valence":{"anyOf":[{"type":"string","enum":["benefit","harm"]},{"type":"object","additionalProperties":{"type":"string","enum":["benefit","harm"]}}]}},"required":["description","valence"],"additionalProperties":false},"minItems":1,"maxItems":40}},"required":["id","description","consequences"],"additionalProperties":false},"minItems":2,"maxItems":8},"seed":{"type":"integer","minimum":0,"maximum":4294967295},"async":{"type":"boolean"},"metadata":{"type":"object","properties":{"conversation":{"type":"object","properties":{"platform":{"type":"string","enum":["slack","teams","google_chat","other"]},"channel":{"type":"string","minLength":1,"maxLength":200},"thread_url":{"type":"string","minLength":1,"maxLength":2000}},"required":["platform"],"additionalProperties":false},"issue":{"type":"object","properties":{"tracker":{"type":"string","enum":["linear","jira","github","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"key":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["tracker","url"],"additionalProperties":false},"pull_request":{"type":"object","properties":{"platform":{"type":"string","enum":["github","gitlab","bitbucket","azure_devops","other"]},"url":{"type":"string","minLength":1,"maxLength":2000},"repo":{"type":"string","minLength":1,"maxLength":200},"number":{"type":"integer","exclusiveMinimum":true,"minimum":0},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["platform","url"],"additionalProperties":false},"on_behalf_of":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email"}},"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2000},"label":{"type":"string","minLength":1,"maxLength":200}},"required":["url"],"additionalProperties":false},"maxItems":10}},"additionalProperties":false},"revises":{"type":"string","minLength":1,"maxLength":64},"revision_note":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":2000},"missed":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["context","consequence","stakeholder","option","size_or_probability","other"]},"description":{"type":"string","minLength":1,"maxLength":1000}},"required":["kind","description"],"additionalProperties":false},"minItems":1,"maxItems":20}},"required":["missed"],"additionalProperties":false},"share_with_org":{"type":"boolean"}},"required":["context","stakeholders","options"],"additionalProperties":false,"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."}]}},"DirectDecisionResponse":{"type":"object","properties":{"id":{"type":"string","description":"Request id, as in the Eevo console decision log."},"model":{"type":"string","enum":["eevo-1"]},"results":{"type":"array","items":{"type":"object","properties":{"stakeholder":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"}},"required":["id","description"],"additionalProperties":false},"best":{"type":"string","enum":["A","B","C","D","E","F","G","H"],"description":"The best option for this stakeholder."},"confidence":{"type":"number","description":"Probability of the best option, 0-1."},"probabilities":{"type":"object","additionalProperties":{"type":"number"},"description":"Probability that each option is the best one."}},"required":["stakeholder","best","confidence","probabilities"],"additionalProperties":false},"description":"One result per stakeholder, in request order."},"agreement":{"type":"object","properties":{"all_same":{"type":"boolean"},"best_by_stakeholder":{"type":"object","additionalProperties":{"type":"string","enum":["A","B","C","D","E","F","G","H"]}}},"required":["all_same","best_by_stakeholder"],"additionalProperties":false,"description":"Whether the stakeholders share a best option. There is deliberately no combined verdict."},"usage":{"type":"object","properties":{"input_tokens":{"type":"number"},"output_tokens":{"type":"number"}},"required":["input_tokens","output_tokens"],"additionalProperties":false},"cost_usd":{"type":"number"},"lineage":{"type":"object","properties":{"root_id":{"type":"string"},"number":{"type":"number"},"previous_id":{"type":"string","nullable":true}},"required":["root_id","number","previous_id"],"additionalProperties":false,"description":"Where the decision sits in its revision chain: the first decision, its number (1 = first) and the one it revises."}},"required":["id","model","results","agreement","usage","cost_usd"],"additionalProperties":false,"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}},"ExplicitDecisionResponse":{"type":"object","properties":{"id":{"type":"string","description":"Request id, as in the Eevo console decision log."},"model":{"type":"string"},"mode":{"type":"string","enum":["default"]},"overlap":{"type":"string","enum":["correct","report","off"]},"seed":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"stakeholder":{"type":"object","properties":{"id":{"type":"string"},"description":{"type":"string"}},"required":["id","description"],"additionalProperties":false},"best":{"type":"string","enum":["A","B","C","D","E","F","G","H"],"description":"The option with the highest expected value for this stakeholder."},"confidence":{"type":"number"},"probabilities":{"type":"object","additionalProperties":{"type":"number"},"description":"P(highest EV) per option."},"ev":{"type":"object","additionalProperties":{"type":"object","properties":{"mean":{"type":"number"},"p10":{"type":"number"},"p90":{"type":"number"}},"required":["mean","p10","p90"],"additionalProperties":false},"description":"Expected value per option on this stakeholder's own scale, with p10-p90."},"consequences":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":true}},"overlaps":{"type":"array","items":{"type":"object","properties":{"a":{"type":"string"},"b":{"type":"string"},"share":{"type":"number"}},"required":["a","b","share"],"additionalProperties":true}}},"required":["stakeholder","best","confidence","probabilities","ev","consequences","overlaps"],"additionalProperties":true},"description":"One result per stakeholder, in request order."},"agreement":{"type":"object","properties":{"all_same":{"type":"boolean"},"best_by_stakeholder":{"type":"object","additionalProperties":{"type":"string","enum":["A","B","C","D","E","F","G","H"]}}},"required":["all_same","best_by_stakeholder"],"additionalProperties":false},"warnings":{"type":"array","items":{"type":"string"}},"usage":{"type":"object","properties":{"input_tokens":{"type":"number"},"output_tokens":{"type":"number"},"ratio_records":{"type":"number"},"overlap_records":{"type":"number"}},"required":["input_tokens","output_tokens","ratio_records","overlap_records"],"additionalProperties":true},"cost_usd":{"type":"number"},"links":{"type":"object","properties":{"view_url":{"type":"string"},"png_url":{"type":"string"}},"required":["view_url","png_url"],"additionalProperties":false,"nullable":true},"meta":{"type":"object","properties":{},"additionalProperties":true},"notes":{"type":"string"},"lineage":{"type":"object","properties":{"root_id":{"type":"string"},"number":{"type":"number"},"previous_id":{"type":"string","nullable":true}},"required":["root_id","number","previous_id"],"additionalProperties":false,"description":"Where the decision sits in its revision chain: the first decision, its number (1 = first) and the one it revises."}},"required":["id","model","mode","overlap","seed","results","agreement","warnings","usage","cost_usd","links","meta","notes"],"additionalProperties":false,"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."}},"DecisionRecord":{"type":"object","description":"The decision as the decision log shows it: id, createdAt, model, mode, status, best and bestByStakeholder, chosen decision, revision and assessment summaries. `GET /v1/decisions/{id}` adds `request` and `response` (null once the content has expired under the key’s retention, or when it was never stored), `revisions` and `assessments`. A Default mode decision that answered 202 has `status: \"running\"` with its `progress` until it is done; then `response` holds the decide answer (or `status` is `error` with `errorMessage`). Under retention \"none\", that answer is held for one fetch, at most one hour, then deleted.","additionalProperties":true,"properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"model":{"type":"string"},"mode":{"type":"string","enum":["default","direct"]},"status":{"type":"string","enum":["ok","error","running"]},"errorMessage":{"type":["string","null"]},"progress":{"type":["object","null"],"description":"While `running`: the model calls answered (`done`) of those the request needs (`total`).","properties":{"done":{"type":"integer"},"total":{"type":"integer"}}},"best":{"type":["string","null"]},"bestByStakeholder":{"type":["object","null"],"additionalProperties":{"type":"string"}},"contentStored":{"type":"boolean"},"request":{"type":["object","null"]},"response":{"type":["object","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"sharedWithOrg":{"type":"boolean","description":"Whether everyone in your organization sees the decision; when false, only its owner does."},"canChangeSharing":{"type":"boolean","description":"Whether this key can change `sharedWithOrg`: the decision was made with it."},"publication":{"type":["object","null"],"description":"The decision’s public page while it is published (`POST /v1/decisions/{id}/publication`); null otherwise.","properties":{"url":{"type":"string","description":"The page’s address, which anyone can open."},"publishedAt":{"type":"string","format":"date-time"},"publishedBy":{"type":["object","null"],"description":"The person who published it in the console; null when an API key did.","properties":{"id":{"type":"integer"},"name":{"type":"string"}}}}},"canPublish":{"type":"boolean","description":"Whether this key can publish the decision: it was made with the key and its result is stored."},"source":{"type":["string","null"],"enum":["api","mcp","playground","connector",null]}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","message"],"properties":{"type":{"type":"string","enum":["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":{"type":"string"}}}}}}}}