> ## 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.

# Export a decision's feedback as training data

> Lists feedback with its claims and evaluated cases; reads only. The raw feedback on a decision, for a producer's training data (calibration, suggested versions): one item per submission, oldest first, with its claims (an expected_answer with the hash of the question it judged), the evaluation it judged (structure hash, engine profile, status, value, outcome, via and every aggregation's result, each question's System One answer under `answer` with its question hash, distribution and engine provenance, and content: {state, attribute_values?} when inputs were stored, otherwise content: null) and its group's split. A submission whose item has no group yet is not listed. It is raw, not a consensus: superseded submissions are listed and marked `superseded_by`, and how submissions become training data is the reader's call. `withdrawn_at` marks a claimless withdrawal event: resolve chain heads across pages, exclude withdrawn chains without reviving ancestors, and invalidate cached answers. On a spot check, `after_reveal` is false on the reviewer's first, blind answer and true on each answer that changed it after Moonbounce's call was revealed: pick the blind answer to measure accuracy, the latest to train. `channel` says where each submission came from; Slack's terms bar training an LLM on `slack` feedback. Scoped to the key's organization and environment, and feedback on deleted evaluations is left out. A decision with no feedback this key can see answers 200 with no items. `structure_hash` keeps only evaluations of that structure hash. `split.group` is an opaque id shared by submissions on near-identical items in the key's environment; it never names an item. Page forward by passing `next_cursor` as `cursor` while `has_more` is true. `next_cursor` is null on the last page. Keep `resume_cursor` for later polling; an empty poll retains it: reading from it later returns what was written after it, apart from the following. Items are in creation order, not commit order, and a submission's creation time is the start of the transaction that wrote it: any write that commits after a later one was read (a seed batch, or any concurrent submission) can land behind a cursor already handed out. A reason added later to a submission already read (a reviewer's `POST /v1/review/items/{review_item_id}/reason`) does not move it either. So a forward reader re-reads from the start now and then. Not an MCP tool, so bulk content stays out of coding agents' context. The web session may not read it (403).



## OpenAPI

````yaml /openapi.json get /v1/decisions/{decision_id}/feedback
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 seed 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/structures/hash`. 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/structures/hash`). 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/decisions/{decision_id}/feedback:
    get:
      tags:
        - feedback
      summary: Export a decision's feedback as training data
      description: >-
        Lists feedback with its claims and evaluated cases; reads only. The raw
        feedback on a decision, for a producer's training data (calibration,
        suggested versions): one item per submission, oldest first, with its
        claims (an expected_answer with the hash of the question it judged), the
        evaluation it judged (structure hash, engine profile, status, value,
        outcome, via and every aggregation's result, each question's System One
        answer under `answer` with its question hash, distribution and engine
        provenance, and content: {state, attribute_values?} when inputs were
        stored, otherwise content: null) and its group's split. A submission
        whose item has no group yet is not listed. It is raw, not a consensus:
        superseded submissions are listed and marked `superseded_by`, and how
        submissions become training data is the reader's call. `withdrawn_at`
        marks a claimless withdrawal event: resolve chain heads across pages,
        exclude withdrawn chains without reviving ancestors, and invalidate
        cached answers. On a spot check, `after_reveal` is false on the
        reviewer's first, blind answer and true on each answer that changed it
        after Moonbounce's call was revealed: pick the blind answer to measure
        accuracy, the latest to train. `channel` says where each submission came
        from; Slack's terms bar training an LLM on `slack` feedback. Scoped to
        the key's organization and environment, and feedback on deleted
        evaluations is left out. A decision with no feedback this key can see
        answers 200 with no items. `structure_hash` keeps only evaluations of
        that structure hash. `split.group` is an opaque id shared by submissions
        on near-identical items in the key's environment; it never names an
        item. Page forward by passing `next_cursor` as `cursor` while `has_more`
        is true. `next_cursor` is null on the last page. Keep `resume_cursor`
        for later polling; an empty poll retains it: reading from it later
        returns what was written after it, apart from the following. Items are
        in creation order, not commit order, and a submission's creation time is
        the start of the transaction that wrote it: any write that commits after
        a later one was read (a seed batch, or any concurrent submission) can
        land behind a cursor already handed out. A reason added later to a
        submission already read (a reviewer's `POST
        /v1/review/items/{review_item_id}/reason`) does not move it either. So a
        forward reader re-reads from the start now and then. Not an MCP tool, so
        bulk content stays out of coding agents' context. The web session may
        not read it (403).
      operationId: listFeedback
      parameters:
        - schema:
            $ref: '#/components/schemas/DecisionId'
          required: true
          name: decision_id
          in: path
        - schema:
            type: string
            pattern: ^sha256:[0-9a-f]{64}$
            description: Only feedback on evaluations of this structure hash.
          required: false
          description: Only feedback on evaluations of this structure hash.
          name: structure_hash
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
          required: false
          name: limit
          in: query
        - schema:
            type: string
            minLength: 1
            maxLength: 1024
            description: >-
              The previous page's next_cursor, or its resume_cursor to poll
              later; retained on empty export polls.
          required: false
          description: >-
            The previous page's next_cursor, or its resume_cursor to poll later;
            retained on empty export polls.
          name: cursor
          in: query
      responses:
        '200':
          description: A page of feedback, oldest first
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FeedbackExport'
        '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'
        '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'
        '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:develop
components:
  schemas:
    DecisionId:
      type: string
      pattern: ^[a-z][a-z0-9_.-]{0,127}$
    FeedbackExport:
      type: object
      properties:
        environment:
          $ref: '#/components/schemas/Environment'
        items:
          type: array
          items:
            $ref: '#/components/schemas/FeedbackExportItem'
        next_cursor:
          type:
            - string
            - 'null'
          description: Next page, or null at the end.
        resume_cursor:
          type:
            - string
            - 'null'
          description: >-
            Export checkpoint for later polls, retained on empty pages. Pass as
            cursor on a later poll. Creation ordering requires periodic full
            rescans for late commits and updates; this is not a lossless change
            feed.
        has_more:
          type: boolean
          description: True when more items follow this page now.
      required:
        - environment
        - items
        - next_cursor
        - resume_cursor
        - has_more
      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
    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; registered structures are shared.
    FeedbackExportItem:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/FbkIdOutput'
        source:
          $ref: '#/components/schemas/FeedbackSource'
        channel:
          type: string
          enum:
            - slack
            - web
            - api
            - mcp
            - import
          description: >-
            The surface the submission came through, stamped by the server.
            Slack's terms bar training an LLM on Slack data: leave out `slack`
            when you fit a model.
        actor:
          type: string
          description: >-
            Who submitted it, as recorded (an `ext:` prefix marks an actor a key
            named).
        reason:
          type: string
        reason_pending:
          type: boolean
          description: >-
            True when a reason was promised and has not arrived yet. On a
            superseded submission (`superseded_by` set) it means the reason was
            never added before the answer was replaced, and none will be: read
            the chain head.
        reason_added_at:
          type: string
          format: date-time
          description: >-
            When a pending reason was filled in. A reason added after the answer
            was revealed is commentary, not blind evidence.
        unsure:
          type: boolean
        withdrawn_at:
          type: string
          format: date-time
          description: >-
            When this claimless submission withdrew its chain. Resolve chain
            heads before excluding withdrawn chains; ancestors never revive.
        after_reveal:
          type: boolean
          description: >-
            Spot checks only. `false` on the reviewer's first answer, given
            blind; `true` on an answer that changed it after Moonbounce's call
            was revealed. Accuracy is measured on the blind answer. Omitted on
            other items, other sources and withdrawal events.
        supersedes:
          type: string
          pattern: >-
            ^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
          description: The submission this one replaces.
        superseded_by:
          type: string
          pattern: >-
            ^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
          description: >-
            Set when a later submission replaced this one. This one no longer
            counts.
        created_at:
          $ref: '#/components/schemas/Timestamp'
        claims:
          type: array
          items:
            $ref: '#/components/schemas/ExportedClaim'
          description: The claims, in the order they were sent.
        evaluation:
          $ref: '#/components/schemas/ExportedEvaluation'
        split:
          type: object
          properties:
            split:
              $ref: '#/components/schemas/Split'
            group:
              type: string
              pattern: ^grp_[0-9a-f]{32}$
              description: >-
                An opaque, stable id of the item's group of near-identical items
                in the key's environment: submissions with the same `group`
                share one. It never names an item.
          required:
            - split
            - group
          additionalProperties: true
          description: >-
            The item's group and what it is: `seed` (a starting example) or
            `train` (a case with feedback). Submissions whose item has no group
            yet are not listed.
          x-moonbounce-sdk-known-fields: true
      required:
        - id
        - source
        - channel
        - actor
        - reason_pending
        - unsure
        - created_at
        - claims
        - evaluation
        - split
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    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
    FbkIdOutput:
      type: string
      pattern: >-
        ^fbk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    FeedbackSource:
      type: string
      enum:
        - app_native
        - app_resolution
        - reviewer
        - owner
        - import
        - synthetic_review
    Timestamp:
      type: string
      format: date-time
    ExportedClaim:
      type: object
      properties:
        claim:
          $ref: '#/components/schemas/ClaimOutput'
        question_hash:
          type: string
          pattern: ^sha256:[0-9a-f]{64}$
          description: >-
            expected_answer claims only: the hash of the question that was
            judged. A question that has since changed has a different hash, and
            the claim does not apply to it.
        shown:
          type: object
          properties:
            structure_hash:
              $ref: '#/components/schemas/StructureHashOutput'
          required:
            - structure_hash
          additionalProperties: true
          description: The structure whose answers the person saw.
          x-moonbounce-sdk-known-fields: true
      required:
        - claim
        - shown
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    ExportedEvaluation:
      oneOf:
        - type: object
          properties:
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            item_id:
              type: string
            assignment_mode:
              $ref: '#/components/schemas/AssignmentModeOutput'
            created_at:
              $ref: '#/components/schemas/Timestamp'
            version:
              type: object
              properties:
                structure_hash:
                  $ref: '#/components/schemas/StructureHashOutput'
                binding:
                  type: integer
                  minimum: 1
                engine_profile:
                  type: string
              required:
                - structure_hash
                - binding
                - engine_profile
              additionalProperties: true
              x-moonbounce-sdk-known-fields: true
            via:
              type: string
              description: >-
                A zero-based rule index, `cases.<label>` for an exact matched
                case, or `else` for the fallback.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: Every aggregation's result, as evaluate returned it.
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/ExportedAnswer'
              description: Each question's answer, by question name.
            content:
              anyOf:
                - $ref: '#/components/schemas/ExportedState'
                - type: 'null'
              description: >-
                The content judged; null when the decision does not store
                content.
            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:
            - id
            - item_id
            - assignment_mode
            - created_at
            - version
            - aggregations
            - answers
            - content
            - status
            - value
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            item_id:
              type: string
            assignment_mode:
              $ref: '#/components/schemas/AssignmentModeOutput'
            created_at:
              $ref: '#/components/schemas/Timestamp'
            version:
              type: object
              properties:
                structure_hash:
                  $ref: '#/components/schemas/StructureHashOutput'
                binding:
                  type: integer
                  minimum: 1
                engine_profile:
                  type: string
              required:
                - structure_hash
                - binding
                - engine_profile
              additionalProperties: true
              x-moonbounce-sdk-known-fields: true
            via:
              type: string
              description: >-
                A zero-based rule index, `cases.<label>` for an exact matched
                case, or `else` for the fallback.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: Every aggregation's result, as evaluate returned it.
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/ExportedAnswer'
              description: Each question's answer, by question name.
            content:
              anyOf:
                - $ref: '#/components/schemas/ExportedState'
                - type: 'null'
              description: >-
                The content judged; null when the decision does not store
                content.
            status:
              type: string
              enum:
                - decided
            value:
              type: number
            outcome:
              $ref: '#/components/schemas/Outcome'
            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:
            - id
            - item_id
            - assignment_mode
            - created_at
            - version
            - aggregations
            - answers
            - content
            - status
            - outcome
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            id:
              $ref: '#/components/schemas/EvlIdOutput'
            item_id:
              type: string
            assignment_mode:
              $ref: '#/components/schemas/AssignmentModeOutput'
            created_at:
              $ref: '#/components/schemas/Timestamp'
            version:
              type: object
              properties:
                structure_hash:
                  $ref: '#/components/schemas/StructureHashOutput'
                binding:
                  type: integer
                  minimum: 1
                engine_profile:
                  type: string
              required:
                - structure_hash
                - binding
                - engine_profile
              additionalProperties: true
              x-moonbounce-sdk-known-fields: true
            via:
              type: string
              description: >-
                A zero-based rule index, `cases.<label>` for an exact matched
                case, or `else` for the fallback.
            aggregations:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/AggregationResult'
              description: Every aggregation's result, as evaluate returned it.
            answers:
              type: object
              additionalProperties:
                $ref: '#/components/schemas/ExportedAnswer'
              description: Each question's answer, by question name.
            content:
              anyOf:
                - $ref: '#/components/schemas/ExportedState'
                - type: 'null'
              description: >-
                The content judged; null when the decision does not store
                content.
            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/Outcome'
            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:
            - id
            - item_id
            - assignment_mode
            - created_at
            - version
            - aggregations
            - answers
            - content
            - status
          additionalProperties: true
          x-moonbounce-sdk-known-fields: true
    Split:
      type: string
      enum:
        - seed
        - train
    ClaimOutput:
      oneOf:
        - type: object
          properties:
            kind:
              type: string
              enum:
                - expected_answer
            question:
              type: string
              minLength: 1
              maxLength: 64
              description: A question of the evaluation's structure.
            value:
              type: boolean
              description: >-
                What the question's answer should have been: true or false for a
                noul question.
          required:
            - kind
            - question
            - value
          additionalProperties: true
          description: >-
            What one question's answer should have been. It is stored against
            the question as it was asked (its hash), so a reworded question does
            not inherit it. Aggregations and attributes take none: aggregations
            are computed and attributes are facts you supplied.
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            kind:
              type: string
              enum:
                - expected_outcome
            value:
              type: string
              minLength: 1
              maxLength: 200
              description: One of the outcomes the decision's result can produce.
          required:
            - kind
            - value
          additionalProperties: true
          description: >-
            The outcome the decision should have produced. A decision whose
            result is a value (a number) has no outcome and takes no
            expected_outcome or verdict.
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            kind:
              type: string
              enum:
                - verdict
            value:
              type: string
              enum:
                - approve
                - reject
              description: 'approve: the shown outcome was right. reject: it was wrong.'
          required:
            - kind
            - value
          additionalProperties: true
          description: >-
            Approve or reject the outcome that was shown. Needs
            `about.evaluation_id`, and an evaluation whose outcome was shown to
            someone: primary traffic that decided (status `decided`). An
            evaluation that abstained has only a fallback outcome, whatever it
            is called. Not with expected_outcome in one submission.
          x-moonbounce-sdk-known-fields: true
        - type: object
          properties:
            kind:
              type: string
              enum:
                - input_broken
            problem:
              type: string
              enum:
                - truncated
                - wrong_language
                - bad_extraction
                - unreadable
                - other
          required:
            - kind
            - problem
          additionalProperties: true
          description: >-
            The content could not be judged. The evaluation is kept out of fits
            and previews.
          x-moonbounce-sdk-known-fields: true
    StructureHashOutput:
      type: string
      pattern: ^sha256:[0-9a-f]{64}$
    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}$
    AssignmentModeOutput:
      type: string
      enum:
        - primary
        - shadow
        - backtest
        - seed
    AggregationResult:
      type: object
      properties:
        type:
          type: string
        value:
          type: number
        outcome:
          $ref: '#/components/schemas/Outcome'
        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
    ExportedAnswer:
      type: object
      properties:
        question_hash:
          type: string
          pattern: ^sha256:[0-9a-f]{64}$
          description: The hash of the question as it was asked.
        answer:
          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: The same System One answer object returned by evaluate.
        distribution:
          type: object
          additionalProperties:
            type: number
          description: >-
            The raw per-answer distribution as the engine returned it, never
            re-rounded.
        engine:
          type: string
        model:
          type: string
          description: The model the binding asked for.
        resolved_model:
          type: string
          description: The versioned model id that answered.
        adapter:
          type: string
          description: The adapter package and version.
        cached:
          type: boolean
          description: True when the answer came from the answer cache.
      required:
        - question_hash
        - answer
        - cached
      additionalProperties: true
      x-moonbounce-sdk-known-fields: true
    ExportedState:
      type: object
      properties:
        state:
          description: The state as submitted, including JSON null.
        attribute_values:
          $ref: '#/components/schemas/AttributeValues'
      required:
        - state
      additionalProperties: true
      description: >-
        Stored inputs. A null content wrapper means inputs were not stored;
        state:null inside the wrapper is a submitted JSON null.
      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
    Outcome:
      type: string
      minLength: 1
      maxLength: 200
      description: >-
        An outcome name, or the exact enum label when a string attribute is the
        result.
    AttributeValues:
      type: object
      additionalProperties:
        anyOf:
          - type: string
            maxLength: 200
          - type: number
          - type: boolean
  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.