OpenAPI Specification
openapi: 3.0.0
info:
title: Kalshi Trade API Manual Endpoints account fcm 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: fcm
description: FCM member specific endpoints
paths:
/fcm/orders:
get:
operationId: GetFCMOrders
summary: Get FCM Orders
description: 'Endpoint for FCM members to get orders filtered by subtrader ID.
This endpoint requires FCM member access level and allows filtering orders by subtrader ID.
'
tags:
- fcm
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- name: subtrader_id
in: query
required: true
description: Restricts the response to orders for a specific subtrader (FCM members only)
schema:
type: string
- $ref: '#/components/parameters/CursorQuery'
- $ref: '#/components/parameters/SingleEventTickerQuery'
- $ref: '#/components/parameters/TickerQuery'
- name: min_ts
in: query
description: Restricts the response to orders after a timestamp, formatted as a Unix Timestamp
schema:
type: integer
format: int64
- name: max_ts
in: query
description: Restricts the response to orders before a timestamp, formatted as a Unix Timestamp
schema:
type: integer
format: int64
- name: status
in: query
description: Restricts the response to orders that have a certain status
schema:
type: string
enum:
- resting
- canceled
- executed
- name: limit
in: query
description: Parameter to specify the number of results per page. Defaults to 100
schema:
type: integer
minimum: 1
maximum: 1000
responses:
'200':
description: Orders retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetOrdersResponse'
'400':
description: Bad request
'401':
description: Unauthorized
'404':
description: Not found
'500':
description: Internal server error
/fcm/positions:
get:
operationId: GetFCMPositions
summary: Get FCM Positions
description: 'Endpoint for FCM members to get market positions filtered by subtrader ID.
This endpoint requires FCM member access level and allows filtering positions by subtrader ID.
'
tags:
- fcm
security:
- kalshiAccessKey: []
kalshiAccessSignature: []
kalshiAccessTimestamp: []
parameters:
- name: subtrader_id
in: query
required: true
description: Restricts the response to positions for a specific subtrader (FCM members only)
schema:
type: string
- name: ticker
in: query
description: Ticker of desired positions
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: event_ticker
in: query
description: Event ticker of desired positions
schema:
type: string
x-go-type-skip-optional-pointer: true
- name: count_filter
in: query
description: Restricts the positions to those with any of following fields with non-zero values, as a comma separated list
schema:
type: string
- name: settlement_status
in: query
description: Settlement status of the markets to return. Defaults to unsettled
schema:
type: string
enum:
- all
- unsettled
- settled
- name: limit
in: query
description: Parameter to specify the number of results per page. Defaults to 100
schema:
type: integer
minimum: 1
maximum: 1000
- name: cursor
in: query
description: The Cursor represents a pointer to the next page of records in the pagination
schema:
type: string
responses:
'200':
description: Positions retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetPositionsResponse'
'400':
description: Bad request
'401':
description: Unauthorized
'404':
description: Not found
'500':
description: Internal server error
components:
schemas:
GetOrdersResponse:
type: object
required:
- orders
- cursor
properties:
orders:
type: array
items:
$ref: '#/components/schemas/Order'
cursor:
type: string
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'
SelfTradePreventionType:
type: string
enum:
- taker_at_cross
- maker
description: 'The self-trade prevention type for orders. `taker_at_cross` cancels the taker order when it would trade against another order from the same user; execution stops and any partial fills already matched are executed. `maker` cancels the resting maker order and continues matching.
'
ExchangeIndex:
type: integer
description: 'Identifier for an exchange shard. Defaults to 0 if unspecified. Note: currently only 0 supported.'
example: 0
OrderStatus:
type: string
enum:
- resting
- canceled
- executed
description: The status of an order
GetPositionsResponse:
type: object
required:
- market_positions
- event_positions
properties:
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.
market_positions:
type: array
items:
$ref: '#/components/schemas/MarketPosition'
description: List of market positions
event_positions:
type: array
items:
$ref: '#/components/schemas/EventPosition'
description: List of event positions
Order:
type: object
required:
- order_id
- user_id
- client_order_id
- ticker
- side
- action
- outcome_side
- book_side
- type
- status
- yes_price_dollars
- no_price_dollars
- fill_count_fp
- remaining_count_fp
- initial_count_fp
- taker_fees_dollars
- maker_fees_dollars
- taker_fill_cost_dollars
- maker_fill_cost_dollars
properties:
order_id:
type: string
user_id:
type: string
description: Unique identifier for users
client_order_id:
type: string
ticker:
type: string
side:
type: string
enum:
- 'yes'
- 'no'
deprecated: true
description: 'Deprecated. Use `outcome_side` (or `book_side`) instead. See [Order direction](/getting_started/order_direction). This field will not be removed before May 14, 2026.
'
action:
type: string
enum:
- buy
- sell
deprecated: true
description: 'Deprecated. Use `outcome_side` (or `book_side`) instead. See [Order direction](/getting_started/order_direction). This field will not be removed before May 14, 2026.
'
outcome_side:
type: string
enum:
- 'yes'
- 'no'
description: 'The outcome side this order is positioned for. buy-yes and sell-no produce ''yes''; buy-no and sell-yes produce ''no''.
`outcome_side` describes directional exposure only; it does not change the order''s price. An order at price `p` with `outcome_side=no` is matched by an order at the same price `p` with `outcome_side=yes` — both parties trade at the same price, just on opposite directions.
`outcome_side` and `book_side` will become the canonical way to determine order direction. The legacy `action`, `side`, and `is_yes` fields will be deprecated in a future release — please migrate to these new fields.
'
book_side:
$ref: '#/components/schemas/BookSide'
description: 'Same directional bit as outcome_side in book vocabulary. ''bid'' is equivalent to outcome_side ''yes''; ''ask'' is equivalent to outcome_side ''no''.
`outcome_side` and `book_side` will become the canonical way to determine order direction. The legacy `action`, `side`, and `is_yes` fields will be deprecated in a future release — please migrate to these new fields.
'
type:
type: string
enum:
- limit
- market
status:
$ref: '#/components/schemas/OrderStatus'
yes_price_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: The yes price for this order in fixed-point dollars
no_price_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: The no price for this order in fixed-point dollars
fill_count_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the number of contracts that have been filled
remaining_count_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the remaining contracts for this order
initial_count_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the initial size of the order (contract units)
taker_fill_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: The cost of filled taker orders in dollars
maker_fill_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: The cost of filled maker orders in dollars
taker_fees_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Fees paid on filled taker contracts, in dollars
maker_fees_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Fees paid on filled maker contracts, in dollars
expiration_time:
type: string
format: date-time
nullable: true
created_time:
type: string
format: date-time
nullable: true
x-omitempty: false
last_update_time:
type: string
format: date-time
nullable: true
x-omitempty: true
description: The last update to an order (modify, cancel, fill)
self_trade_prevention_type:
$ref: '#/components/schemas/SelfTradePreventionType'
nullable: true
x-omitempty: false
order_group_id:
type: string
nullable: true
description: The order group this order is part of
cancel_order_on_pause:
type: boolean
description: If this flag is set to true, the order will be canceled if the order is open and trading on the exchange is paused for any reason.
subaccount_number:
type: integer
nullable: true
x-omitempty: true
description: Subaccount number (0 for primary, 1-32 for subaccounts).
exchange_index:
allOf:
- $ref: '#/components/schemas/ExchangeIndex'
x-go-type-skip-optional-pointer: true
BookSide:
type: string
enum:
- bid
- ask
description: 'Side of the book for an order or trade. For event markets, this refers to the YES leg only: `bid` means buy YES, `ask` means sell YES. (Selling YES is economically equivalent to buying NO at `1 - price`, but this endpoint quotes everything from the YES side.)'
MarketPosition:
type: object
required:
- ticker
- total_traded_dollars
- position_fp
- market_exposure_dollars
- realized_pnl_dollars
- resting_orders_count
- fees_paid_dollars
- last_updated_ts
properties:
ticker:
type: string
description: Unique identifier for the market
x-go-type-skip-optional-pointer: true
total_traded_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Total spent on this market in dollars
position_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the number of contracts bought in this market. Negative means NO contracts and positive means YES contracts
market_exposure_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Cost of the aggregate market position in dollars
realized_pnl_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Locked in profit and loss, in dollars
resting_orders_count:
type: integer
format: int32
description: '[DEPRECATED] Aggregate size of resting orders in contract units'
deprecated: true
fees_paid_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Fees paid on fill orders, in dollars
last_updated_ts:
type: string
format: date-time
description: Last time the position is updated
EventPosition:
type: object
required:
- event_ticker
- total_cost_dollars
- total_cost_shares_fp
- event_exposure_dollars
- realized_pnl_dollars
- fees_paid_dollars
properties:
event_ticker:
type: string
description: Unique identifier for events
total_cost_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Total spent on this event in dollars
total_cost_shares_fp:
$ref: '#/components/schemas/FixedPointCount'
description: String representation of the total number of shares traded on this event (including both YES and NO contracts)
event_exposure_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Cost of the aggregate event position in dollars
realized_pnl_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Locked in profit and loss, in dollars
fees_paid_dollars:
$ref: '#/components/schemas/FixedPointDollars'
description: Fees paid on fill orders, in dollars
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'
parameters:
CursorQuery:
name: cursor
in: query
description: Pagination cursor. Use the cursor value returned from the previous response to get the next page of results. Leave empty for the first page.
schema:
type: string
x-go-type-skip-optional-pointer: true
SingleEventTickerQuery:
name: event_ticker
in: query
description: Event ticker to filter by. Only a single event ticker is supported.
schema:
type: string
x-go-type-skip-optional-pointer: true
TickerQuery:
name: ticker
in: query
description: Filter by market ticker
schema:
type: string
x-go-type-skip-optional-pointer: true
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