Kalshi multivariate API

Multivariate event collection endpoints

OpenAPI Specification

kalshi-multivariate-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Kalshi Trade API Manual Endpoints account multivariate API
  version: 3.19.0
  description: Manually defined OpenAPI spec for endpoints being migrated to spec-first approach
servers:
- url: https://external-api.kalshi.com/trade-api/v2
  description: Production Trade API server
- url: https://api.elections.kalshi.com/trade-api/v2
  description: Production shared API server, also supported
- url: https://external-api.demo.kalshi.co/trade-api/v2
  description: Demo Trade API server
- url: https://demo-api.kalshi.co/trade-api/v2
  description: Demo shared API server, also supported
tags:
- name: multivariate
  description: Multivariate event collection endpoints
paths:
  /multivariate_event_collections/{collection_ticker}:
    get:
      operationId: GetMultivariateEventCollection
      summary: Get Multivariate Event Collection
      description: ' Endpoint for getting data about a multivariate event collection by its ticker.'
      tags:
      - multivariate
      parameters:
      - name: collection_ticker
        in: path
        required: true
        description: Collection ticker
        schema:
          type: string
      responses:
        '200':
          description: Collection retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetMultivariateEventCollectionResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      operationId: CreateMarketInMultivariateEventCollection
      summary: Create Market In Multivariate Event Collection
      description: Endpoint for creating an individual market in a multivariate event collection. This endpoint must be hit at least once before trading or looking up a market. Users are limited to 5000 creations per week.
      tags:
      - multivariate
      security:
      - kalshiAccessKey: []
        kalshiAccessSignature: []
        kalshiAccessTimestamp: []
      parameters:
      - name: collection_ticker
        in: path
        required: true
        description: Collection ticker
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateMarketInMultivariateEventCollectionRequest'
      responses:
        '200':
          description: Market created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateMarketInMultivariateEventCollectionResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /multivariate_event_collections:
    get:
      operationId: GetMultivariateEventCollections
      summary: Get Multivariate Event Collections
      description: ' Endpoint for getting data about multivariate event collections.'
      tags:
      - multivariate
      parameters:
      - name: status
        in: query
        description: Only return collections of a certain status. Can be unopened, open, or closed.
        schema:
          type: string
          enum:
          - unopened
          - open
          - closed
      - name: associated_event_ticker
        in: query
        description: Only return collections associated with a particular event ticker.
        schema:
          type: string
      - name: series_ticker
        in: query
        description: Only return collections with a particular series ticker.
        schema:
          type: string
      - name: limit
        in: query
        description: Specify the maximum number of results.
        schema:
          type: integer
          format: int32
          minimum: 1
          maximum: 200
      - name: cursor
        in: query
        description: The Cursor represents a pointer to the next page of records in the pagination. This optional parameter, when filled, should be filled with the cursor string returned in a previous request to this end-point.
        schema:
          type: string
      responses:
        '200':
          description: Collections retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetMultivariateEventCollectionsResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /multivariate_event_collections/{collection_ticker}/lookup:
    put:
      operationId: LookupTickersForMarketInMultivariateEventCollection
      summary: Lookup Tickers For Market In Multivariate Event Collection
      deprecated: true
      description: 'DEPRECATED: This endpoint predates RFQs and should not be used for new integrations. Endpoint for looking up an individual market in a multivariate event collection. If CreateMarketInMultivariateEventCollection has never been hit with that variable combination before, this will return a 404.'
      x-mint:
        content: '<Warning>

          This endpoint is deprecated and predates RFQs. Do not use it for new integrations.

          </Warning>


          <Note>

          **Rate limit:** 2 tokens per request. Other endpoints use the default cost of 10 tokens per request unless noted on their own page. See [Rate Limits and Tiers](/getting_started/rate_limits).

          </Note>

          '
      tags:
      - multivariate
      security:
      - kalshiAccessKey: []
        kalshiAccessSignature: []
        kalshiAccessTimestamp: []
      parameters:
      - name: collection_ticker
        in: path
        required: true
        description: Collection ticker
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LookupTickersForMarketInMultivariateEventCollectionRequest'
      responses:
        '200':
          description: Market looked up successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LookupTickersForMarketInMultivariateEventCollectionResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '500':
          $ref: '#/components/responses/InternalServerError'
    get:
      operationId: GetMultivariateEventCollectionLookupHistory
      summary: Get Multivariate Event Collection Lookup History
      deprecated: true
      description: 'DEPRECATED: This endpoint predates RFQs and should not be used for new integrations. Endpoint for retrieving which markets in an event collection were recently looked up.'
      x-mint:
        content: '<Warning>

          This endpoint is deprecated and predates RFQs. Do not use it for new integrations.

          </Warning>

          '
      tags:
      - multivariate
      parameters:
      - name: collection_ticker
        in: path
        required: true
        description: Collection ticker
        schema:
          type: string
      - name: lookback_seconds
        in: query
        required: true
        description: Number of seconds to look back for lookup history. Must be one of 10, 60, 300, or 3600.
        schema:
          type: integer
          format: int32
          enum:
          - 10
          - 60
          - 300
          - 3600
      responses:
        '200':
          description: Lookup history retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetMultivariateEventCollectionLookupHistoryResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    GetMultivariateEventCollectionResponse:
      type: object
      required:
      - multivariate_contract
      properties:
        multivariate_contract:
          $ref: '#/components/schemas/MultivariateEventCollection'
          description: The multivariate event collection.
    GetMultivariateEventCollectionsResponse:
      type: object
      required:
      - multivariate_contracts
      properties:
        multivariate_contracts:
          type: array
          items:
            $ref: '#/components/schemas/MultivariateEventCollection'
          description: List of multivariate event collections.
        cursor:
          type: string
          description: The Cursor represents a pointer to the next page of records in the pagination. Use the value returned here in the cursor query parameter for this end-point to get the next page containing limit records. An empty value of this field indicates there is no next page.
          x-go-type-skip-optional-pointer: true
    PriceRange:
      type: object
      required:
      - start
      - end
      - step
      properties:
        start:
          type: string
          description: Starting price for this range in dollars
        end:
          type: string
          description: Ending price for this range in dollars
        step:
          type: string
          description: Price step/tick size for this range in dollars
    CreateMarketInMultivariateEventCollectionResponse:
      type: object
      required:
      - event_ticker
      - market_ticker
      properties:
        event_ticker:
          type: string
          description: Event ticker for the created market.
        market_ticker:
          type: string
          description: Market ticker for the created market.
        market:
          $ref: '#/components/schemas/Market'
          description: Market payload of the created market.
    AssociatedEvent:
      type: object
      required:
      - ticker
      - is_yes_only
      - active_quoters
      properties:
        ticker:
          type: string
          description: The event ticker.
        is_yes_only:
          type: boolean
          description: Whether only the 'yes' side can be used for this event.
        size_max:
          type: integer
          format: int32
          nullable: true
          description: Maximum number of markets from this event (inclusive). Null means no limit.
        size_min:
          type: integer
          format: int32
          nullable: true
          description: Minimum number of markets from this event (inclusive). Null means no limit.
        active_quoters:
          type: array
          items:
            type: string
          description: List of active quoters for this event.
    LookupPoint:
      type: object
      required:
      - event_ticker
      - market_ticker
      - selected_markets
      - last_queried_ts
      properties:
        event_ticker:
          type: string
          description: Event ticker for the lookup point.
        market_ticker:
          type: string
          description: Market ticker for the lookup point.
        selected_markets:
          type: array
          items:
            $ref: '#/components/schemas/TickerPair'
          description: Markets that were selected for this lookup.
        last_queried_ts:
          type: string
          format: date-time
          description: Timestamp when this lookup was last queried.
    LookupTickersForMarketInMultivariateEventCollectionResponse:
      type: object
      required:
      - event_ticker
      - market_ticker
      properties:
        event_ticker:
          type: string
          description: Event ticker for the looked up market.
        market_ticker:
          type: string
          description: Market ticker for the looked up market.
    ExchangeIndex:
      type: integer
      description: 'Identifier for an exchange shard. Defaults to 0 if unspecified. Note: currently only 0 supported.'
      example: 0
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          description: Error code
        message:
          type: string
          description: Human-readable error message
        details:
          type: string
          description: Additional details about the error, if available
        service:
          type: string
          description: The name of the service that generated the error
    LookupTickersForMarketInMultivariateEventCollectionRequest:
      type: object
      required:
      - selected_markets
      properties:
        selected_markets:
          type: array
          items:
            $ref: '#/components/schemas/TickerPair'
          description: List of selected markets that act as parameters to determine which market is produced.
    TickerPair:
      type: object
      required:
      - market_ticker
      - event_ticker
      - side
      properties:
        market_ticker:
          type: string
          description: Market ticker identifier.
        event_ticker:
          type: string
          description: Event ticker identifier.
        side:
          type: string
          enum:
          - 'yes'
          - 'no'
          description: Side of the market (yes or no).
    GetMultivariateEventCollectionLookupHistoryResponse:
      type: object
      required:
      - lookup_points
      properties:
        lookup_points:
          type: array
          items:
            $ref: '#/components/schemas/LookupPoint'
          description: List of recent lookup points in the collection.
    Market:
      type: object
      required:
      - ticker
      - event_ticker
      - market_type
      - yes_sub_title
      - no_sub_title
      - created_time
      - updated_time
      - open_time
      - close_time
      - latest_expiration_time
      - settlement_timer_seconds
      - status
      - notional_value_dollars
      - yes_bid_dollars
      - yes_ask_dollars
      - no_bid_dollars
      - no_ask_dollars
      - yes_bid_size_fp
      - yes_ask_size_fp
      - last_price_dollars
      - previous_yes_bid_dollars
      - previous_yes_ask_dollars
      - previous_price_dollars
      - volume_fp
      - volume_24h_fp
      - liquidity_dollars
      - open_interest_fp
      - result
      - can_close_early
      - fractional_trading_enabled
      - expiration_value
      - rules_primary
      - rules_secondary
      - price_level_structure
      - price_ranges
      properties:
        ticker:
          type: string
        event_ticker:
          type: string
        market_type:
          type: string
          enum:
          - binary
          - scalar
          description: Identifies the type of market
        title:
          type: string
          deprecated: true
          x-go-type-skip-optional-pointer: true
        subtitle:
          type: string
          deprecated: true
          x-go-type-skip-optional-pointer: true
        yes_sub_title:
          type: string
          description: Shortened title for the yes side of this market
        no_sub_title:
          type: string
          description: Shortened title for the no side of this market
        created_time:
          type: string
          format: date-time
        updated_time:
          type: string
          format: date-time
          description: Time of the last non-trading metadata update.
        open_time:
          type: string
          format: date-time
        close_time:
          type: string
          format: date-time
        expected_expiration_time:
          type: string
          format: date-time
          nullable: true
          x-omitempty: true
          description: Time when this market is expected to expire
        expiration_time:
          type: string
          format: date-time
          deprecated: true
          x-go-type-skip-optional-pointer: true
        latest_expiration_time:
          type: string
          format: date-time
          description: Latest possible time for this market to expire
        settlement_timer_seconds:
          type: integer
          description: The amount of time after determination that the market settles
        status:
          type: string
          enum:
          - initialized
          - inactive
          - active
          - closed
          - determined
          - disputed
          - amended
          - finalized
          description: The current status of the market in its lifecycle.
        response_price_units:
          type: string
          enum:
          - usd_cent
          deprecated: true
          description: 'DEPRECATED: Use price_level_structure and price_ranges instead.'
          x-go-type-skip-optional-pointer: true
        yes_bid_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the highest YES buy offer on this market in dollars
        yes_bid_size_fp:
          $ref: '#/components/schemas/FixedPointCount'
          description: Total contract size of orders to buy YES at the best bid price (fixed-point count string).
        yes_ask_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the lowest YES sell offer on this market in dollars
        yes_ask_size_fp:
          $ref: '#/components/schemas/FixedPointCount'
          description: Total contract size of orders to sell YES at the best ask price (fixed-point count string).
        no_bid_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the highest NO buy offer on this market in dollars
        no_ask_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the lowest NO sell offer on this market in dollars
        last_price_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the last traded YES contract on this market in dollars
        volume_fp:
          $ref: '#/components/schemas/FixedPointCount'
          description: String representation of the market volume in contracts
        volume_24h_fp:
          $ref: '#/components/schemas/FixedPointCount'
          description: String representation of the 24h market volume in contracts
        result:
          type: string
          enum:
          - 'yes'
          - 'no'
          - scalar
          - ''
        can_close_early:
          type: boolean
        fractional_trading_enabled:
          type: boolean
          deprecated: true
          description: Deprecated. This flag is always `true` and carries no information. Will be removed after a pre-announcement with the removal date.
        open_interest_fp:
          $ref: '#/components/schemas/FixedPointCount'
          description: String representation of the number of contracts bought on this market disconsidering netting
        notional_value_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: The total value of a single contract at settlement in dollars
        previous_yes_bid_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the highest YES buy offer on this market a day ago in dollars
        previous_yes_ask_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the lowest YES sell offer on this market a day ago in dollars
        previous_price_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          description: Price for the last traded YES contract on this market a day ago in dollars
        liquidity_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          deprecated: true
          description: 'DEPRECATED: This field is deprecated and will always return "0.0000".'
        settlement_value_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          nullable: true
          x-omitempty: true
          description: The settlement value of the YES/LONG side of the contract in dollars. Only filled after determination
        settlement_ts:
          type: string
          format: date-time
          nullable: true
          x-omitempty: true
          description: Timestamp when the market was settled. Only filled for settled markets
        expiration_value:
          type: string
          description: The value that was considered for the settlement
        occurrence_datetime:
          type: string
          format: date-time
          nullable: true
          description: The recorded datetime when the underlying event occurred, if available
        fee_waiver_expiration_time:
          type: string
          format: date-time
          nullable: true
          x-omitempty: true
          description: Time when this market's fee waiver expires
        early_close_condition:
          type: string
          nullable: true
          x-omitempty: true
          description: The condition under which the market can close early
          x-go-type-skip-optional-pointer: true
        strike_type:
          type: string
          enum:
          - greater
          - greater_or_equal
          - less
          - less_or_equal
          - between
          - functional
          - custom
          - structured
          x-omitempty: true
          description: Strike type defines how the market strike is defined and evaluated
          x-go-type-skip-optional-pointer: true
        floor_strike:
          type: number
          format: double
          nullable: true
          x-omitempty: true
          description: Minimum expiration value that leads to a YES settlement
        cap_strike:
          type: number
          format: double
          nullable: true
          x-omitempty: true
          description: Maximum expiration value that leads to a YES settlement
        functional_strike:
          type: string
          nullable: true
          x-omitempty: true
          description: Mapping from expiration values to settlement values
        custom_strike:
          type: object
          nullable: true
          x-omitempty: true
          description: Expiration value for each target that leads to a YES settlement
        rules_primary:
          type: string
          description: A plain language description of the most important market terms
        rules_secondary:
          type: string
          description: A plain language description of secondary market terms
        mve_collection_ticker:
          type: string
          x-omitempty: true
          description: The ticker of the multivariate event collection
          x-go-type-skip-optional-pointer: true
        mve_selected_legs:
          type: array
          x-omitempty: true
          items:
            $ref: '#/components/schemas/MveSelectedLeg'
          x-go-type-skip-optional-pointer: true
        primary_participant_key:
          type: string
          nullable: true
          x-omitempty: true
        price_level_structure:
          type: string
          description: Price level structure for this market, defining price ranges and tick sizes
        price_ranges:
          type: array
          description: Valid price ranges for orders on this market
          items:
            $ref: '#/components/schemas/PriceRange'
        is_provisional:
          type: boolean
          x-omitempty: true
          description: If true, the market may be removed after determination if there is no activity on it
          x-go-type-skip-optional-pointer: true
        exchange_index:
          allOf:
          - $ref: '#/components/schemas/ExchangeIndex'
          x-go-type-skip-optional-pointer: true
    FixedPointCount:
      type: string
      description: Fixed-point contract count string (2 decimals, e.g., "10.00"; referred to as "fp" in field names). Requests accept 0–2 decimal places (e.g., "10", "10.0", "10.00"); responses always emit 2 decimals. Fractional contract values (e.g., "2.50") are supported on markets with fractional trading enabled; the minimum granularity is 0.01 contracts. Integer contract count fields are legacy and will be deprecated; when both integer and fp fields are provided, they must match.
      example: '10.00'
    MultivariateEventCollection:
      type: object
      required:
      - collection_ticker
      - series_ticker
      - title
      - description
      - open_date
      - close_date
      - associated_events
      - associated_event_tickers
      - is_ordered
      - is_single_market_per_event
      - is_all_yes
      - size_min
      - size_max
      - functional_description
      properties:
        collection_ticker:
          type: string
          description: Unique identifier for the collection.
        series_ticker:
          type: string
          description: Series associated with the collection. Events produced in the collection will be associated with this series.
        title:
          type: string
          description: Title of the collection.
        description:
          type: string
          description: Short description of the collection.
        open_date:
          type: string
          format: date-time
          description: The open date of the collection. Before this time, the collection cannot be interacted with.
        close_date:
          type: string
          format: date-time
          description: The close date of the collection. After this time, the collection cannot be interacted with.
        associated_events:
          type: array
          items:
            $ref: '#/components/schemas/AssociatedEvent'
          description: List of events with their individual configuration.
        associated_event_tickers:
          type: array
          items:
            type: string
          description: '[DEPRECATED - Use associated_events instead] A list of events associated with the collection. Markets in these events can be passed as inputs to the Lookup and Create endpoints.'
        is_ordered:
          type: boolean
          description: Whether the collection is ordered. If true, the order of markets passed into Lookup/Create affects the output. If false, the order does not matter.
        is_single_market_per_event:
          type: boolean
          description: '[DEPRECATED - Use associated_events instead] Whether the collection accepts multiple markets from the same event passed into Lookup/Create.'
        is_all_yes:
          type: boolean
          description: '[DEPRECATED - Use associated_events instead] Whether the collection requires that only the market side of ''yes'' may be used.'
        size_min:
          type: integer
          format: int32
          description: The minimum number of markets that must be passed into Lookup/Create (inclusive).
        size_max:
          type: integer
          format: int32
          description: The maximum number of markets that must be passed into Lookup/Create (inclusive).
        functional_description:
          type: string
          description: A functional description of the collection describing how inputs affect the output.
    FixedPointDollars:
      type: string
      description: US dollar amount as a fixed-point decimal string with up to 6 decimal places of precision. This is the maximum supported precision; valid quote intervals for a given market are constrained by that market's price level structure.
      example: '0.5600'
    CreateMarketInMultivariateEventCollectionRequest:
      type: object
      required:
      - selected_markets
      properties:
        selected_markets:
          type: array
          items:
            $ref: '#/components/schemas/TickerPair'
          description: List of selected markets that act as parameters to determine which market is created.
        with_market_payload:
          type: boolean
          description: Whether to include the market payload in the response.
    MveSelectedLeg:
      type: object
      properties:
        event_ticker:
          type: string
          description: Unique identifier for the selected event
          x-go-type-skip-optional-pointer: true
        market_ticker:
          type: string
          description: Unique identifier for the selected market
          x-go-type-skip-optional-pointer: true
        side:
          type: string
          description: The side of the selected market
          x-go-type-skip-optional-pointer: true
        yes_settlement_value_dollars:
          $ref: '#/components/schemas/FixedPointDollars'
          nullable: true
          x-omitempty: true
          description: The settlement value of the YES/LONG side of the contract in dollars. Only filled after determination
  responses:
    UnauthorizedError:
      description: Unauthorized - authentication required
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFoundError:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimitError:
      description: Rate limit exceeded. The default cost is 10 tokens per request; endpoints that deviate show a **Rate limit** callout at the top of their own page. See [Rate Limits and Tiers](/getting_started/rate_limits).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    BadRequestError:
      description: Bad request - invalid input
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalServerError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    kalshiAccessKey:
      type: apiKey
      in: header
      name: KALSHI-ACCESS-KEY
      description: Your API key ID
    kalshiAccessSignature:
      type: apiKey
      in: header
      name: KALSHI-ACCESS-SIGNATURE
      description: RSA-PSS signature of the request
    kalshiAccessTimestamp:
      type: apiKey
      in: header
      name: KALSHI-ACCESS-TIMESTAMP
      description: Request timestamp in milliseconds