Skip to content

FCM

Futures Commission Merchant routes. FCM-member accounts only — non-FCM calls come back 401/403. Auth required throughout.

subtrader_id is the required discriminator on every call — every FCM request scopes to one subtrader under your member account.

Quick reference

Method Endpoint
orders(*, subtrader_id, ...) GET /fcm/orders
orders_all(*, subtrader_id, ...) walks orders
positions(*, subtrader_id, ...) GET /fcm/positions

List orders

page = client.fcm.orders(
    subtrader_id="st_alpha",
    ticker="KXPRES-24-DJT",
    event_ticker="KXPRES-24",
    status="resting",              # OrderStatusLiteral
    min_ts=1_700_000_000,
    max_ts=1_800_000_000,
    limit=200,
)
for o in page:
    print(o.order_id, o.status, o.remaining_count)

for o in client.fcm.orders_all(subtrader_id="st_alpha", status="resting"):
    ...

Same Order model as Orders. Standard Page[Order] pagination on orders().

Positions

resp = client.fcm.positions(
    subtrader_id="st_alpha",
    event_ticker="KXPRES-24",
    count_filter="position",
    settlement_status="unsettled",     # SettlementStatusLiteral
    limit=200,
)
for mp in resp.market_positions:
    print(mp.ticker, mp.position)

positions() returns a PositionsResponse (same shape as portfolio.positions), not a Page. For cursor traversal use positions_all(), which auto-paginates /fcm/positions and yields each MarketPosition (it mirrors portfolio.positions_all() and takes the same filters — subtrader_id, ticker, event_ticker, count_filter, settlement_status, limit, max_pages):

for mp in client.fcm.positions_all(subtrader_id="st_alpha", settlement_status="unsettled"):
    print(mp.ticker, mp.position)
# async: `async for mp in client.fcm.positions_all(...)`

settlement_status is the FCM-specific kwarg that does not exist on portfolio.positions().

Reference

kalshi.resources.fcm.FcmResource

FcmResource(transport: SyncTransport)

Bases: SyncResource

Sync FCM API — orders and positions filtered by subtrader_id.

positions_all

positions_all(
    *,
    subtrader_id: str,
    ticker: str | None = None,
    event_ticker: str | None = None,
    count_filter: str | None = None,
    settlement_status: (
        SettlementStatusLiteral | None
    ) = None,
    limit: int | None = None,
    max_pages: int | None = None,
    extra_headers: dict[str, str] | None = None
) -> Iterator[MarketPosition]

Auto-paginate /fcm/positions, yielding each MarketPosition.

Mirrors :meth:PortfolioResource.positions_all. event_positions from the response envelope are intentionally not yielded; see that docstring for the rationale.

kalshi.resources.fcm.AsyncFcmResource

AsyncFcmResource(transport: AsyncTransport)

Bases: AsyncResource

Async FCM API.

orders_all

orders_all(
    *,
    subtrader_id: str,
    ticker: str | None = None,
    event_ticker: str | None = None,
    status: OrderStatusLiteral | None = None,
    min_ts: int | None = None,
    max_ts: int | None = None,
    limit: int | None = None,
    max_pages: int | None = None,
    extra_headers: dict[str, str] | None = None
) -> AsyncIterator[Order]

Returns an async iterator — use async for.

positions_all

positions_all(
    *,
    subtrader_id: str,
    ticker: str | None = None,
    event_ticker: str | None = None,
    count_filter: str | None = None,
    settlement_status: (
        SettlementStatusLiteral | None
    ) = None,
    limit: int | None = None,
    max_pages: int | None = None,
    extra_headers: dict[str, str] | None = None
) -> AsyncIterator[MarketPosition]

Async counterpart of :meth:FcmResource.positions_all. Use async for.