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

# Smart Money vs Crowd

> Compare opposing normalized net positioning of the top 20% of YTD leaders plus same-asset specialists against the remaining eligible traders. Leaders require 10 scored 30D positions by default, adjustable with minLeaderEvaluations. Ranks by the percentage-point gap.



## OpenAPI

````yaml /openapi-v2.json get /signals/smart-money
openapi: 3.1.0
info:
  title: Centaur API
  version: 2.0.0
  description: >-
    Public, read-only API for Centaur's data over REST with a companion MCP
    surface.
servers:
  - url: https://api.centaur.io/v2
    description: Centaur API v2
security: []
tags:
  - name: System
    description: Health and service metadata endpoints.
  - name: Discovery
    description: Read-only trader and asset directory discovery endpoints.
  - name: Events
    description: >-
      Historical trade-event reads with source, trader, asset, and position
      context.
  - name: Messages
    description: >-
      Read-only access to source messages by message timestamp or Source Message
      ID.
  - name: Channel Summaries
    description: Generated channel narrative summaries selected by Source Window overlap.
  - name: Aggregate Summaries
    description: >-
      Generated aggregate narrative summaries selected by Aggregate Window
      overlap.
  - name: Positions
    description: Read-only position history and open-position live state reads.
  - name: Stats
    description: Read-only aggregate trader and asset stats.
externalDocs:
  description: Canonical Centaur API documentation
  url: https://docs.centaur.io
paths:
  /signals/smart-money:
    get:
      tags:
        - Signal Intelligence
      summary: Smart Money vs Crowd
      description: >-
        Compare opposing normalized net positioning of the top 20% of YTD
        leaders plus same-asset specialists against the remaining eligible
        traders. Leaders require 10 scored 30D positions by default, adjustable
        with minLeaderEvaluations. Ranks by the percentage-point gap.
      operationId: get_smart_money
      parameters:
        - schema:
            anyOf:
              - type: integer
                minimum: 0
                exclusiveMinimum: true
                maximum: 2147483647
              - type: string
                pattern: ^\d+(\.\d+)?$
            default: 5
            description: >-
              Minimum scored YTD positions per trader and asset, using 30D
              evaluations.
          required: false
          description: >-
            Minimum scored YTD positions per trader and asset, using 30D
            evaluations.
          name: minEvaluations
          in: query
        - schema:
            anyOf:
              - type: number
                minimum: 0
                maximum: 100
              - type: string
                pattern: ^\d+(\.\d+)?$
            default: 60
            description: Minimum specialist win rate as a percentage.
          required: false
          description: Minimum specialist win rate as a percentage.
          name: minWinRatePercent
          in: query
        - schema:
            anyOf:
              - type: integer
                minimum: 0
                exclusiveMinimum: true
                maximum: 2147483647
              - type: string
                pattern: ^\d+(\.\d+)?$
            default: 10
            description: >-
              Minimum scored YTD positions per leader, using 30D evaluations.
              Does not affect specialist eligibility.
          required: false
          description: >-
            Minimum scored YTD positions per leader, using 30D evaluations. Does
            not affect specialist eligibility.
          name: minLeaderEvaluations
          in: query
        - schema:
            anyOf:
              - type: integer
                minimum: 1
                maximum: 50
              - type: string
                pattern: ^\d+(\.\d+)?$
            default: 50
            description: Maximum result groups. No cursor pagination.
          required: false
          description: Maximum result groups. No cursor pagination.
          name: limit
          in: query
      responses:
        '200':
          description: Smart Money vs Crowd
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/SignalSmartMoney'
                  requestId:
                    type: string
                    example: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
                required:
                  - success
                  - data
                  - requestId
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '422':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Usage limit reached
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '503':
          description: Authentication, database, or prices unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '504':
          description: Calculation time budget exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    SignalSmartMoney:
      type: object
      properties:
        calculationAt:
          type: string
          format: date-time
        coverage:
          $ref: '#/components/schemas/SignalPriceCoverage'
        parameters:
          type: object
          properties:
            limit:
              type: integer
              minimum: 1
              maximum: 50
            minEvaluations:
              type: integer
              minimum: 0
              exclusiveMinimum: true
            minWinRatePercent:
              type: number
              minimum: 0
              maximum: 100
            sampleWindow:
              type: string
              enum:
                - YTD
            evaluationWindow:
              type: string
              enum:
                - 30D
            minLeaderEvaluations:
              type: integer
              minimum: 0
              exclusiveMinimum: true
            leaderPercent:
              type: number
          required:
            - limit
            - minEvaluations
            - minWinRatePercent
            - sampleWindow
            - evaluationWindow
            - minLeaderEvaluations
            - leaderPercent
        results:
          type: array
          items:
            type: object
            properties:
              assetId:
                type: integer
                minimum: 0
                exclusiveMinimum: true
              gap:
                type: number
                nullable: true
              smart:
                type: object
                properties:
                  direction:
                    type: string
                    enum:
                      - long
                      - short
                  longs:
                    type: integer
                    minimum: 0
                  shorts:
                    type: integer
                    minimum: 0
                  net:
                    type: integer
                  eligibleCount:
                    type: integer
                    minimum: 0
                  netPercent:
                    type: number
                    nullable: true
                  averageEntry:
                    type: number
                    nullable: true
                  currentPrice:
                    type: number
                    nullable: true
                  currentQuoteAt:
                    type: string
                    nullable: true
                    format: date-time
                  priceStatus:
                    type: string
                    enum:
                      - available
                      - missing
                      - failed
                  openReturnPercent:
                    type: number
                    nullable: true
                required:
                  - direction
                  - longs
                  - shorts
                  - net
                  - eligibleCount
                  - netPercent
                  - averageEntry
                  - currentPrice
                  - currentQuoteAt
                  - priceStatus
                  - openReturnPercent
              crowd:
                type: object
                properties:
                  direction:
                    type: string
                    enum:
                      - long
                      - short
                  longs:
                    type: integer
                    minimum: 0
                  shorts:
                    type: integer
                    minimum: 0
                  net:
                    type: integer
                  eligibleCount:
                    type: integer
                    minimum: 0
                  netPercent:
                    type: number
                    nullable: true
                  averageEntry:
                    type: number
                    nullable: true
                  currentPrice:
                    type: number
                    nullable: true
                  currentQuoteAt:
                    type: string
                    nullable: true
                    format: date-time
                  priceStatus:
                    type: string
                    enum:
                      - available
                      - missing
                      - failed
                  openReturnPercent:
                    type: number
                    nullable: true
                required:
                  - direction
                  - longs
                  - shorts
                  - net
                  - eligibleCount
                  - netPercent
                  - averageEntry
                  - currentPrice
                  - currentQuoteAt
                  - priceStatus
                  - openReturnPercent
            required:
              - assetId
              - gap
              - smart
              - crowd
      required:
        - calculationAt
        - coverage
        - parameters
        - results
    ErrorEnvelope:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          $ref: '#/components/schemas/Error'
        requestId:
          type: string
          example: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
      required:
        - success
        - error
        - requestId
    SignalPriceCoverage:
      type: object
      properties:
        requestedAssets:
          type: integer
          minimum: 0
        availableAssets:
          type: integer
          minimum: 0
        insufficientHistoryAssets:
          type: integer
          minimum: 0
        missingAssets:
          type: integer
          minimum: 0
        failedAssets:
          type: integer
          minimum: 0
      required:
        - requestedAssets
        - availableAssets
        - insufficientHistoryAssets
        - missingAssets
        - failedAssets
    Error:
      type: object
      properties:
        code:
          type: string
          description: Stable machine-readable error code.
          example: UNAUTHORIZED
        message:
          type: string
          description: Human-readable explanation for the failure.
          example: Unauthorized
        details:
          nullable: true
          description: Optional structured details for validation or input failures.
      required:
        - code
        - message
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key issued by Centaur.
      x-default: <api-key>

````