Kalshi Schemas - TundraSoft/tundra-connect GitHub Wiki
Kalshi Schemas
The @tundraconnect/kalshi/schemas subpath exports Guardian validators
and inferred types.
import { MarketSchemaObject } from '@tundraconnect/kalshi/schemas';
const [error, market] = MarketSchemaObject.safeParse(rawResponse);
Market data
| Schema | Endpoint | Notes |
|---|---|---|
MarketSchemaObject |
GET /markets/*, GET /markets/{ticker} |
.passthrough() — unmodeled vendor fields (multivariate-event legs, structured strike details, price-range ladders, ...) survive on the parsed object. Fixed-point dollar/count strings are coerced to number. seriesTicker isn't on the wire — derived from eventTicker's prefix. |
MarketsPageSchemaObject |
GET /markets |
{ markets, cursor? }. |
SingleMarketSchemaObject |
GET /markets/{ticker} |
Unwraps the vendor's { "market": ... } envelope. |
OrderbookSchemaObject |
GET /markets/{ticker}/orderbook |
Unwraps orderbook_fp.{yes_dollars,no_dollars} (arrays of [priceString, countString] pairs) into {yes, no}: {price, count}[]. |
TradeSchemaObject/TradesPageSchemaObject |
GET /markets/trades |
Public trade tape (not account-specific — see FillSchemaObject for your own executions). |
EventSchemaObject/EventsPageSchemaObject |
GET /events, GET /events/{event_ticker} |
markets nests MarketSchemaObject entries when the request set withNestedMarkets: true. |
SeriesSchemaObject/SeriesListResponseSchemaObject |
GET /series, GET /series/{series_ticker} |
The top-level grouping above events. |
ExchangeStatusSchemaObject |
GET /exchange/status |
{ exchangeActive, tradingActive, ... }. |
Portfolio & orders
| Schema | Endpoint | Notes |
|---|---|---|
BalanceSchemaObject |
GET /portfolio/balance |
Cents (balance) plus a dollar-formatted echo (balanceDollars) and portfolioValue. |
MarketPositionSchemaObject/EventPositionSchemaObject |
GET /portfolio/positions |
position is signed — negative = NO side, positive = YES. |
FillSchemaObject/FillsPageSchemaObject |
GET /portfolio/fills |
Your own executions. |
OrderSchemaObject/OrdersPageSchemaObject/SingleOrderSchemaObject |
GET /portfolio/orders, GET /portfolio/orders/{id} |
The rich list/status shape — status, outcomeSide/bookSide, fees, timestamps. SingleOrderSchemaObject unwraps { "order": ... }. |
OrderAckSchemaObject |
POST /portfolio/events/orders (create), .../amend |
Flat create/amend response — no status field (an order is active immediately on creation). |
CancelAckSchemaObject |
DELETE /portfolio/events/orders/{id} |
Distinct shape from OrderAckSchemaObject — reports reducedBy, not a fill/remaining pair. |
BatchOrderRowSchemaObject/BatchOrdersResponseSchemaObject |
.../orders/batched (create & cancel) |
One row per submitted/canceled order — EITHER the success fields OR an error: {code, message, details?}, never both. |
OrderErrorSchemaObject |
(nested in a batch row's error) |
Kalshi's documented per-order failure envelope. |
All schemas rename Kalshi's snake_case wire fields
(event_ticker→eventTicker, yes_bid_dollars→yesBid,
fill_count→fillCount, ...) to camelCase and coerce every fixed-point
dollar/count STRING to a number — this is DISPLAY/RESULT data only.
Order SUBMISSION builds its own exact fixed-point strings from validated
integer cents (see Kalshi.ts's dollarsFromCents/countFp) rather than
routing through float math, the same separation Polymarket keeps between
its numeric GammaMarket display schema and its exact-string order wire
encoding.