---
title: Requesting Quotes
description: 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](/concepts/rfqs) for the trading concepts and [Providing Quotes](/walkthroughs/fix/providing-quotes) for the maker's side. Start with a ticker from [Discovering Markets](/walkthroughs/fix/discovering-markets) and an order-entry session established through [FIX Sessions and Recovery](/reference/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](/reference/fix-data-types#utctimestamp); 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](/concepts/markets-and-trading).

## Create an RFQ

Send [QuoteRequest(R)](/api-reference/fix/order-entry/messages/quote-request) to ask for offers on 100 contracts:

```text
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)](/api-reference/fix/order-entry/messages/quote-status-report):

```text
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)](/api-reference/fix/order-entry/messages/quote-request-reject) | 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)](/api-reference/fix/order-entry/messages/quote). An offer on the illustrated RFQ can look like this:

```text
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)](/api-reference/fix/order-entry/messages/quote-response) with `QuoteRespType(694)=HIT_LIFT(1)`:

```text
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)](/api-reference/fix/order-entry/messages/execution-report) 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](/walkthroughs/fix/placing-orders#follow-the-order-and-its-fills) explains execution quantities and duplicate handling; [Reconcile Fill Commissions](/walkthroughs/fix/placing-orders#reconcile-fill-commissions) explains the fee fields.

## Pass on a Quote

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

```text
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:

```text
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](/reference/fix-sessions-and-recovery#recover-order-entry) 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.
