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

# Get the seller-analytics posture-conversion rollup

> Conversion rolled up by the negotiation posture the agent used over recent intelligence runs: per-posture run count, booked count, win rate, and booked budget, plus a recommendation-adherence summary (how often the selected posture matched the history-derived recommendation and whether following it converted better). Read `?limit=` to set the window size (default 100). Runs where no composition ran are excluded from the denominators.



## OpenAPI

````yaml /v2/storefront-api-v2.yaml get /seller-analytics
openapi: 3.0.0
info:
  title: Scope3 Storefront API
  version: 2.0.0
  description: |-
    REST API for partners to manage storefronts, inventory sources, and billing.

    ## Authentication

    All endpoints require a Bearer token in the Authorization header:
    ```
    Authorization: Bearer your-api-key
    ```

    ## Base URL

    `https://api.interchange.io/api/v2/storefront`

    ## For AI Agents

    AI agents can use the MCP endpoint at `/mcp/v2/storefront` with three tools:
    - `initialize`: Start an MCP session
    - `api_call`: Make REST API calls
    - `ask_about_capability`: Learn about API features
servers:
  - url: https://api.interchange.io/api/v2/storefront
    description: Production server
security: []
tags:
  - name: Account
    description: Account management, service tokens, and preferences
  - name: Storefront
    description: Manage storefront and inventory sources
  - name: Storefront Agents
    description: List and manage registered sales, signals, and outcomes agents
  - name: Storefront Activity
    description: Audit log of configuration and inventory changes on the storefront
  - name: Storefront Billing
    description: Payout bank details and billing configuration for storefronts
  - name: AI Usage
    description: Storefront AI token usage visibility by model
  - name: MCP
    description: Model Context Protocol endpoints
paths:
  /seller-analytics:
    get:
      tags:
        - Storefront
      summary: Get the seller-analytics posture-conversion rollup
      description: >-
        Conversion rolled up by the negotiation posture the agent used over
        recent intelligence runs: per-posture run count, booked count, win rate,
        and booked budget, plus a recommendation-adherence summary (how often
        the selected posture matched the history-derived recommendation and
        whether following it converted better). Read `?limit=` to set the window
        size (default 100). Runs where no composition ran are excluded from the
        denominators.
      operationId: getStorefrontSellerAnalytics
      parameters:
        - in: query
          name: limit
          schema:
            description: How many of the most recent intelligence runs to aggregate over.
            example: 100
            default: 100
            type: integer
            minimum: 1
            maximum: 200
          description: How many of the most recent intelligence runs to aggregate over.
      responses:
        '200':
          description: Get the seller-analytics posture-conversion rollup
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorefrontSellerAnalyticsResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: No storefront exists for the calling operator.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearerAuth: []
components:
  schemas:
    StorefrontSellerAnalyticsResponse:
      description: >-
        Seller-facing analytics rollup over a window of recent intelligence
        runs: summary KPIs, commercial outcomes, posture conversion with
        recommendation-adherence, recommendations, and recent runs.
      type: object
      properties:
        generatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        storefront:
          nullable: true
          type: object
          properties:
            id:
              type: string
            name:
              type: string
            state:
              type: string
              enum:
                - neutral
                - paused
                - archived
          required:
            - id
            - name
            - state
          additionalProperties: false
        window:
          type: object
          properties:
            requestedRunLimit:
              type: integer
              maximum: 9007199254740991
              minimum: 1
            runCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            firstRunAt:
              nullable: true
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            lastRunAt:
              nullable: true
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          required:
            - requestedRunLimit
            - runCount
            - firstRunAt
            - lastRunAt
          additionalProperties: false
        summary:
          type: object
          properties:
            totalRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            okRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            skippedRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            errorRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            briefRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            refineRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            wholesaleRuns:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            totalShownProducts:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            averageShownProducts:
              type: number
              minimum: 0
            priceObjectionCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            packagingAskCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            requestAskCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            productAskCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            proposalAskCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            appliedRefinements:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            partialRefinements:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            unableRefinements:
              type: integer
              minimum: 0
              maximum: 9007199254740991
          required:
            - totalRuns
            - okRuns
            - skippedRuns
            - errorRuns
            - briefRuns
            - refineRuns
            - wholesaleRuns
            - totalShownProducts
            - averageShownProducts
            - priceObjectionCount
            - packagingAskCount
            - requestAskCount
            - productAskCount
            - proposalAskCount
            - appliedRefinements
            - partialRefinements
            - unableRefinements
          additionalProperties: false
        outcomes:
          type: object
          properties:
            attributedRunCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            eventCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            submittedCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            forwardedCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            forwardFailedCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            rejectedCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            deliveryReportedCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            bookedMediaBuyCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            bookedBudget:
              type: number
              minimum: 0
            deliveredImpressions:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            deliveredSpend:
              type: number
              minimum: 0
            deliveredCurrency:
              nullable: true
              type: string
          required:
            - attributedRunCount
            - eventCount
            - submittedCount
            - forwardedCount
            - forwardFailedCount
            - rejectedCount
            - deliveryReportedCount
            - bookedMediaBuyCount
            - bookedBudget
            - deliveredImpressions
            - deliveredSpend
            - deliveredCurrency
          additionalProperties: false
        historicalPerformance:
          type: object
          properties:
            runCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            bookedRunCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            winRate:
              nullable: true
              type: number
              minimum: 0
            askRunCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            askToBookConversionRate:
              nullable: true
              type: number
              minimum: 0
            priceObjectionConversionRate:
              nullable: true
              type: number
              minimum: 0
            packagingAskConversionRate:
              nullable: true
              type: number
              minimum: 0
            averageBookedBudget:
              nullable: true
              type: number
              minimum: 0
            averageProductsPerRun:
              type: number
              minimum: 0
            averageProductsPerBookedRun:
              nullable: true
              type: number
              minimum: 0
            averageProductsPerUnbookedRun:
              nullable: true
              type: number
              minimum: 0
            deliveryRate:
              nullable: true
              type: number
              minimum: 0
            repeatBuyerCount:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            recommendedPosture:
              nullable: true
              type: string
              enum:
                - direct_fit
                - hold_value
                - value_preserving_compromise
                - tradeoff_ladder
                - price_first
                - wholesale_mirror
          required:
            - runCount
            - bookedRunCount
            - winRate
            - askRunCount
            - askToBookConversionRate
            - priceObjectionConversionRate
            - packagingAskConversionRate
            - averageBookedBudget
            - averageProductsPerRun
            - averageProductsPerBookedRun
            - averageProductsPerUnbookedRun
            - deliveryRate
            - repeatBuyerCount
            - recommendedPosture
          additionalProperties: false
        seasonality:
          type: array
          items:
            type: object
            properties:
              period:
                type: string
              runCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              bookedRunCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              winRate:
                type: number
                minimum: 0
              askRunCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              askToBookConversionRate:
                nullable: true
                type: number
                minimum: 0
              priceObjectionCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              packagingAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              bookedBudget:
                type: number
                minimum: 0
              averageBookedBudget:
                nullable: true
                type: number
                minimum: 0
              averageShownProducts:
                type: number
                minimum: 0
              recommendedPosture:
                nullable: true
                type: string
                enum:
                  - direct_fit
                  - hold_value
                  - value_preserving_compromise
                  - tradeoff_ladder
                  - price_first
                  - wholesale_mirror
            required:
              - period
              - runCount
              - bookedRunCount
              - winRate
              - askRunCount
              - askToBookConversionRate
              - priceObjectionCount
              - packagingAskCount
              - bookedBudget
              - averageBookedBudget
              - averageShownProducts
              - recommendedPosture
            additionalProperties: false
        buyers:
          type: array
          items:
            type: object
            properties:
              operatorDomain:
                nullable: true
                type: string
              brandDomain:
                nullable: true
                type: string
              country:
                nullable: true
                type: string
              firstRunAt:
                nullable: true
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              lastRunAt:
                nullable: true
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              runCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              bookedRunCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              winRate:
                type: number
                minimum: 0
              askRunCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              askToBookConversionRate:
                nullable: true
                type: number
                minimum: 0
              attributedRunCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              eventCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              totalShownProducts:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              averageShownProducts:
                type: number
                minimum: 0
              priceObjectionCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              packagingAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              requestAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              productAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              proposalAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              bookedMediaBuyCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              bookedBudget:
                type: number
                minimum: 0
              averageBookedBudget:
                nullable: true
                type: number
                minimum: 0
              deliveredImpressions:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              deliveredSpend:
                type: number
                minimum: 0
              deliveredCurrency:
                nullable: true
                type: string
              recommendedPosture:
                nullable: true
                type: string
                enum:
                  - direct_fit
                  - hold_value
                  - value_preserving_compromise
                  - tradeoff_ladder
                  - price_first
                  - wholesale_mirror
            required:
              - operatorDomain
              - brandDomain
              - country
              - firstRunAt
              - lastRunAt
              - runCount
              - bookedRunCount
              - winRate
              - askRunCount
              - askToBookConversionRate
              - attributedRunCount
              - eventCount
              - totalShownProducts
              - averageShownProducts
              - priceObjectionCount
              - packagingAskCount
              - requestAskCount
              - productAskCount
              - proposalAskCount
              - bookedMediaBuyCount
              - bookedBudget
              - averageBookedBudget
              - deliveredImpressions
              - deliveredSpend
              - deliveredCurrency
              - recommendedPosture
            additionalProperties: false
        postureConversion:
          type: object
          properties:
            byPosture:
              type: array
              items:
                type: object
                properties:
                  posture:
                    type: string
                    enum:
                      - direct_fit
                      - hold_value
                      - value_preserving_compromise
                      - tradeoff_ladder
                      - price_first
                      - wholesale_mirror
                  runCount:
                    type: integer
                    maximum: 9007199254740991
                    minimum: 1
                  bookedRunCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  winRate:
                    type: number
                    minimum: 0
                  bookedBudget:
                    type: number
                    minimum: 0
                required:
                  - posture
                  - runCount
                  - bookedRunCount
                  - winRate
                  - bookedBudget
                additionalProperties: false
            adherence:
              type: object
              properties:
                comparableRunCount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                followedCount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                followedWinRate:
                  nullable: true
                  type: number
                  minimum: 0
                divergedWinRate:
                  nullable: true
                  type: number
                  minimum: 0
              required:
                - comparableRunCount
                - followedCount
                - followedWinRate
                - divergedWinRate
              additionalProperties: false
          required:
            - byPosture
            - adherence
          additionalProperties: false
        learnedDefault:
          nullable: true
          type: object
          properties:
            posture:
              type: string
              enum:
                - direct_fit
                - hold_value
                - value_preserving_compromise
                - tradeoff_ladder
                - price_first
                - wholesale_mirror
            reason:
              nullable: true
              type: string
            checkedAt:
              nullable: true
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          required:
            - posture
            - reason
            - checkedAt
          additionalProperties: false
        strategySignals:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              priority:
                type: string
                enum:
                  - high
                  - medium
                  - low
              label:
                type: string
              detail:
                type: string
              posture:
                type: string
                enum:
                  - direct_fit
                  - hold_value
                  - value_preserving_compromise
                  - tradeoff_ladder
                  - price_first
                  - wholesale_mirror
              evidence:
                type: array
                items:
                  type: object
                  properties:
                    label:
                      type: string
                    value:
                      type: string
                  required:
                    - label
                    - value
                  additionalProperties: false
            required:
              - id
              - priority
              - label
              - detail
              - posture
              - evidence
            additionalProperties: false
        sellerRecommendations:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              priority:
                type: string
                enum:
                  - high
                  - medium
                  - low
              kind:
                type: string
                enum:
                  - protect_expand
                  - prioritize_follow_up
                  - packaging_friction
                  - price_resistance
                  - tighten_selection
                  - learned_auto_approve
              title:
                type: string
              detail:
                type: string
              action:
                type: string
              buyer:
                nullable: true
                type: object
                properties:
                  operatorDomain:
                    nullable: true
                    type: string
                  brandDomain:
                    nullable: true
                    type: string
                  country:
                    nullable: true
                    type: string
                required:
                  - operatorDomain
                  - brandDomain
                  - country
                additionalProperties: false
              evidence:
                type: array
                items:
                  type: object
                  properties:
                    label:
                      type: string
                    value:
                      type: string
                  required:
                    - label
                    - value
                  additionalProperties: false
            required:
              - id
              - priority
              - kind
              - title
              - detail
              - action
              - buyer
              - evidence
            additionalProperties: false
        runs:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              createdAt:
                type: string
                format: date-time
                pattern: >-
                  ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
              buyingMode:
                type: string
              resultKind:
                type: string
                enum:
                  - ok
                  - error
                  - skipped
              resultCode:
                nullable: true
                type: string
              selectedPosture:
                nullable: true
                type: string
                enum:
                  - direct_fit
                  - hold_value
                  - value_preserving_compromise
                  - tradeoff_ladder
                  - price_first
                  - wholesale_mirror
              recommendedPosture:
                nullable: true
                type: string
                enum:
                  - direct_fit
                  - hold_value
                  - value_preserving_compromise
                  - tradeoff_ladder
                  - price_first
                  - wholesale_mirror
              postureRationale:
                nullable: true
                type: string
              postureEvidence:
                type: array
                items:
                  type: string
              attributionState:
                type: string
                enum:
                  - attributed
                  - unattributed
              buyer:
                type: object
                properties:
                  operatorDomain:
                    nullable: true
                    type: string
                  brandDomain:
                    nullable: true
                    type: string
                  country:
                    nullable: true
                    type: string
                required:
                  - operatorDomain
                  - brandDomain
                  - country
                additionalProperties: false
              shownProductCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              minSellPrice:
                nullable: true
                type: number
              maxSellPrice:
                nullable: true
                type: number
              requestAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              productAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              proposalAskCount:
                type: integer
                minimum: 0
                maximum: 9007199254740991
              hadPriceObjection:
                type: boolean
              hadPackagingAsk:
                type: boolean
              refinementStatusCounts:
                type: object
                properties:
                  applied:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  partial:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  unable:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                required:
                  - applied
                  - partial
                  - unable
                additionalProperties: false
              outcome:
                type: object
                properties:
                  eventCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  latestType:
                    nullable: true
                    type: string
                  latestStatus:
                    nullable: true
                    type: string
                  mediaBuyId:
                    nullable: true
                    type: string
                  submittedCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  forwardedCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  forwardFailedCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  rejectedCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  deliveryReportedCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  bookedMediaBuyCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  bookedBudget:
                    nullable: true
                    type: number
                    minimum: 0
                  deliveredImpressions:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  deliveredSpend:
                    type: number
                    minimum: 0
                  deliveredCurrency:
                    nullable: true
                    type: string
                required:
                  - eventCount
                  - latestType
                  - latestStatus
                  - mediaBuyId
                  - submittedCount
                  - forwardedCount
                  - forwardFailedCount
                  - rejectedCount
                  - deliveryReportedCount
                  - bookedMediaBuyCount
                  - bookedBudget
                  - deliveredImpressions
                  - deliveredSpend
                  - deliveredCurrency
                additionalProperties: false
            required:
              - id
              - createdAt
              - buyingMode
              - resultKind
              - resultCode
              - selectedPosture
              - recommendedPosture
              - postureRationale
              - postureEvidence
              - attributionState
              - buyer
              - shownProductCount
              - minSellPrice
              - maxSellPrice
              - requestAskCount
              - productAskCount
              - proposalAskCount
              - hadPriceObjection
              - hadPackagingAsk
              - refinementStatusCounts
              - outcome
            additionalProperties: false
        topProducts:
          type: array
          items:
            type: object
            properties:
              productId:
                type: string
              name:
                nullable: true
                type: string
              impressions:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - productId
              - name
              - impressions
            additionalProperties: false
        notes:
          type: array
          items:
            type: string
      required:
        - generatedAt
        - storefront
        - window
        - summary
        - outcomes
        - historicalPerformance
        - seasonality
        - buyers
        - postureConversion
        - learnedDefault
        - strategySignals
        - sellerRecommendations
        - runs
        - topProducts
        - notes
      additionalProperties: false
    ErrorResponse:
      description: Standard error response
      type: object
      properties:
        data:
          type: string
          nullable: true
          enum:
            - null
        error:
          $ref: '#/components/schemas/ApiError'
      required:
        - data
        - error
      additionalProperties: false
    ApiError:
      description: Structured error object
      type: object
      properties:
        code:
          description: Machine-readable error code
          type: string
        message:
          description: Human-readable error message
          type: string
        field:
          description: Field path associated with the error
          type: string
        details:
          description: Additional error context
          type: object
          additionalProperties: {}
      required:
        - code
        - message
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key or access token

````