Skip to main content

RFQ (Request for Quote) Messages

Overview

The RFQ session allows market makers to respond to quote requests from users. The workflow involves:
  1. Exchange sends QuoteRequest to market makers
  2. Market makers respond with Quote
  3. Requester can accept the quote
  4. Market maker confirms execution
RFQ sessions use the KalshiRFQ endpoint with retransmission support.

Message Flow

QuoteRequest (35=R)

This message is sent by Kalshi Exchange back to clients to inform of new quote requests.
TagNameTypeRequiredDescription
131QuoteReqIdUUIDYUnique quote request ID
146NoRelatedSymIntegerYNumber of symbols. Currently, only 1 is supported.
38OrderQtyIntegerYNumber of contracts
152CashOrderQtyDecimalNTarget cost of the quote in dollars.
55SymbolStringYMarket ticker
453NoPartyIDsIntegerNNumber of parties. Currently, only 1 is supported.
448PartyIdUUIDNPseudonymous identifier for requester
20180MultivariateCollectionTickerStringNCollection ticker for multivariate markets
20181NoMultivariateSelectedLegsIntegerNNumber of selected legs for multivariate markets. Repeating group containing the following 3 fields.
20182MultivariateSelectedEventTickerStringNEvent ticker for the selected leg
20183MultivariateSelectedMarketTickerStringNMarket ticker for the selected leg
20184MultivariateSelectedMarketSideStringNSide for the selected leg (“yes” or “no”)

Quote (35=S)

Used to submit a quote in response to a quote request. If a new Quote is created when an existing quote for the same market already exists for the user, the exchange will cancel the existing quote.
TagNameTypeRequiredDescription
117QuoteIdUUIDYUnique quote identifier
131QuoteReqIdUUIDYQuote request for which the quote is in response to.
55SymbolStringYMarket ticker
132BidPxIntegerYYes price in cents. Only integer part considered (1-99)
133OfferPxIntegerYNo price in cents. Only integer part considered (1-99)
Either BidPx or OfferPx can be zero, but not both. Zero indicates no quote for that side.

QuoteStatusReport (35=AI)

A QuoteStatusReport is sent by the exchange:
  1. In response to a Quote. Status will be PENDING if processed, or REJECTED if rejected
  2. When the requester accepts the quote. Status will be ACCEPTED. Quoter should reply with QuoteConfirm within 30 seconds
  3. In response to a QuoteCancel. Status will be CANCELLED
TagNameTypeRequiredDescription
117QuoteIdStringYQuote identifier (empty if rejected)
131QuoteReqIdStringYRequest reference
297QuoteStatusIntegerYCurrent status
38OrderQtyIntegerCNumber of contracts. Not present if REJECTED
132BidPxIntegerCYes price in cents. Only integer part considered. Not present if REJECTED
133OfferPxIntegerCNo price in cents. Only integer part considered. Not present if REJECTED
54AcceptedSideCharCSide accepted (1=Yes, 2=No). Only present if ACCEPTED
58TextStringCRejection reason. Only present if REJECTED

Quote Status Values (297)

  • ACCEPTED<0>: Requester accepted the quote
  • REJECTED<5>: Exchange rejected the quote
  • PENDING<10>: Quote processed, awaiting action
  • CANCELLED<17>: Quote cancelled

QuoteCancel (35=Z)

Market maker cancels an active quote.
TagNameTypeRequiredDescription
117QuoteIdStringYQuote to cancel
Exchange responds with QuoteStatusReport (Status=CANCELLED).

QuoteCancelStatus (35=U9)

Response to QuoteCancel from exchange.
TagNameTypeRequiredDescription
117QuoteIdStringYQuote identifier
298QuoteCancelStatusIntegerYCANCELED(0) or REJECTED(1)
58RejectReasonStringCPresent if QuoteCancelStatus is REJECTED

QuoteConfirm (35=U7)

Market maker confirms willingness to execute after quote acceptance.
TagNameTypeRequiredDescription
117QuoteIdStringYAccepted quote ID
Quote must be confirmed within 30 seconds of acceptance or it will be voided.

QuoteConfirmStatus (35=U8)

Exchange response to quote confirmation.
TagNameTypeRequiredDescription
117QuoteIdStringYQuote identifier
297QuoteConfirmStatusIntegerYACCEPTED(0) or REJECTED(1)
58RejectReasonStringCPresent if QuoteConfirmStatus is REJECTED

QuoteRequestReject (35=AG)

Exchange notifies that a quote request was cancelled.
TagNameTypeRequiredDescription
58TextStringYReason the quote has been cancelled
131QuoteReqIdStringYRequest identifier
658QuoteRequestRejectReasonIntegerYOTHER(99)
Market makers do not send QuoteRequestReject when ignoring a request.

Best Practices

For Market Makers

  1. Response Time
    • Respond to quote requests promptly
    • Confirm accepted quotes within 30 seconds
    • Cancel stale quotes proactively
  2. Quote Management
    • Track active quotes locally
    • Handle quote replacements properly
    • Monitor for acceptance notifications
  3. Risk Management
    • Validate prices before quoting
    • Implement position limits
    • Handle partial quotes (one-sided)

Error Handling

  1. Rejection Scenarios
    • Invalid price range
    • Symbol not found
    • Technical issues
  2. Timeout Handling
    • 30-second confirmation window
    • Automatic quote expiration
    • Network disconnection recovery

Example Workflow

8=FIXT.1.1|35=R|131=req-123|146=1|38=100|55=HIGHNY-23DEC31|453=1|448=anon-456|

Integration Notes

  • RFQ session requires separate connection
  • Uses KalshiRFQ endpoint
  • Supports message retransmission
  • Independent of order entry session
I