Skip to main content

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):
  1. Create RFQ via QuoteRequest (35=R)
  2. Receive quotes from market makers via Quote (35=S)
  3. Accept a quote via AcceptQuote (35=UA)
  4. Receive trade execution via ExecutionReport (35=8)
Market Makers - Users who provide quotes (connect via RfqMode):
  1. Receive QuoteRequest from exchange
  2. Respond with Quote (35=S)
  3. Receive acceptance notification
  4. 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
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.

Market Maker → Exchange (Submit Quote)

Exchange → Creator (Quote Notification)

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
  3. 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.
Quote must be confirmed within 30 seconds of acceptance or it will be voided.

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.

Example Workflow

RFQ Creator Flow

Market Maker Flow