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