> ## Documentation Index
> Fetch the complete documentation index at: https://docs.moonbounce.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Evaluate an item

> Evaluates one item against a decision: answers each question over the item's `state` (each question sees only the values its `reads` paths name, such as `state.message` or `state.order.customer.tier`, nested as in the state), evaluates the aggregations, and returns every answer, every aggregation's value and the result's status, value and outcome, with `version` (the structure that ran: its hash, and its number once registered) and `model` (the setting's model id, what answered, the setting's revision and an opaque profile). Many items under one version are a run: `POST /v1/decisions/{decision_id}/runs` (the MCP tool `create_run`). The structure travels inline (`questions`, `attributes`, `aggregations`, `result`) or by hash in `moonbounce.structure_hash`, never both. The request is a superset of System One's POST /v1/systemone: a plain System One request plus a `result` and the `moonbounce` object is a valid call. `model` asserts the decision's model rather than choosing one (see `model`); choose the model with `PUT /v1/decisions/{decision_id}/model` (the MCP tool `set_model`). In an environment where nobody chose one, a decision runs on the deployment's default model, stored as the setting's revision 1 the first time a version is registered there: by `POST /v1/decisions` (the MCP tool `register_decision`), or by any evaluate, run or import_examples call that is not a dry run, inline or by hash. A call refused for its `model` or for a question the model cannot answer registers no version and stores no setting, and neither does an inline structure whose content is refused. Questions are for judgments a model makes; facts your app already knows, such as an order total or a refund count, belong in `attributes` and are compared exactly by `rules` conditions (`gte`, `lt`, `is`, `in`). Spends model calls and, with moonbounce.dry_run: true, stores no evaluation; otherwise stores an evaluation. Questions with the same reads share one System One call (`cost.calls` lists each). Fresh responses include recorded cost. A dry run stores only usage, returns a dry_ id and dry_run: true, and accepts and ignores Idempotency-Key: a retried dry run runs, and is billed, again. It does not register an inline structure (so `version.number` is null for a structure nobody registered), store a model setting or cache answers. Otherwise an inline structure is registered on first sight and the response follows the evaluation commit. A replay with the same Idempotency-Key returns the first result with the Idempotent-Replayed header. Each request has a 10 s budget; `Prefer: wait=<seconds>` shortens it. A body with `items` or `cases` is a 400 that points at the runs endpoint.



## OpenAPI

````yaml /openapi.json post /v1/evaluate
openapi: 3.1.0
info:
  title: Moonbounce Decisions API
  version: 0.0.0
  description: >-
    Moonbounce decisions: evaluate an item's state against a decision structure
    (System One questions, attributes you supply and aggregations over both),
    record feedback and import labeled examples, review a ranked queue, and
    improve the structure through suggestions that ship as code diffs, each with
    a preview (backtest) and an evidence label.


    **Authentication.** Send an API key as `Authorization: Bearer <key>` on
    every operation except `GET /health` and `POST /v1/validate`. Call the API
    from a server, never a browser: a key must not reach one, and the API sends
    no CORS headers. A key belongs to one organization and one environment:
    production, or test for a key with the `env:test` permission. Test traffic
    never counts as production traffic.


    **Requests.** JSON bodies (`Content-Type: application/json`) of at most 1
    MB, parsed strictly: duplicate keys, lone surrogates, integers outside
    ±(2^53 - 1), `__proto__` keys, U+0000 and nesting deeper than 64 are a 400.


    **Retries.** Send an `Idempotency-Key` on every POST under /v1 that takes
    one (all but `POST /v1/validate` and `POST /v1/review/items/fill`, whose
    retry is another fill within the day's budget). Keep it for the request's
    retries. The same key with the same request returns the first stored result,
    marked `Idempotent-Replayed: true`, for 24 hours (410 if that result was
    since deleted); with another request it is 422 IDEMPOTENCY_KEY_REUSED. Keys
    are scoped to the organization and environment across every operation, so
    use a fresh key per request. A request that failed before its result was
    stored runs again when retried. 429 and 503 under /v1 may carry
    `Retry-After` (seconds); a daily QUOTA_EXCEEDED cap instead names its reset
    time.


    **Errors.** Every error under /v1 is `{"error": {"type", "message",
    "reason"?, "param"?, "details"?}}` (ErrorBody); `GET /health` answers its
    own shape. Every response carries a `Request-Id` header. Rate limits apply
    per key, and per client IP for requests without a valid key; a 429
    RATE_LIMITED carries `Retry-After`.
servers:
  - url: https://api.moonbounce.ai
    description: Production
security: []
paths:
  /v1/evaluate:
    post:
      tags:
        - evaluate
      summary: Evaluate an item
      description: >-
        Evaluates one item against a decision: answers each question over the
        item's `state` (each question sees only the values its `reads` paths
        name, such as `state.message` or `state.order.customer.tier`, nested as
        in the state), evaluates the aggregations, and returns every answer,
        every aggregation's value and the result's status, value and outcome,
        with `version` (the structure that ran: its hash, and its number once
        registered) and `model` (the setting's model id, what answered, the
        setting's revision and an opaque profile). Many items under one version
        are a run: `POST /v1/decisions/{decision_id}/runs` (the MCP tool
        `create_run`). The structure travels inline (`questions`, `attributes`,
        `aggregations`, `result`) or by hash in `moonbounce.structure_hash`,
        never both. The request is a superset of System One's POST
        /v1/systemone: a plain System One request plus a `result` and the
        `moonbounce` object is a valid call. `model` asserts the decision's
        model rather than choosing one (see `model`); choose the model with `PUT
        /v1/decisions/{decision_id}/model` (the MCP tool `set_model`). In an
        environment where nobody chose one, a decision runs on the deployment's
        default model, stored as the setting's revision 1 the first time a
        version is registered there: by `POST /v1/decisions` (the MCP tool
        `register_decision`), or by any evaluate, run or import_examples call
        that is not a dry run, inline or by hash. A call refused for its `model`
        or for a question the model cannot answer registers no version and
        stores no setting, and neither does an inline structure whose content is
        refused. Questions are for judgments a model makes; facts your app
        already knows, such as an order total or a refund count, belong in
        `attributes` and are compared exactly by `rules` conditions (`gte`,
        `lt`, `is`, `in`). Spends model calls and, with moonbounce.dry_run:
        true, stores no evaluation; otherwise stores an evaluation. Questions
        with the same reads share one System One call (`cost.calls` lists each).
        Fresh responses include recorded cost. A dry run stores only usage,
        returns a dry_ id and dry_run: true, and accepts and ignores
        Idempotency-Key: a retried dry run runs, and is billed, again. It does
        not register an inline structure (so `version.number` is null for a
        structure nobody registered), store a model setting or cache answers.
        Otherwise an inline structure is registered on first sight and the
        response follows the evaluation commit. A replay with the same
        Idempotency-Key returns the first result with the Idempotent-Replayed
        header. Each request has a 10 s budget; `Prefer: wait=<seconds>`
        shortens it. A body with `items` or `cases` is a 400 that points at the
        runs endpoint.
      operationId: evaluate
      parameters:
        - schema:
            type: string
            minLength: 1
            maxLength: 255
            pattern: ^[\x20-\x7e]+$
            description: >-
              Makes a retry safe. For 24 hours, the same key with the same
              request returns the first stored result (with Idempotent-Replayed:
              true); the same key with a different request is a 422
              IDEMPOTENCY_KEY_REUSED. Keys are scoped to the organization and
              environment across every operation, so use a fresh key per
              request. A request that failed before its result was stored runs
              again when retried with its key.
          required: false
          description: >-
            Makes a retry safe. For 24 hours, the same key with the same request
            returns the first stored result (with Idempotent-Replayed: true);
            the same key with a different request is a 422
            IDEMPOTENCY_KEY_REUSED. Keys are scoped to the organization and
            environment across every operation, so use a fresh key per request.
            A request that failed before its result was stored runs again when
            retried with its key.
          name: idempotency-key
          in: header
        - schema:
            type: string
            maxLength: 256
            description: '`wait=<seconds>` (RFC 7240) shortens the 10 s budget.'
          required: false
          description: '`wait=<seconds>` (RFC 7240) shortens the 10 s budget.'
          name: prefer
          in: header
      requestBody:
        required: true
        content:
          application/json:
            examples:
              inline:
                summary: >-
                  A dry run with the structure inline: it spends model calls and
                  records their usage, but registers no version, stores no model
                  setting and stores no evaluation; drop dry_run to register the
                  version and store the evaluation
                value:
                  state:
                    message: >-
                      My tent showed up two weeks late, I used it once on the
                      trip it was for, and now it's day 39. Can I still return
                      it?
                  attribute_values:
                    days_since_delivery: 39
                  questions:
                    item_used:
                      type: noul
                      instructions: >-
                        Has the customer used the item beyond trying it on or
                        setting it up once?
                      reads:
                        - state.message
                    defective:
                      type: noul
                      instructions: >-
                        Does the customer describe a defect, damage on arrival,
                        or the item failing under normal use?
                      reads:
                        - state.message
                  attributes:
                    days_since_delivery:
                      type: number
                      minimum: 0
                  aggregations:
                    grant_score:
                      type: weighted_mean
                      inputs:
                        - name: questions.item_used
                          invert: true
                        - name: questions.defective
                    handling:
                      type: rules
                      rules:
                        - when:
                            name: attributes.days_since_delivery
                            gt: 30
                          outcome: escalate
                        - when:
                            name: aggregations.grant_score
                            gte: 0.72
                          outcome: grant
                        - when:
                            name: aggregations.grant_score
                            lt: 0.38
                          outcome: deny
                      else: escalate
                  result: aggregations.handling
                  moonbounce:
                    decision_id: refund-exception
                    item_id: t-001
                    summary: Late tent, used once, day 39
                    dry_run: true
              by_hash:
                summary: >-
                  The same structure by its hash, once registered: evaluates for
                  real and stores the evaluation
                value:
                  state:
                    message: >-
                      My tent showed up two weeks late, I used it once on the
                      trip it was for, and now it's day 39. Can I still return
                      it?
                  attribute_values:
                    days_since_delivery: 39
                  moonbounce:
                    decision_id: refund-exception
                    item_id: t-001
                    structure_hash: >-
                      sha256:bdad6e5b1b879209305f1555b43ec62666a4d74a925280c66e54cc4dc07bb1ae
            schema:
              $ref: '#/components/schemas/EvaluateRequest'
      responses:
        '200':
          description: The evaluation
          headers:
            Idempotent-Replayed:
              schema:
                type: string
                enum:
                  - 'true'
                description: >-
                  Present and `true` when this is the stored result of an
                  earlier request with the same Idempotency-Key.
              required: false
              description: >-
                Present and `true` when this is the stored result of an earlier
                request with the same Idempotency-Key.
          content:
            application/json:
              examples:
                stored:
                  summary: >-
                    Stored on version 1, answered by Jev under the model
                    setting's revision 1
                  value:
                    environment: production
                    id: evl_0199f2c4-1a2b-7c3d-8e4f-5a6b7c8d9e0f
                    answers:
                      item_used:
                        type: noul
                        noul: 0.35
                      defective:
                        type: noul
                        noul: 0.05
                    aggregations:
                      grant_score:
                        type: weighted_mean
                        value: 0.35000000000000003
                      handling:
                        type: rules
                        outcome: escalate
                        via: '0'
                    status: decided
                    outcome: escalate
                    moonbounce:
                      decision_id: refund-exception
                      item_id: t-001
                      summary: Late tent, used once, day 39
                    version:
                      structure_hash: >-
                        sha256:bdad6e5b1b879209305f1555b43ec62666a4d74a925280c66e54cc4dc07bb1ae
                      number: 1
                    model:
                      id: jev-1.14.0
                      resolved_model: jev-1.14.0
                      revision: 1
                      profile: >-
                        defective=jev:jev-1.14.0@jev@0.1.0,item_used=jev:jev-1.14.0@jev@0.1.0
                    cost:
                      model_calls: 1
                      questions: 2
                      input_tokens: 520
                      output_tokens: 4
                      usd_micros: 21
                      calls:
                        - questions:
                            - item_used
                            - defective
                          reads:
                            - state.message
                          input_tokens: 520
                dry_run:
                  summary: >-
                    A dry run of a structure nobody registered: no number, and
                    the deployment default (no revision)
                  value:
                    environment: production
                    id: dry_0199f2c4-1a2b-7c3d-8e4f-5a6b7c8d9e10
                    answers:
                      item_used:
                        type: noul
                        noul: 0.35
                      defective:
                        type: noul
                        noul: 0.05
                    aggregations:
                      grant_score:
                        type: weighted_mean
                        value: 0.35000000000000003
                      handling:
                        type: rules
                        outcome: escalate
                        via: '0'
                    status: decided
                    outcome: escalate
                    moonbounce:
                      decision_id: refund-exception
                      item_id: t-001
                      summary: Late tent, used once, day 39
                    version:
                      structure_hash: >-
                        sha256:bdad6e5b1b879209305f1555b43ec62666a4d74a925280c66e54cc4dc07bb1ae
                      number: null
                    model:
                      id: jev-1.14.0
                      resolved_model: jev-1.14.0
                      revision: null
                      profile: >-
                        defective=jev:jev-1.14.0@jev@0.1.0,item_used=jev:jev-1.14.0@jev@0.1.0
                    cost:
                      model_calls: 1
                      questions: 2
                      input_tokens: 520
                      output_tokens: 4
                      usd_micros: 21
                      calls:
                        - questions:
                            - item_used
                            - defective
                          reads:
                            - state.message
                          input_tokens: 520
                    dry_run: true
              schema:
                $ref: '#/components/schemas/EvaluateResponse'
        '400':
          description: 'Invalid request: `param` names the field at fault when one applies'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '401':
          description: Missing or invalid API key (reason KEY_INVALID)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '403':
          description: The key may not do this
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '404':
          description: Not found, or not in this key's organization and environment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '409':
          description: Conflict with the current state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '410':
          description: >-
            The Idempotency-Key's first result was deleted, so it cannot be
            replayed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '413':
          description: The HTTP body exceeds 1 MB (reason BODY_TOO_LARGE)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '422':
          description: >-
            The request is well formed but cannot be processed
            (IDEMPOTENCY_KEY_REUSED requires a fresh key; REQUEST_TOO_LARGE
            requires a smaller request)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '429':
          description: >-
            RATE_LIMITED: retry after Retry-After seconds; QUOTA_EXCEEDED:
            details.reset_at gives the daily reset time (no Retry-After)
          headers:
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying, when waiting helps.
              required: false
              description: Seconds to wait before retrying, when waiting helps.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '502':
          description: >-
            A model failed to answer a question the result needs (type
            engine_failed, reason ENGINE_FAILED)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '503':
          description: >-
            Temporarily unavailable, with Retry-After (for example reason
            AUTH_UNAVAILABLE, ENGINE_UNAVAILABLE or STORE_UNAVAILABLE): retry
            with the same Idempotency-Key
          headers:
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying, when waiting helps.
              required: true
              description: Seconds to wait before retrying, when waiting helps.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
      security:
        - bearerAuth:
            - decisions:evaluate
components:
  schemas:
    EvaluateRequest:
      anyOf:
        - type: object
          properties:
            questions:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/Question'
              description: System One questions, keyed by name.
            attributes:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/Attribute'
              description: >-
                Values your app supplies with each call in `attribute_values`.
                The model never sees them.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/Aggregation'
            result:
              type: string
              minLength: 1
              maxLength: 80
              description: The final feature's path, such as `aggregations.band`.
              examples:
                - questions.asks_for_refund
                - aggregations.band
            model:
              type: string
              minLength: 1
              maxLength: 128
              description: >-
                An assertion, not a choice: the decision's model setting picks
                the model (set it with `PUT /v1/decisions/{decision_id}/model`).
                Leave it out to use the setting. When sent, every question's
                model must be this one, or the call is a 400 invalid_request
                with `param` `model`, before any model call and before anything
                is written: a refused call registers nothing (not even an inline
                structure seen for the first time, or the setting it would
                store) and creates no content key. Accepted for System One
                compatibility.
            state:
              description: >-
                The content the questions evaluate: any JSON value, including a
                string or JSON null, as in System One. A question with `reads`
                (`state.<key>` paths, or deeper such as `state.order.id`) sees
                only those values, nested as in the state.
            attribute_values:
              type: object
              additionalProperties:
                anyOf:
                  - type: string
                    maxLength: 200
                  - type: number
                  - type: boolean
              description: >-
                This call's attribute values. Each must match its declaration; a
                declared one without a default is required, except one that
                declares `from`: evaluate reads that from `state`, and a value
                for it here is refused.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionId'
                item_id:
                  type: string
                  minLength: 1
                  maxLength: 256
                  description: >-
                    A name you choose for the thing being judged, such as a
                    ticket id: 1 to 256 characters. Evaluations of the same item
                    group under it, and feedback by item binds to its latest
                    evaluation.
                structure_hash:
                  not: {}
                  description: >-
                    Must be absent: send the structure inline or by its hash,
                    not both.
                  x-moonbounce-absent: true
                metadata:
                  $ref: '#/components/schemas/Metadata'
                summary:
                  type: string
                  minLength: 1
                  maxLength: 140
                  description: One line for review cards. Never shown to the model.
                dry_run:
                  type: boolean
                  description: >-
                    Spends model calls and stores only usage, with no evaluation
                    or feedback target. It registers nothing, so
                    `version.number` is null for a structure nobody registered.
                    An Idempotency-Key is accepted and ignored: a retried dry
                    run runs, and is billed, again.
              required:
                - decision_id
                - item_id
              additionalProperties: false
          required:
            - questions
            - result
            - state
            - moonbounce
          additionalProperties: false
        - type: object
          properties:
            model:
              type: string
              minLength: 1
              maxLength: 128
              description: >-
                An assertion, not a choice: the decision's model setting picks
                the model (set it with `PUT /v1/decisions/{decision_id}/model`).
                Leave it out to use the setting. When sent, every question's
                model must be this one, or the call is a 400 invalid_request
                with `param` `model`, before any model call and before anything
                is written: a refused call registers nothing (not even an inline
                structure seen for the first time, or the setting it would
                store) and creates no content key. Accepted for System One
                compatibility.
            state:
              description: >-
                The content the questions evaluate: any JSON value, including a
                string or JSON null, as in System One. A question with `reads`
                (`state.<key>` paths, or deeper such as `state.order.id`) sees
                only those values, nested as in the state.
            attribute_values:
              type: object
              additionalProperties:
                anyOf:
                  - type: string
                    maxLength: 200
                  - type: number
                  - type: boolean
              description: >-
                This call's attribute values. Each must match its declaration; a
                declared one without a default is required, except one that
                declares `from`: evaluate reads that from `state`, and a value
                for it here is refused.
            questions:
              not: {}
              description: >-
                Must be absent: send the structure inline or by its hash, not
                both.
              x-moonbounce-absent: true
            attributes:
              not: {}
              description: >-
                Must be absent: send the structure inline or by its hash, not
                both.
              x-moonbounce-absent: true
            aggregations:
              not: {}
              description: >-
                Must be absent: send the structure inline or by its hash, not
                both.
              x-moonbounce-absent: true
            result:
              not: {}
              description: >-
                Must be absent: send the structure inline or by its hash, not
                both.
              x-moonbounce-absent: true
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionId'
                item_id:
                  type: string
                  minLength: 1
                  maxLength: 256
                  description: >-
                    A name you choose for the thing being judged, such as a
                    ticket id: 1 to 256 characters. Evaluations of the same item
                    group under it, and feedback by item binds to its latest
                    evaluation.
                structure_hash:
                  $ref: '#/components/schemas/StructureHash'
                metadata:
                  $ref: '#/components/schemas/Metadata'
                summary:
                  type: string
                  minLength: 1
                  maxLength: 140
                  description: One line for review cards. Never shown to the model.
                dry_run:
                  type: boolean
                  description: >-
                    Spends model calls and stores only usage, with no evaluation
                    or feedback target. It registers nothing, so
                    `version.number` is null for a structure nobody registered.
                    An Idempotency-Key is accepted and ignored: a retried dry
                    run runs, and is billed, again.
              required:
                - decision_id
                - item_id
                - structure_hash
              additionalProperties: false
          required:
            - state
            - moonbounce
          additionalProperties: false
    EvaluateResponse:
      anyOf:
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            dry_run:
              not: {}
              description: 'Must be absent: only a dry run sets `dry_run`.'
              x-moonbounce-absent: true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - computed
            value:
              type: number
            outcome:
              not: {}
              description: 'Must be absent: a computed result is a number, with no outcome.'
              x-moonbounce-absent: true
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
            - value
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            dry_run:
              not: {}
              description: 'Must be absent: only a dry run sets `dry_run`.'
              x-moonbounce-absent: true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - decided
            value:
              type: number
            outcome:
              $ref: '#/components/schemas/OutcomeOutput'
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
            - outcome
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            dry_run:
              not: {}
              description: 'Must be absent: only a dry run sets `dry_run`.'
              x-moonbounce-absent: true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - abstained
            value:
              not: {}
              description: 'Must be absent: an abstained result has no value.'
              x-moonbounce-absent: true
            outcome:
              $ref: '#/components/schemas/OutcomeOutput'
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/DryId'
            dry_run:
              type: boolean
              enum:
                - true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - computed
            value:
              type: number
            outcome:
              not: {}
              description: 'Must be absent: a computed result is a number, with no outcome.'
              x-moonbounce-absent: true
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - dry_run
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
            - value
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/DryId'
            dry_run:
              type: boolean
              enum:
                - true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - decided
            value:
              type: number
            outcome:
              $ref: '#/components/schemas/OutcomeOutput'
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - dry_run
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
            - outcome
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            environment:
              $ref: '#/components/schemas/Environment'
            id:
              $ref: '#/components/schemas/DryId'
            dry_run:
              type: boolean
              enum:
                - true
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/NoulAnswer'
              description: Each question's answer, as System One returns it.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: >-
                Every aggregation's result. The result's own aggregation carries
                `via` when it is bands, rules or match.
            moonbounce:
              type: object
              properties:
                decision_id:
                  $ref: '#/components/schemas/DecisionIdOutput'
                item_id:
                  type: string
                metadata:
                  $ref: '#/components/schemas/MetadataOutput'
                summary:
                  type: string
              required:
                - decision_id
                - item_id
              additionalProperties: true
              description: >-
                What you sent in `moonbounce`, echoed. What ran is in `version`
                and `model`.
              x-moonbounce-sdk-known-fields: true
            version:
              $ref: '#/components/schemas/EvaluatedVersion'
            model:
              $ref: '#/components/schemas/EvaluatedModel'
            cost:
              $ref: '#/components/schemas/EvaluateCost'
            status:
              type: string
              enum:
                - abstained
            value:
              not: {}
              description: 'Must be absent: an abstained result has no value.'
              x-moonbounce-absent: true
            outcome:
              $ref: '#/components/schemas/OutcomeOutput'
            missing:
              type: array
              items:
                $ref: '#/components/schemas/FeatureRefOutput'
              description: >-
                The questions the result depends on (through `result` and every
                aggregation on its path) that have no answer, abstained or
                failed, as `questions.x` paths in authored question order.
                Absent when none is missing; reported for every status. A caller
                who must not act on partial evidence checks that it is absent,
                for example `status === "decided" && !missing`.
          required:
            - environment
            - id
            - dry_run
            - answers
            - aggregations
            - moonbounce
            - version
            - model
            - cost
            - status
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
    ErrorBody:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              $ref: '#/components/schemas/ErrorType'
            reason:
              type: string
              pattern: ^[A-Z][A-Z0-9_]+$
              description: >-
                Set where a caller can act on it, one of the reasons in the
                ErrorReason schema. New reasons may be added: treat an unknown
                one by the status and `type`.
            message:
              type: string
              description: For people; don't parse it.
            param:
              type: string
              description: >-
                The request field at fault, as a dotted path
                (`attribute_values.region`, `claims.1.value`).
            details:
              type: object
              properties:
                issues:
                  type: array
                  items:
                    $ref: '#/components/schemas/ErrorIssue'
              additionalProperties: {}
          required:
            - type
            - message
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
      required:
        - error
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    Question:
      oneOf:
        - $ref: '#/components/schemas/NoulQuestion'
      discriminator:
        propertyName: type
        mapping:
          noul: '#/components/schemas/NoulQuestion'
    Attribute:
      oneOf:
        - $ref: '#/components/schemas/StringAttribute'
        - $ref: '#/components/schemas/NumberAttribute'
        - $ref: '#/components/schemas/BooleanAttribute'
      discriminator:
        propertyName: type
        mapping:
          string: '#/components/schemas/StringAttribute'
          number: '#/components/schemas/NumberAttribute'
          boolean: '#/components/schemas/BooleanAttribute'
    Aggregation:
      oneOf:
        - $ref: '#/components/schemas/WeightedMean'
        - $ref: '#/components/schemas/Logistic'
        - $ref: '#/components/schemas/Min'
        - $ref: '#/components/schemas/Max'
        - $ref: '#/components/schemas/Product'
        - $ref: '#/components/schemas/NoisyOr'
        - $ref: '#/components/schemas/All'
        - $ref: '#/components/schemas/Any'
        - $ref: '#/components/schemas/Bands'
        - $ref: '#/components/schemas/Rules'
        - $ref: '#/components/schemas/Match'
      discriminator:
        propertyName: type
        mapping:
          weighted_mean: '#/components/schemas/WeightedMean'
          logistic: '#/components/schemas/Logistic'
          min: '#/components/schemas/Min'
          max: '#/components/schemas/Max'
          product: '#/components/schemas/Product'
          noisy_or: '#/components/schemas/NoisyOr'
          all: '#/components/schemas/All'
          any: '#/components/schemas/Any'
          bands: '#/components/schemas/Bands'
          rules: '#/components/schemas/Rules'
          match: '#/components/schemas/Match'
    DecisionId:
      type: string
      pattern: ^[a-z][a-z0-9_.-]{0,127}$
      description: >-
        A name you choose for this decision, such as `refund-exception`: a
        lowercase letter, then up to 127 of `a-z 0-9 _ . -`. Unique in your
        organization and shared by its test and production keys. The first
        registration or evaluation under a new one creates the decision.
    Metadata:
      type: object
      additionalProperties:
        anyOf:
          - type: string
            maxLength: 512
          - type: number
          - type: boolean
          - type: 'null'
      description: >-
        Caller key-values, stored with the evaluation and never shown to the
        model. Keys starting `mb.` are reserved for Moonbounce provenance:
        `mb.commit`, `mb.branch`, `mb.service` and `mb.release`, which say where
        a call came from.
    StructureHash:
      type: string
      pattern: ^sha256:[0-9a-f]{64}$
    Environment:
      type: string
      enum:
        - production
        - test
      description: >-
        The environment of the key that made the call: `production` or `test`.
        Evaluations, feedback, reviews and suggestions are separate per
        environment; decisions and their versions belong to the whole
        organization.
    EvlIdOutput:
      type: string
      pattern: >-
        ^evl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    NoulAnswer:
      anyOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - noul
            noul:
              type: number
              minimum: 0
              maximum: 1
          required:
            - type
            - noul
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            type:
              type: string
              enum:
                - noul
            abstained:
              type: boolean
              enum:
                - true
          required:
            - type
            - abstained
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            type:
              type: string
              enum:
                - noul
            failed:
              type: boolean
              enum:
                - true
          required:
            - type
            - failed
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
      description: P(true), or why there is no answer.
    AggregationResult:
      type: object
      properties:
        type:
          type: string
        value:
          type: number
        outcome:
          $ref: '#/components/schemas/OutcomeOutput'
        via:
          type: string
          description: >-
            A zero-based rule index, `cases.<label>` for an exact matched case,
            or `else` for the fallback.
        missing:
          type: array
          items:
            $ref: '#/components/schemas/FeatureRefOutput'
          description: >-
            weighted_mean only: the inputs dropped for having no answer, as
            written (`questions.x`).
        abstained:
          type: boolean
          enum:
            - true
      required:
        - type
      additionalProperties: true
      description: >-
        An aggregation's value. `value` for numbers (for bands, the input it
        cut); `outcome` for bands, rules and match; `via` is the zero-based rule
        index, `cases.<label>` for a matched case, or `else` for the fallback;
        `abstained` when unknown.
      x-moonbounce-sdk-known-fields: true
    DecisionIdOutput:
      type: string
      pattern: ^[a-z][a-z0-9_.-]{0,127}$
      description: >-
        A name you choose for this decision, such as `refund-exception`: a
        lowercase letter, then up to 127 of `a-z 0-9 _ . -`. Unique in your
        organization and shared by its test and production keys. The first
        registration or evaluation under a new one creates the decision.
    MetadataOutput:
      type: object
      additionalProperties:
        anyOf:
          - type: string
            maxLength: 512
          - type: number
          - type: boolean
          - type: 'null'
      description: >-
        Caller key-values, stored with the evaluation and never shown to the
        model. Keys starting `mb.` are reserved for Moonbounce provenance:
        `mb.commit`, `mb.branch`, `mb.service` and `mb.release`, which say where
        a call came from.
    EvaluatedVersion:
      type: object
      properties:
        structure_hash:
          $ref: '#/components/schemas/StructureHashOutput'
        number:
          type:
            - integer
            - 'null'
          minimum: 1
          description: >-
            The version's number under the decision (1, 2, 3...). Null when the
            structure isn't registered: a dry run or a preview of a structure
            nobody registered. The hash is the identity.
      required:
        - structure_hash
        - number
      additionalProperties: true
      description: The version that ran.
      x-moonbounce-sdk-known-fields: true
    EvaluatedModel:
      type: object
      properties:
        id:
          type: string
          description: >-
            The model the decision's setting names, as `GET .../model` reports
            it and `PUT .../model` takes it.
        resolved_model:
          type: string
          description: The versioned model that answered.
        revision:
          type:
            - integer
            - 'null'
          minimum: 1
          description: >-
            The model setting's revision it ran on. Null when no setting was
            stored in the environment, so the deployment default applied.
        profile:
          type: string
          description: >-
            Every question's model and connector, as one opaque string. Compare
            it for equality (two runs are comparable when their profiles match);
            don't parse it.
      required:
        - id
        - resolved_model
        - revision
        - profile
      additionalProperties: true
      description: The model that answered.
      x-moonbounce-sdk-known-fields: true
    EvaluateCost:
      type: object
      properties:
        model_calls:
          type: integer
          minimum: 0
          description: >-
            Upstream model calls, retries included. One call can answer several
            questions (Jev compiles them into one).
        questions:
          type: integer
          minimum: 0
          description: >-
            Questions sent to a model. An answer from the cache, or one a stored
            case kept, is not counted.
        cache_hits:
          type: integer
          minimum: 0
          description: >-
            Questions answered from the answer cache, when any were: previews
            and case runs always report it, evaluate and imports only when the
            cache served an answer.
        input_tokens:
          type: integer
          minimum: 0
        output_tokens:
          type: integer
          minimum: 0
        usd_micros:
          type: integer
          minimum: 0
          description: What the model calls cost, in millionths of a US dollar.
        calls:
          type: array
          items:
            $ref: '#/components/schemas/EvaluateCallCost'
          description: 'Each upstream call: which questions it answered and what it read.'
      required:
        - model_calls
        - questions
        - input_tokens
        - output_tokens
        - usd_micros
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    FeatureRefOutput:
      type: string
      minLength: 1
      maxLength: 80
      description: >-
        A feature's path: `questions.<name>`, `attributes.<name>` or
        `aggregations.<name>`.
      examples:
        - questions.asks_for_refund
        - aggregations.band
    OutcomeOutput:
      type: string
      minLength: 1
      maxLength: 200
      description: >-
        An outcome name, or the exact enum label when a string attribute is the
        result.
    DryId:
      type: string
      pattern: >-
        ^dry_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    ErrorType:
      type: string
      enum:
        - invalid_request
        - authentication
        - permission_denied
        - not_found
        - conflict
        - rate_limited
        - engine_failed
        - unavailable
        - internal
    ErrorIssue:
      type: object
      properties:
        param:
          type: string
        code:
          type: string
          pattern: ^[A-Z][A-Z0-9_]+$
          description: >-
            Stable, extensible issue code; unknown codes still have a parameter
            and human-readable message.
        message:
          type: string
      required:
        - param
        - code
        - message
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    NoulQuestion:
      type: object
      properties:
        type:
          type: string
          enum:
            - noul
        instructions:
          $ref: '#/components/schemas/Instructions'
        criteria:
          type: object
          properties:
            'true':
              type: string
              minLength: 1
              maxLength: 4000
            'false':
              type: string
              minLength: 1
              maxLength: 4000
          additionalProperties: false
        reads:
          type: array
          items:
            $ref: '#/components/schemas/StatePath'
          minItems: 1
          maxItems: 64
          description: >-
            Paths into an object `state` this question reads, such as
            `state.message` or `state.order.customer.tier`. The question sees
            just those values, nested as in the state. Without it the question
            sees the whole state, as in System One. Every path must exist in the
            call's `state`; no entry may repeat or contain another.
      required:
        - type
        - instructions
      additionalProperties: false
      description: P(true) for a statement about the state.
    StringAttribute:
      type: object
      properties:
        type:
          type: string
          enum:
            - string
        enum:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 200
          minItems: 1
          maxItems: 255
        default:
          type: string
        source:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            The model and version behind this attribute, such as
            `toxicity-classifier-v3`. Hashed.
        from:
          type: string
          minLength: 1
          maxLength: 256
          description: >-
            A state path (as in `reads`) evaluate fills this attribute from, in
            place of `attribute_values`: the value at that path, validated by
            this declaration with no coercion. A missing or null path takes
            `default`, else it is a 400. A value for it in `attribute_values` is
            a 400. Hashed as written.
          examples:
            - state.message
            - state.order.order_total_usd
      required:
        - type
        - enum
      additionalProperties: false
    NumberAttribute:
      type: object
      properties:
        type:
          type: string
          enum:
            - number
        minimum:
          type: number
        maximum:
          type: number
        default:
          type: number
        source:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            The model and version behind this attribute, such as
            `toxicity-classifier-v3`. Hashed.
        from:
          type: string
          minLength: 1
          maxLength: 256
          description: >-
            A state path (as in `reads`) evaluate fills this attribute from, in
            place of `attribute_values`: the value at that path, validated by
            this declaration with no coercion. A missing or null path takes
            `default`, else it is a 400. A value for it in `attribute_values` is
            a 400. Hashed as written.
          examples:
            - state.message
            - state.order.order_total_usd
      required:
        - type
      additionalProperties: false
    BooleanAttribute:
      type: object
      properties:
        type:
          type: string
          enum:
            - boolean
        default:
          type: boolean
        source:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            The model and version behind this attribute, such as
            `toxicity-classifier-v3`. Hashed.
        from:
          type: string
          minLength: 1
          maxLength: 256
          description: >-
            A state path (as in `reads`) evaluate fills this attribute from, in
            place of `attribute_values`: the value at that path, validated by
            this declaration with no coercion. A missing or null path takes
            `default`, else it is a 400. A value for it in `attribute_values` is
            a 400. Hashed as written.
          examples:
            - state.message
            - state.order.order_total_usd
      required:
        - type
      additionalProperties: false
    WeightedMean:
      type: object
      properties:
        type:
          type: string
          enum:
            - weighted_mean
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              weight:
                type: number
                exclusiveMinimum: 0
              invert:
                type: boolean
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 'Σ wᵢ·xᵢ / Σ wᵢ: a weighted average from 0 to 1, not a probability.'
    Logistic:
      type: object
      properties:
        type:
          type: string
          enum:
            - logistic
        bias:
          type: number
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              weight:
                type: number
            required:
              - name
              - weight
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - bias
        - inputs
      additionalProperties: false
      description: σ(bias + Σ wᵢ·xᵢ), with signed weights on raw input values.
    Min:
      type: object
      properties:
        type:
          type: string
          enum:
            - min
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              invert:
                type: boolean
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 'min xᵢ: all of these, when they overlap.'
    Max:
      type: object
      properties:
        type:
          type: string
          enum:
            - max
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              invert:
                type: boolean
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 'max xᵢ: any of these, when they overlap.'
    Product:
      type: object
      properties:
        type:
          type: string
          enum:
            - product
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              invert:
                type: boolean
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 'Π xᵢ: all of these, when they are independent.'
    NoisyOr:
      type: object
      properties:
        type:
          type: string
          enum:
            - noisy_or
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              invert:
                type: boolean
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: '1 − Π(1 − xᵢ): any of these, when they are independent.'
    All:
      type: object
      properties:
        type:
          type: string
          enum:
            - all
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              gte:
                type: number
              gt:
                type: number
              lte:
                type: number
              lt:
                type: number
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 1 when every input passes its threshold (default ≥ 0.5), else 0.
    Any:
      type: object
      properties:
        type:
          type: string
          enum:
            - any
        inputs:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/FeatureRef'
              gte:
                type: number
              gt:
                type: number
              lte:
                type: number
              lt:
                type: number
            required:
              - name
            additionalProperties: false
          minItems: 1
          maxItems: 64
      required:
        - type
        - inputs
      additionalProperties: false
      description: 1 when any input passes its threshold (default ≥ 0.5), else 0.
    Bands:
      type: object
      properties:
        type:
          type: string
          enum:
            - bands
        input:
          $ref: '#/components/schemas/FeatureRef'
        below:
          $ref: '#/components/schemas/Name'
        cuts:
          type: array
          items:
            type: object
            properties:
              at:
                type: number
              outcome:
                $ref: '#/components/schemas/Name'
            required:
              - at
              - outcome
            additionalProperties: false
          minItems: 1
          maxItems: 9
        abstain:
          $ref: '#/components/schemas/Name'
      required:
        - type
        - input
        - below
        - cuts
      additionalProperties: false
      description: >-
        Names an outcome for each range of one feature's value. `at` means ≥;
        `below` is under the first cut.
    Rules:
      type: object
      properties:
        type:
          type: string
          enum:
            - rules
        rules:
          type: array
          items:
            type: object
            properties:
              when:
                $ref: '#/components/schemas/Condition'
              outcome:
                $ref: '#/components/schemas/Name'
            required:
              - when
              - outcome
            additionalProperties: false
          minItems: 1
          maxItems: 64
        else:
          $ref: '#/components/schemas/Name'
      required:
        - type
        - rules
        - else
      additionalProperties: false
      description: >-
        The first rule whose condition is true names its `outcome`; otherwise
        `else`.
    Match:
      type: object
      properties:
        type:
          type: string
          enum:
            - match
        input:
          $ref: '#/components/schemas/FeatureRef'
        cases:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/Name'
          description: >-
            Maps labels to outcomes. "__proto__" is not supported as a case key;
            use a rules is-condition for that label.
        else:
          $ref: '#/components/schemas/Name'
        abstain:
          $ref: '#/components/schemas/Name'
      required:
        - type
        - input
        - cases
      additionalProperties: false
      description: Maps a label straight to an outcome.
    StructureHashOutput:
      type: string
      pattern: ^sha256:[0-9a-f]{64}$
    EvaluateCallCost:
      type: object
      properties:
        questions:
          type: array
          items:
            $ref: '#/components/schemas/NameOutput'
        reads:
          type: array
          items:
            $ref: '#/components/schemas/StatePathOutput'
          description: >-
            The paths sent, as the questions wrote them (`state.message`);
            absent when the whole state was.
        input_tokens:
          type: integer
          minimum: 0
      required:
        - questions
      additionalProperties: true
      description: One upstream System One call.
      x-moonbounce-sdk-known-fields: true
    Instructions:
      anyOf:
        - type: string
          minLength: 1
          maxLength: 4000
        - type: object
          additionalProperties: {}
        - type: array
          items: {}
          minItems: 1
    StatePath:
      type: string
      minLength: 1
      maxLength: 256
      description: >-
        `state.<key>` or a nested object path such as
        `state.order.customer.tier`: keys of an object `state`. A key has no
        `.`, `[` or `]`. Array indexes are not supported yet.
      examples:
        - state.message
        - state.order.order_total_usd
    FeatureRef:
      type: string
      minLength: 1
      maxLength: 80
      description: >-
        A feature's path: `questions.<name>`, `attributes.<name>` or
        `aggregations.<name>`.
      examples:
        - questions.asks_for_refund
        - aggregations.band
    Name:
      type: string
      pattern: ^[a-z][a-z0-9_]{0,63}$
    Condition:
      anyOf:
        - type: object
          properties:
            name:
              $ref: '#/components/schemas/FeatureRef'
            gte:
              type: number
            gt:
              type: number
            lte:
              type: number
            lt:
              type: number
            is:
              type: string
              minLength: 1
              maxLength: 200
            in:
              type: array
              items:
                type: string
                minLength: 1
                maxLength: 200
              minItems: 1
              maxItems: 255
            abstained:
              type: boolean
              enum:
                - true
          required:
            - name
          additionalProperties: false
        - type: object
          properties:
            all:
              type: array
              items:
                $ref: '#/components/schemas/Condition'
              minItems: 1
              maxItems: 64
          required:
            - all
          additionalProperties: false
        - type: object
          properties:
            any:
              type: array
              items:
                $ref: '#/components/schemas/Condition'
              minItems: 1
              maxItems: 64
          required:
            - any
          additionalProperties: false
        - type: object
          properties:
            not:
              $ref: '#/components/schemas/Condition'
          required:
            - not
          additionalProperties: false
    NameOutput:
      type: string
      pattern: ^[a-z][a-z0-9_]{0,63}$
    StatePathOutput:
      type: string
      minLength: 1
      maxLength: 256
      description: >-
        `state.<key>` or a nested object path such as
        `state.order.customer.tier`: keys of an object `state`. A key has no
        `.`, `[` or `]`. Array indexes are not supported yet.
      examples:
        - state.message
        - state.order.order_total_usd
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        An API key, sent as `Authorization: Bearer <key>`. Each operation lists
        the scope its key needs: `decisions:evaluate` (evaluate and read
        evaluations), `decisions:feedback` (your app's feedback) or
        `decisions:develop` (everything else, including owner feedback and the
        review queue). An operation listing no scope takes any scoped key. A key
        with no scope, or without the operation's, gets 403 INSUFFICIENT_SCOPE.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.