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"
}