Overview
RFQ functionality involves two types of participants connecting via different FIX sessions: RFQ Creators - Users who want to trade via RFQ (connect via RT mode):- Create RFQ via QuoteRequest (35=R)
- Receive quotes from market makers via Quote (35=S)
- Accept a quote via AcceptQuote (35=UA)
- Receive trade execution via ExecutionReport (35=8)
- Receive QuoteRequest from exchange
- Respond with Quote (35=S)
- Receive acceptance notification
- Confirm execution via QuoteConfirm (35=U7)
RFQ Creators use the KalshiRT endpoint (same as order entry), which provides message persistence and retransmission support. Market Makers use the KalshiRFQ endpoint to receive RFQ broadcasts and submit quotes.
Message Flow
Full RFQ Flow (Creator via FIX)
QuoteRequest (35=R)
This message is used bidirectionally:- Creator → Exchange: Create a new RFQ
- Exchange → Market Makers: Notify of new RFQ
Creator → Exchange (Create RFQ)
Message body
Inside the
146=NoRelatedSym group
The delimiter is the first tag of a group entry: send
146, then 55 for a symbol RFQ
or 38/152 for an MVE RFQ (which omits 55). Note that 21015 and 21016 are
dropped without a reject if they land outside the group — a misplaced 21016 surfaces
later as RFQ already exists on the next request rather than as an error on this one.The published FIX dictionary
lists 55 first, since a dictionary can only declare one delimiter per group. MVE
requests legitimately omit 55, so a strict dictionary-driven validator may flag them —
relax the delimiter for the MVE case rather than adding an empty 55.MVE/Parlay Support: Instead of specifying a Symbol, you can submit MVE legs directly. The server will automatically resolve or create the parlay market and return the resolved market ticker in the QuoteRequestAck.
Exchange → Market Maker (RFQ Notification)
The exchange builds this message with the same structure market makers must parse:55, 38, 152 and the nested 453=NoPartyIDs group are members of the
146=NoRelatedSym group, and the MVE tags sit in the message body.
Message body
Inside the
146=NoRelatedSym group
QuoteRequestAck (35=b)
Exchange response to an inbound QuoteRequest from an RFQ creator.The server-assigned RFQ ID is returned in tag 21023. Store it if you want to reconcile later Quote or QuoteStatusReport messages to the created RFQ. RFQCancel accepts either your original client-assigned QuoteReqId (tag 131) or the server-assigned RfqId (tag 21023).
When creating an RFQ with MVE legs instead of a Symbol, the resolved market ticker is returned in tag 55. This is the market that was created or looked up based on your leg selection.
Quote (35=S)
This message is used bidirectionally:- Market Maker → Exchange: Submit a quote for an RFQ
- Exchange → Creator: Notify creator of a new quote
Market Maker → Exchange (Submit Quote)
Exchange → Creator (Quote Notification)
QuoteStatusReport (35=AI)
A QuoteStatusReport is sent by the exchange:- In response to a Quote. Status will be PENDING if processed, or REJECTED if rejected
- When the requester accepts the quote. Status will be ACCEPTED
- In response to a QuoteCancel. Status will be CANCELLED
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.Exchange responds with QuoteStatusReport (Status=CANCELLED).
QuoteCancelStatus (35=U9)
Response to QuoteCancel from exchange.QuoteConfirm (35=U7)
Market maker confirms willingness to execute after quote acceptance.QuoteConfirmStatus (35=U8)
Exchange response to quote confirmation.AcceptQuote (35=UA)
RFQ creator accepts a quote from a market maker.AcceptQuoteStatus (35=UC)
Exchange response to AcceptQuote.RFQCancel (35=UE)
RFQ creator cancels/deletes an active RFQ.RFQCancelStatus (35=UB)
Exchange response to RFQCancel, or unsolicited with EXPIRED(2) when the exchange closes the RFQ itself.QuoteRequestReject (35=AG)
Exchange notifies that an RFQ creation request was rejected or that a quote request was cancelled.Market makers do not send QuoteRequestReject when ignoring a request.