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

# List the curated partner feed

> Returns presentation-ready source-message groups ordered by message post time. Use cursor for scroll-back pagination or since for ingestion-watermark change polling with whole-group upsert semantics.



## OpenAPI

````yaml /openapi.json get /api/v1/feed
openapi: 3.1.0
info:
  title: Centaur API
  version: 1.0.0
  description: >-
    Public, read-only API for Centaur's data over REST with a companion MCP
    surface.
servers:
  - url: https://partners.centaur.io
    description: Current service base URL
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://partners.centaur.io/docs
paths:
  /api/v1/feed:
    get:
      tags:
        - Feed
      summary: List the curated partner feed
      description: >-
        Returns presentation-ready source-message groups ordered by message post
        time. Use cursor for scroll-back pagination or since for
        ingestion-watermark change polling with whole-group upsert semantics.
      operationId: listFeed
      parameters:
        - schema:
            anyOf:
              - type: string
              - type: array
                items:
                  type: string
              - type: array
                items:
                  type: number
            description: Filter to specific trader IDs.
          required: false
          description: Filter to specific trader IDs.
          name: traderIds
          in: query
        - schema:
            anyOf:
              - type: string
              - type: array
                items:
                  type: string
              - type: array
                items:
                  type: number
            description: Filter to specific asset IDs.
          required: false
          description: Filter to specific asset IDs.
          name: assetIds
          in: query
        - schema:
            type: string
            format: date-time
            description: >-
              Inclusive ISO-8601 lower time bound on source-message post time,
              clamped to the rolling seven-day feed window.
          required: false
          description: >-
            Inclusive ISO-8601 lower time bound on source-message post time,
            clamped to the rolling seven-day feed window.
          name: startTime
          in: query
        - schema:
            type: string
            format: date-time
            description: >-
              Inclusive ISO-8601 upper time bound on source-message post time.
              Defaults to the request time.
          required: false
          description: >-
            Inclusive ISO-8601 upper time bound on source-message post time.
            Defaults to the request time.
          name: endTime
          in: query
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            description: >-
              Maximum number of source-message groups to return. Defaults to 20,
              maximum 100.
          required: false
          description: >-
            Maximum number of source-message groups to return. Defaults to 20,
            maximum 100.
          name: limit
          in: query
        - schema:
            type: string
            minLength: 1
            description: >-
              Scroll-back cursor from `meta.nextCursor`; mutually exclusive with
              `since`.
          required: false
          description: >-
            Scroll-back cursor from `meta.nextCursor`; mutually exclusive with
            `since`.
          name: cursor
          in: query
        - schema:
            type: string
            minLength: 1
            description: >-
              Change-feed token from `meta.nextCursor`; returns groups changed
              after its ingestion watermark and is mutually exclusive with
              `cursor`.
          required: false
          description: >-
            Change-feed token from `meta.nextCursor`; returns groups changed
            after its ingestion watermark and is mutually exclusive with
            `cursor`.
          name: since
          in: query
      responses:
        '200':
          description: Paginated source-message groups with curated trading events
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/FeedResponseData'
                  requestId:
                    type: string
                    example: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
                required:
                  - success
                  - data
                  - requestId
        '400':
          description: Invalid cursor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                success: false
                error:
                  code: INVALID_CURSOR
                  message: Malformed cursor
                requestId: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                success: false
                error:
                  code: UNAUTHORIZED
                  message: Unauthorized
                requestId: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                success: false
                error:
                  code: FORBIDDEN
                  message: Forbidden
                requestId: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                success: false
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded
                requestId: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
        '503':
          description: Authentication service temporarily unavailable
          headers:
            Retry-After:
              description: Seconds to wait before retrying authentication
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                success: false
                error:
                  code: AUTHENTICATION_UNAVAILABLE
                  message: Authentication is temporarily unavailable
                requestId: c8e2c6e4-80dd-4ffc-9d66-4e31bf64c6b8
      security:
        - ApiKeyAuth: []
components:
  schemas:
    FeedResponseData:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/FeedItem'
        meta:
          type: object
          properties:
            hasMore:
              type: boolean
            nextCursor:
              type: string
              nullable: true
            appliedTimeRange:
              $ref: '#/components/schemas/AppliedTimeRange'
          required:
            - hasMore
            - nextCursor
            - appliedTimeRange
      required:
        - results
        - meta
    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
    FeedItem:
      type: object
      properties:
        id:
          type: string
          description: Opaque Source Message ID used as the group upsert key.
        writtenAt:
          type: string
          format: date-time
          description: Source-message post time used for group ordering and time filters.
        source:
          $ref: '#/components/schemas/FeedSource'
        trader:
          $ref: '#/components/schemas/FeedTrader'
        events:
          type: array
          items:
            $ref: '#/components/schemas/FeedEvent'
          minItems: 1
      required:
        - id
        - writtenAt
        - source
        - trader
        - events
    AppliedTimeRange:
      type: object
      properties:
        startTime:
          type: string
          nullable: true
          format: date-time
        endTime:
          type: string
          nullable: true
          format: date-time
      required:
        - startTime
        - endTime
    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
    FeedSource:
      type: object
      properties:
        platform:
          $ref: '#/components/schemas/SourcePlatform'
        url:
          type: string
          nullable: true
          description: Original source message URL when available.
        text:
          type: string
          nullable: true
          description: Sanitized source-message text when available.
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/Attachment'
        identity:
          $ref: '#/components/schemas/SourceIdentity'
      required:
        - platform
        - url
        - text
        - attachments
        - identity
    FeedTrader:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        slug:
          type: string
          nullable: true
        avatarUrl:
          type: string
          nullable: true
      required:
        - id
        - name
        - slug
        - avatarUrl
    FeedEvent:
      type: object
      properties:
        id:
          type: integer
        type:
          $ref: '#/components/schemas/EventType'
        price:
          type: number
          nullable: true
          description: Event price when extracted or assigned; null when unavailable.
        quoteSymbol:
          type: string
          nullable: true
          description: Quote currency of the asset's preferred active market.
        timeOfEvent:
          type: string
          format: date-time
        direction:
          $ref: '#/components/schemas/TraderDirection'
        assumed:
          type: boolean
          description: >-
            True when the retained event was inferred, including lone inferred
            opens, increases, or decreases.
        retrospective:
          type: boolean
        positionId:
          type: integer
        traderId:
          type: integer
        assetId:
          type: integer
        asset:
          $ref: '#/components/schemas/AssetSummary'
      required:
        - id
        - type
        - price
        - quoteSymbol
        - timeOfEvent
        - direction
        - assumed
        - retrospective
        - positionId
        - traderId
        - assetId
        - asset
    SourcePlatform:
      type: string
      enum:
        - TELEGRAM
        - X
    Attachment:
      type: object
      properties:
        type:
          type: string
        url:
          type: string
          format: uri
      required:
        - type
        - url
    SourceIdentity:
      type: object
      properties:
        platform:
          $ref: '#/components/schemas/SourcePlatform'
        sourceIdentityId:
          type: string
          description: >-
            Opaque platform-scoped source identity ID for the source account or
            channel.
        displayName:
          type: string
          nullable: true
          description: Display name for the source account or channel when available.
        handle:
          type: string
          nullable: true
          description: Public source handle when available.
        avatarUrl:
          type: string
          nullable: true
          description: Source account or channel avatar URL when available.
        profileUrl:
          type: string
          nullable: true
          description: Original source account or channel URL when available.
        audienceCount:
          type: integer
          nullable: true
          description: Follower or subscriber count when available.
      required:
        - platform
        - sourceIdentityId
        - displayName
        - handle
        - avatarUrl
        - profileUrl
        - audienceCount
    EventType:
      type: string
      enum:
        - open
        - close
        - increase
        - decrease
    TraderDirection:
      type: string
      enum:
        - long
        - short
    AssetSummary:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        symbol:
          type: string
        logoUrl:
          type: string
          nullable: true
      required:
        - id
        - name
        - symbol
        - logoUrl
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key issued by Centaur.
      x-default: <api-key>

````