Skip to content
UDX
On this page

Requesting Quotes

Create a FIX RFQ as a taker, accept or pass on a quote, and follow last look through execution or cancellation.

An RFQ asks makers to price a trade directly. See RFQs for the trading concepts and Providing Quotes for the maker’s side. Start with a ticker from Discovering Markets and an order-entry session established through FIX Sessions and Recovery.

The examples show decoded FIX fields; your FIX engine supplies the header and trailer. Replace <ticker> and <account-id> with your market ticker and account ID. Copy <rfq-id> and <quote-id> from the exchange’s messages. Example deadlines illustrate the FIX timestamp format; act on the deadlines in the messages you actually receive. Prices are dollars in YES price space and quantities are contracts, as described in Markets and Trading.

Create an RFQ

Send QuoteRequest(R) to ask for offers on 100 contracts:

MsgType(35)=QuoteRequest(R)
QuoteReqID(131)=rfq-request-1
NoRelatedSym(146)=1
  Symbol(55)=<ticker>
Side(54)=BUY(1)
OrderQty(38)=100
Account(1)=<account-id>
QuoteType(537)=TRADEABLE(1)

Here QuoteReqID(131)=rfq-request-1 is your own request identifier, and Side(54)=BUY(1) is the side you intend to trade. For a dollar budget instead of a contract count, replace OrderQty(38)=100 with CashOrderQty(152)=55; send exactly one quantity form. Makers answer a cash-budgeted RFQ with a price and a contract quantity.

The exchange acknowledges an open RFQ with QuoteStatusReport(AI):

MsgType(35)=QuoteStatusReport(AI)
QuoteReqID(131)=<rfq-id>
RequesterQuoteReqID(8002)=rfq-request-1
QuoteStatus(297)=ACTIVE(16)
Symbol(55)=<ticker>
Side(54)=BUY(1)
OrderQty(38)=100
Account(1)=<account-id>
QuoteType(537)=TRADEABLE(1)
ValidUntilTime(62)=20261103-21:01:00.000

Save the exchange-assigned QuoteReqID(131) from this acknowledgment. Use it in every later message for this RFQ. RequesterQuoteReqID(8002) echoes your initial request identifier so you can associate the two. The acknowledgment has no QuoteID(117) because it describes the RFQ, not a maker’s quote.

RFQ result Next step
QuoteStatusReport(AI) with QuoteStatus(297)=ACTIVE(16) Save the exchange RFQ ID, ticker, terms, and deadline; begin following quotes.
QuoteRequestReject(AG) Match its QuoteReqID(131) to your initial request. Inspect QuoteRequestRejectReason(658) and Text(58) before correcting and retrying.
No confirmed outcome after a disconnect Recover and reconcile the session’s reports before creating a replacement RFQ.

The RFQ acknowledgment’s ValidUntilTime(62) is its solicitation deadline. An untraded RFQ ends without a separate RFQ-closed message, so do not wait for another acknowledgment to tell you it has expired. This FIX API has no RFQ cancellation message; to stop pursuing the RFQ, stop accepting its quotes.

Read the Quotes

Each live quote arrives as Quote(S). An offer on the illustrated RFQ can look like this:

MsgType(35)=Quote(S)
QuoteID(117)=<quote-id>
QuoteReqID(131)=<rfq-id>
Symbol(55)=<ticker>
Side(54)=SELL(2)
OfferPx(133)=0.55
OfferSize(135)=100
OrderQty(38)=100
QuoteType(537)=TRADEABLE(1)
ValidUntilTime(62)=20261103-21:00:30.000

Keep each quote by its exchange-assigned QuoteID(117) within QuoteReqID(131). Side(54) is the maker’s side: an offer is a sell quote you can buy, and a bid is a buy quote you can sell. A bid uses BidPx(132) and BidSize(134). Use the quote’s own deadline, which can precede the RFQ’s deadline.

Follow each quote’s later QuoteStatusReport(AI) messages by those same identifiers.

Quote update Next step
QuoteStatus(297)=EXPIRED(7) Remove the expired quote from consideration.
QuoteStatus(297)=CANCELED(17) Remove that quote; it was canceled or its last look ended without confirmation.
QuoteStatus(297)=PASS(11) Remove the quote you passed on. The RFQ can still receive other quotes.
QuoteStatus(297)=REMOVED_FROM_MARKET(6) Remove that competing quote; another quote’s confirmation has ended its availability.

Accept a Quote

To buy the illustrated offer, send QuoteResponse(AJ) with QuoteRespType(694)=HIT_LIFT(1):

MsgType(35)=QuoteResponse(AJ)
QuoteRespID(693)=rfq-response-1
QuoteRespType(694)=HIT_LIFT(1)
QuoteID(117)=<quote-id>
QuoteReqID(131)=<rfq-id>
ClOrdID(11)=rfq-order-1
Symbol(55)=<ticker>
Side(54)=BUY(1)
Price(44)=0.55
OrderQty(38)=100
Account(1)=<account-id>

Use the side opposite the maker’s quote and the quoted price. OrderQty(38) states the contract quantity you want to trade. A smaller acceptance is supported, but a quantity exceeding the quote is rejected. If a smaller acceptance trades, it still ends the RFQ; the unused quantity is not left as another live quote.

ClOrdID(11)=rfq-order-1 is the identifier you assign to the resulting order. Its execution reports carry that value. QuoteRespID(693)=rfq-response-1 identifies this response message; it does not become the order’s identifier. Some rejected responses echo QuoteRespID(693), but later exchange reports correlate by the RFQ and quote IDs, so do not require that response ID on every answer.

Acceptance result Next step
QuoteStatusReport(AI) with QuoteStatus(297)=PENDING_END_TRADE(19) Last look has begun. Wait for the maker’s decision and execution reports; no trade is established yet.
QuoteStatusReport(AI) with QuoteStatus(297)=REJECTED(5) or QuoteStatus(297)=QUOTE_NOT_FOUND(9) Inspect Text(58) and the RFQ/quote IDs. This response does not establish a trade.
ExecutionReport(8) with ExecType(150)=REJECTED(8) Match ClOrdID(11)=rfq-order-1 and inspect OrdRejReason(103) and Text(58). The attempted order was rejected.

Only one acceptance can be in last look on an RFQ at a time. An attempt to accept another quote during that window is rejected.

Follow Last Look and the Trade

The last-look QuoteStatusReport(AI) carries ValidUntilTime(62) as the maker’s decision deadline. This replaces the quote’s previous deadline and can extend beyond the RFQ’s solicitation deadline. The maker now confirms or cancels the chosen quote; the taker does not send the confirmation.

Last-look outcome Next step
QuoteStatus(297)=ACCEPTED(0) The maker confirmed. Follow execution reports to determine whether and how much traded.
QuoteStatus(297)=CANCELED(17) The maker canceled or did not confirm before the deadline. This attempt ends without a trade and produces no execution report for the unexecuted acceptance. The RFQ can solicit again while its deadline permits.
Competing quotes remain after an unconfirmed attempt Keep following their individual states. They are not removed merely because another quote entered last look.
QuoteStatus(297)=REMOVED_FROM_MARKET(6) for competing quotes When the maker confirms the quote you accepted, the other quotes on that RFQ become unavailable. Their removal reports can arrive before or after the chosen quote’s QuoteStatusReport(AI) with QuoteStatus(297)=ACCEPTED(0), which reports the maker’s confirmation.

After an unconfirmed attempt, the exchange sends no second RFQ acknowledgment when solicitation resumes. Continue using the original exchange RFQ ID and the remaining quote states.

A confirmed quote is not proof of a fill. ExecutionReport(8) with ExecType(150)=TRADE(F) records trading; LastQty(32) and LastPx(31) describe the execution, and OrdStatus(39) describes the resulting order state. A confirmed acceptance can instead produce a rejected execution report, including for an expired execution deadline. Reconcile the order reports before attempting another trade.

Use ClOrdID(11)=rfq-order-1 to follow your acceptance order, record its exchange-assigned OrderID(37), and use its QuoteID(117) to associate it with the selected quote. Placing Orders explains execution quantities and duplicate handling; Reconcile Fill Commissions explains the fee fields.

Pass on a Quote

To pass instead of accepting, send a separate QuoteResponse(AJ):

MsgType(35)=QuoteResponse(AJ)
QuoteRespID(693)=rfq-pass-1
QuoteRespType(694)=PASS(6)
QuoteID(117)=<quote-id>
QuoteReqID(131)=<rfq-id>
Symbol(55)=<ticker>

A successful pass produces QuoteStatusReport(AI) with QuoteStatus(297)=PASS(11) for both sides. That quote is no longer executable, while the RFQ remains open for other quotes. A rejected pass produces a rejection status and Text(58); do not treat the rejection as confirmation that the quote ended.

Request a Multi-Leg Market

For an ad-hoc multi-leg RFQ, include 2–10 distinct legs in a message-level group instead of the single-market group. Set NoLegs(555) to the number of leg entries:

MsgType(35)=QuoteRequest(R)
QuoteReqID(131)=rfq-combination-1
Side(54)=BUY(1)
OrderQty(38)=100
Account(1)=<account-id>
QuoteType(537)=TRADEABLE(1)
NoLegs(555)=2
  LegSymbol(600)=<first-leg-ticker>
  LegSide(624)=AS_DEFINED(B)
  LegSymbol(600)=<second-leg-ticker>
  LegSide(624)=OPPOSITE(C)

Replace the leg placeholders with distinct existing market tickers. Leg directions are relative to the overall trade: LegSide(624)=AS_DEFINED(B) takes its direction, and LegSide(624)=OPPOSITE(C) takes the opposite direction. This request does not carry NoRelatedSym(146) or an invented combination ticker.

The acknowledgment supplies the generated combination ticker in Symbol(55) and repeats the legs. Use that ticker in subsequent quote responses, alongside the exchange RFQ ID and the selected quote ID. Read the supplied legs as well as the generated ticker; the combination need not yet appear in the market catalog. An RFQ on an already published multi-leg market can instead use the single-market request shape with that market’s ticker.

Recover an RFQ Session

Follow FIX Sessions and Recovery after a disconnect. Recover quote statuses and execution reports before retrying an acceptance. Creating another acceptance while the first outcome is uncertain can create another trading instruction.