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: '
This endpoint is deprecated and predates RFQs. Do not use it for new integrations.
**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).
'
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: '
This endpoint is deprecated and predates RFQs. Do not use it for new integrations.
'
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