# Examples

A complete two-leg auction from the winning maker's perspective. All timestamps are milliseconds; all prices and quantities are string decimals.

## 1. Discovery

A taker opens a $50,000 notional RFQ on a two-leg combo. The anonymous broadcast arrives on `requestForQuote`:

```json
{
  "e": "requestForQuote",
  "E": 1780000000000,
  "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
  "l": [
    { "c": "123456", "o": "YES" },
    { "c": "123789", "o": "NO" }
  ],
  "n": "50000.00",
  "S": "OPEN",
  "w": 1780000001000,
  "x": 1780000120000,
  "c": 1780000000000
}
```

The quoting window closes at `w` — 1 second after creation.

## 2. Submit a quote

The maker prices the combo at 0.55 per contract and will cover up to 100,000 contracts:

```json
{
  "id": 1,
  "method": "rfq.submit_quote",
  "params": {
    "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
    "price": "0.55",
    "quantity": "100000"
  }
}
```

```json
{
  "id": 1,
  "status": 200,
  "result": {
    "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
    "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6"
  }
}
```

:::note
The quote is immutable — there is no revise. If the maker needs out before the window closes, `rfq.withdraw_quote` pulls it — permanently, for this RFQ (the one-quote-per-account slot is not freed).
:::

The submission response is private to the maker. Neither submission nor withdrawal produces a customer stream delivery while the RFQ is open.

Because the maker omitted `validUntil`, the service assigns `w` (`1780000001000`). That makes the quote eligible at the logical close; `validUntil` is not checked again in later lifecycle stages.

## 3. Winner disclosed to the requester

At or after `w`, the venue selects the best eligible quote. This example closes 100 milliseconds after `w`. The requester receives one private `CLOSED` delivery containing only that quote; losing quotes remain undisclosed:

```json
{
  "e": "requestForQuote",
  "i": "b16097e9-3d7f-5910-9820-eeedf51a8be3",
  "E": 1780000001100,
  "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
  "x": "CLOSED",
  "S": "PENDING_ACCEPTANCE",
  "q": "01J9Z2K7Q2N8M4P6R8T0V2W4X6",
  "p": "0.55",
  "sz": "100000",
  "qs": "ACTIVE",
  "vu": 1780000001000
}
```

The transition to `PENDING_ACCEPTANCE` starts the requester's 5-second decision window. Notice that `vu` is already at the logical auction close; that does not prevent post-close acceptance.

## 4. Acceptance arrives

In this example, the requester accepts 3 seconds after the `CLOSED` transition. The maker's `requestForQuote@account` stream delivers:

```json
{
  "e": "requestForQuote",
  "i": "88bfe6b3-be05-56c6-bd1b-51b25fafb27a",
  "E": 1780000004100,
  "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
  "x": "ACCEPTED",
  "S": "CONFIRMING",
  "q": "01J9Z2K7Q2N8M4P6R8T0V2W4X6",
  "p": "0.55",
  "sz": "100000",
  "qs": "ACTIVE",
  "vu": 1780000001000
}
```

At $50,000 notional and a price of 0.55, the fill will be `floor(50000 / 0.55)` = **90,909 contracts**.

The `ACCEPTED` transition and matching `quoteId` identify the winner. The quote remains `ACTIVE` until execution finalizes, when its status becomes `WON`.

## 5. Last-look confirm

The transition to `CONFIRMING` starts the winning maker's 1-second deadline to confirm or decline. The maker should act immediately on the `ACCEPTED` delivery.

```json
{
  "id": 2,
  "method": "rfq.confirm_quote",
  "params": {
    "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
    "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6",
    "confirm": true
  }
}
```

```json
{
  "id": 2,
  "status": 200,
  "result": {
    "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
    "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6",
    "confirmed": true
  }
}
```

Confirming places the maker's collateral hold, authorizes execution, and hands the trade to settlement (`S` moves to `FINALIZING`).

Declining instead (`"confirm": false`) fails the RFQ: the requester is notified, and no trade occurs.

## 6. Finalization

The public feed (and the maker's private stream) reports the terminal state, now carrying the filled quantity:

```json
{
  "e": "requestForQuote",
  "E": 1780000004500,
  "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6",
  "l": [
    { "c": "123456", "o": "YES" },
    { "c": "123789", "o": "NO" }
  ],
  "n": "50000.00",
  "f": "90909",
  "S": "FINALIZED",
  "c": 1780000000000
}
```

The resulting combo position and balance changes flow through the standard authenticated streams — see the [Stream Reference](/prediction-markets/websocket/streams).

:::caution Maker fill can differ from the requester fill
`f: "90909"` is the requester's full-size execution quantity; it does not guarantee that the selected maker filled 90,909 contracts. The maker's post-only order executes first on the normal order book and can fill partially against other participants, while the requester can obtain some or all of its fill from other resting liquidity. If requester execution fails after a maker partial fill, the completed maker fill remains even though the RFQ ends in `FAILED`; only the unfilled maker-order remainder is cancelled.
:::

## Error example: quoting a closed auction

Submitting after the window closes:

```json
{
  "id": 3,
  "status": 400,
  "error": {
    "code": -2010,
    "msg": "RFQ is not in a valid state for this operation"
  }
}
```

## See also

- [Quote Methods](/prediction-markets/combos-rfq/quote-methods) — full parameter and error tables.
- [Maker Integration](/prediction-markets/combos-rfq/maker-integration) — the workflow these messages belong to.
