Market Settlement

Overview

Market settlement messages provide information about market outcomes and the resulting position settlements. These messages are available on:
  • KalshiPT (Post Trade) sessions
  • KalshiRT sessions when ReceiveSettlementReports=Y in Logon
Settlement occurs when a market’s outcome is determined, triggering automatic position resolution and fund transfers.

Market Settlement Report (35=UMS)

Provides settlement details for a specific market.

Message Structure

TagNameDescriptionRequired
20105MarketSettlementReportIDUnique settlement identifierYes
55SymbolMarket ticker (e.g., NHIGH-23JAN02-66)Yes
715ClearingBusinessDateDate settlement cleared (YYYYMMDD)Yes
20106TotNumMarketSettlementReportsTotal number of settlement reports in sequenceNo
20107MarketResultResult of the market when determinedNo
893LastFragmentLast page indicator (Y/N)No

Repeating Groups

Party Information (NoMarketSettlementPartyIDs)

TagNameDescription
20108NoMarketSettlementPartyIDsNumber of parties
20109MarketSettlementPartyIDUnique identifier for party
20110MarketSettlementPartyRoleType of party (Customer Account<24>)
704LongQtyNumber of YES contracts held
705ShortQtyNumber of NO contracts held

Collateral Changes (NoCollateralAmountChanges)

TagNameDescription
1703NoCollateralAmountChangesNumber of collateral changes (should be only 1 - payout balance change)
1704CollateralAmountChangeDelta in cents
1705CollateralAmountTypeBalance<1> or Payout<2>

Fees (NoMiscFees)

TagNameDescription
136NoMiscFeesNumber of fees (currently zero, single item with zeroed values)
137MiscFeeAmtTotal fees for settlement in dollars
138MiscFeeCurrCurrency (USD)
139MiscFeeTypeType of fee (Exchange fees<4>)
891MiscFeeBasisUnit for fee (Absolute<0>)

Settlement Process

Market Resolution Flow

Settlement Calculations

For each position:
  • Yes outcome: Yes contract holders receive $1 per contract
  • No outcome: No contract holders receive $1 per contract
  • Net position: Only net positions are settled (after netting)

Example Settlement Report

// Market settled as "Yes"
8=FIXT.1.1|35=UMS|
20105=settle-123|55=HIGHNY-23DEC31|715=20231231|
20107=Yes|
20108=1|
  20109=user-456|20110=24|
  704=100|705=0|
  1703=1|
    1704=10000|1705=1|
  136=1|
    137=0.00|138=USD|139=4|891=0|
893=Y|
This example shows:
  • Market HIGHNY-23DEC31 settled as “Yes”
  • User held 100 Yes contracts
  • Received $100.00 (10000 cents) to balance
  • No settlement fees

Pagination

Large settlement batches may span multiple messages:
TagUse Case
20106Total number of reports in batch
893LastFragment=N for more pages, Y for last

Settlement Timing

Markets typically settle shortly after expiration, but timing can vary based on:
  • Market type
  • Data source availability
  • Manual review requirements

Integration Considerations

1. Position Reconciliation

def reconcile_settlement(report):
    # Verify position matches records
    our_position = get_position(report.Symbol)
    
    if report.LongQty != our_position.yes_contracts:
        alert("Position mismatch", report)
    
    # Verify payout calculation
    if report.MarketResult == "Yes":
        expected_payout = report.LongQty * 100  # cents
    else:
        expected_payout = report.ShortQty * 100
    
    if report.CollateralAmountChange != expected_payout:
        alert("Payout mismatch", report)

2. Multi-Account Handling

For sessions managing multiple accounts:
  • Each party (sub-account) receives separate entry
  • Aggregate by MarketSettlementPartyID
  • Track settlements per account

3. Fee Processing

Currently settlement fees are zero, but implement handling for future changes:
  • Parse NoMiscFees group
  • Account for fees in P&L calculations
  • Track fee types for reporting

Best Practices

Real-time Processing

1

Subscribe to Reports

Set ReceiveSettlementReports=Y in KalshiRT Logon
2

Process Immediately

Update positions and balances in real-time
3

Reconcile

Compare with expected outcomes and positions
4

Update Risk

Adjust risk calculations for settled positions

Batch Processing

For post-trade reconciliation:
  1. Connect to KalshiPT session
  2. Query for day’s settlements
  3. Process in sequence order
  4. Generate settlement reports
SystemPurpose
Order EntryTrack positions leading to settlement
Drop CopyAudit trail of trades
Market DataMarket expiration times
REST APIQuery market details and outcomes

Error Scenarios

Missing Settlements

If settlements are missing:
  1. Check connection to appropriate session
  2. Verify ReceiveSettlementReports flag
  3. Use REST API as backup data source
  4. Contact support if discrepancies persist

Incorrect Positions

Position mismatches may indicate:
  • Missed execution reports
  • Incorrect position tracking
  • Late trades near expiration
Always maintain independent position tracking for verification.