Publish a decision page
A public page of a decision anyone with the link can read, and taking it down.
POST /api/v1/decisions/{id}/publication. The fields, answers and errors below are rendered from the OpenAPI document.
Publish a decision page
POST /api/v1/decisions/{id}/publication
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
id(path, required)The decision id (
dec_…) its creation returned.string
Responses
Response 200
The decision with its publication.
application/json
DecisionRecord
object
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.
id(optional)string
createdAt(optional)string · date-time
model(optional)string
mode(optional)string
- Allowed values
["default","direct"]
status(optional)string
- Allowed values
["ok","error","running"]
errorMessage(optional)string | null
progress(optional)object | null
While
running: the model calls answered (done) of those the request needs (total).done(optional)integer
total(optional)integer
best(optional)string | null
bestByStakeholder(optional)object | null
Additional property values:
string
contentStored(optional)boolean
request(optional)object | null
response(optional)object | null
expiresAt(optional)string | null · date-time
sharedWithOrg(optional)boolean
Whether everyone in your organization sees the decision; when false, only its owner does.
canChangeSharing(optional)boolean
Whether this key can change
sharedWithOrg: the decision was made with it.publication(optional)object | null
The decision’s public page while it is published (
POST /v1/decisions/{id}/publication); null otherwise.url(optional)string
The page’s address, which anyone can open.
publishedAt(optional)string · date-time
publishedBy(optional)object | null
The person who published it in the console; null when an API key did.
id(optional)integer
name(optional)string
canPublish(optional)boolean
Whether this key can publish the decision: it was made with the key and its result is stored.
source(optional)string | null
- Allowed values
["api","mcp","playground","connector",null]
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
Publish a decision page: examples
Request example
curl -X POST 'https://eevo.io/api/v1/decisions/{id}/publication' \
-H "Authorization: Bearer $EEVO_API_KEY"Response 200 example
{
"id": "string",
"createdAt": "2025-12-31T00:00:00.000Z",
"model": "string",
"mode": "default",
"status": "ok",
"errorMessage": null,
"progress": {
"done": 0,
"total": 0
},
"best": null,
"bestByStakeholder": null,
"contentStored": true,
"request": null,
"response": null,
"expiresAt": null,
"sharedWithOrg": true,
"canChangeSharing": true,
"publication": {
"url": "string",
"publishedAt": "2025-12-31T00:00:00.000Z",
"publishedBy": {
"id": 0,
"name": "string"
}
},
"canPublish": true,
"source": "api"
}Take a decision page down
DELETE /api/v1/decisions/{id}/publication
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
id(path, required)The decision id (
dec_…) its creation returned.string
Responses
Response 200
The decision, with publication null.
application/json
DecisionRecord
object
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.
id(optional)string
createdAt(optional)string · date-time
model(optional)string
mode(optional)string
- Allowed values
["default","direct"]
status(optional)string
- Allowed values
["ok","error","running"]
errorMessage(optional)string | null
progress(optional)object | null
While
running: the model calls answered (done) of those the request needs (total).done(optional)integer
total(optional)integer
best(optional)string | null
bestByStakeholder(optional)object | null
Additional property values:
string
contentStored(optional)boolean
request(optional)object | null
response(optional)object | null
expiresAt(optional)string | null · date-time
sharedWithOrg(optional)boolean
Whether everyone in your organization sees the decision; when false, only its owner does.
canChangeSharing(optional)boolean
Whether this key can change
sharedWithOrg: the decision was made with it.publication(optional)object | null
The decision’s public page while it is published (
POST /v1/decisions/{id}/publication); null otherwise.url(optional)string
The page’s address, which anyone can open.
publishedAt(optional)string · date-time
publishedBy(optional)object | null
The person who published it in the console; null when an API key did.
id(optional)integer
name(optional)string
canPublish(optional)boolean
Whether this key can publish the decision: it was made with the key and its result is stored.
source(optional)string | null
- Allowed values
["api","mcp","playground","connector",null]
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
Take a decision page down: examples
Request example
curl -X DELETE 'https://eevo.io/api/v1/decisions/{id}/publication' \
-H "Authorization: Bearer $EEVO_API_KEY"Response 200 example
{
"id": "string",
"createdAt": "2025-12-31T00:00:00.000Z",
"model": "string",
"mode": "default",
"status": "ok",
"errorMessage": null,
"progress": {
"done": 0,
"total": 0
},
"best": null,
"bestByStakeholder": null,
"contentStored": true,
"request": null,
"response": null,
"expiresAt": null,
"sharedWithOrg": true,
"canChangeSharing": true,
"publication": {
"url": "string",
"publishedAt": "2025-12-31T00:00:00.000Z",
"publishedBy": {
"id": 0,
"name": "string"
}
},
"canPublish": true,
"source": "api"
}