> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.us/llms.txt
> Use this file to discover all available pages before exploring further.

# Combos

> Quote combo requests distributed by the RFQ Engine

> Beta access is required. Contact `institutional@polymarket.us` for access.

> REST and gRPC are currently supported. FIX support is coming soon.

A combo is an instrument with two or more legs. Each leg is a symbol and side. Combo instruments can trade on book like any instrument. Because few combos are liquid, most combo trades start with RFQ.

Market makers interact with the RFQ Engine through the Combos API and RFQ Events Stream. The RFQ Engine intermediates negotiation: it creates RFQs, opens a quote submission window, selects by price-time priority, starts last look when the requester accepts, and reports final quote state.

This guide is for market makers quoting requests distributed by the RFQ Engine. It covers maker-side behavior only. Requester-only endpoints and internal synchronous RPCs are intentionally omitted.

## Flow: Preview Price Discovery

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant R as Requester
    participant E as RFQ Engine
    participant MM as Maker

    MM->>E: StreamRFQEvents(open)
    R->>E: Request $10.0000 price discovery
    E->>E: Create temporary RFQ
    E->>E: Start quote submission window
    E-->>MM: rfq_created
    activate MM
    Note right of MM: Quote within the 1-second total window
    MM->>E: CreateQuote
    deactivate MM
    E-->>MM: quote_created
    E->>E: Select when submission window closes
    E-->>R: Indicative quote
```

Preview is price discovery only. There is no accept, last look, or fill.

## Flow: Quote RFQ Engine Request

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant R as Requester
    participant E as RFQ Engine
    participant MM as Maker
    participant DC as Drop Copy

    MM->>E: StreamRFQEvents(open)
    R->>E: Request executable cash or quantity quote
    E->>E: Start quote submission window
    E-->>MM: rfq_created
    activate MM
    Note right of MM: Quote within the 1-second total window
    MM->>E: CreateQuote(rfqId, symbol, side, price, qtyDecimal)
    deactivate MM
    E-->>MM: CreateQuoteResponse(clientRequestId)
    E-->>MM: quote_created
    E->>E: Select when submission window closes
    E-->>R: RFQ and selected quote
    R->>E: User accepts selected quote
    E-->>MM: quote_pending_end_trade
    activate MM
    Note right of MM: Last look window: 3 seconds
    MM->>E: ConfirmQuote(rfqId, quoteId)
    deactivate MM
    E-->>MM: {}
    E-->>MM: quote_accepted
    E->>E: Place requester order on public order book
    Note over R,E: Exposure Period: 1 second
    DC-->>R: Execution report
    DC-->>MM: Execution report
    E-->>R: Final result
```

On `quote_pending_end_trade`, last look has started. Confirm within 3 seconds to trade. Makers must confirm the vast majority of accepted quotes or risk removal from the RFQ program.

## RFQ Engine

Requester-side RFQ Engine flows:

| Flow              | What the RFQ Engine does                                                                                                                                                                                                                                                                             | Maker sees                                                                                                 |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| Price preview     | Creates a `$10.0000` cash RFQ for indicative price discovery. It returns the price-time priority quote after the submission window.                                                                                                                                                                  | `rfq_created`, then `quote_created` for any maker quote. No accept, no last look, no fill.                 |
| Executable RFQ    | Creates a cash RFQ for an open/increase or a quantity RFQ for a reduce/cash-out, waits through the quote submission window, and returns the selected quote to the requester. Only pending quotes whose `expirationTime` is later than selection time and `rfq.createdTime + 5 seconds` are eligible. | `rfq_created`, then `quote_created` for any maker quote.                                                   |
| Requester accepts | Accepts the selected quote, starts last look, waits for maker confirmation and final execution, then returns the final result to the requester.                                                                                                                                                      | Selected maker sees `quote_pending_end_trade`; non-selected makers see `quote_done_away` after acceptance. |

## Quote Rules

| Rule                             | Behavior                                                                                                                                                                                                                                                        |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Quote side                       | Must equal RFQ `side`. This is the maker's side.                                                                                                                                                                                                                |
| Quote creator                    | Must differ from RFQ creator.                                                                                                                                                                                                                                   |
| Quantity RFQ                     | Quote the RFQ `qtyDecimal`.                                                                                                                                                                                                                                     |
| Cash RFQ                         | Choose contracts so `price * qtyDecimal` exactly equals RFQ `cashOrderQty`. Mismatched quotes are not selectable.                                                                                                                                               |
| Price                            | Must land on `instrument.tickSize`; current combo instruments use `0.001`. Valid prices are greater than `0.000` and less than `1.000`.                                                                                                                         |
| Quantity                         | Must have exactly 2 decimals, such as `40.00`.                                                                                                                                                                                                                  |
| Cash                             | `cashOrderQty` is shown with 4 decimals. Request inputs may use fewer decimals and are padded.                                                                                                                                                                  |
| Price-time priority              | `SIDE_BUY`: lower price wins. `SIDE_SELL`: higher price wins. At the same price, earlier live quotes have priority.                                                                                                                                             |
| Minimum quote remaining lifetime | When the submission window closes, the RFQ Engine considers only pending quotes whose `expirationTime` is later than selection time and strictly later than `rfq.createdTime + 5 seconds`. A quote expiring exactly at `createdTime + 5 seconds` is ineligible. |
| Accepted quote discipline        | Makers must confirm the vast majority of accepted quotes. Makers who do not may be removed from the RFQ program.                                                                                                                                                |

Unary responses are acknowledgements. RFQ Events Stream messages are state.

Always copy `rfq.side` into the quote.

| RFQ and quote side | Maker execution | Requester execution | Maker role |
| ------------------ | --------------- | ------------------- | ---------- |
| `SIDE_BUY`         | Buy             | Sell                | Passive    |
| `SIDE_SELL`        | Sell            | Buy                 | Passive    |

The requester is the aggressor. The maker is passive.

## Timing Intervals

| Timer                            | Starts                    | Duration           | Maker requirement                                                                                                                             |
| -------------------------------- | ------------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Quote submission window          | RFQ creation completes    | 1 second           | Quote immediately on `rfq_created`; part of the window may have elapsed before the event arrives.                                             |
| Minimum quote remaining lifetime | RFQ `createdTime`         | 5-second threshold | Set quote `expirationTime` strictly later than `rfq.createdTime + 5 seconds` and later than selection time. Add network and acceptance slack. |
| Last look window                 | `quote_pending_end_trade` | 3 seconds          | Confirm or delete before the window closes.                                                                                                   |
| Exposure Period                  | Maker confirms            | 1 second           | The requester order is placed on the public order book and can be filled against by any participant.                                          |

## Stream Events

Each `StreamRFQEventsResponse` has one event.

| Event                     | When it arrives                        | Maker response                               |
| ------------------------- | -------------------------------------- | -------------------------------------------- |
| `rfq_created`             | New RFQ.                               | Quote or ignore.                             |
| `rfq_expired`             | RFQ expired.                           | Stop quoting.                                |
| `rfq_action_rejected`     | Requested action failed.               | Read `reject`.                               |
| `quote_created`           | Quote is live.                         | Track `quoteId`.                             |
| `quote_deleted`           | Quote was canceled.                    | Stop using it.                               |
| `quote_accepted`          | Quote was confirmed and accepted.      | Reconcile final execution through Drop Copy. |
| `quote_expired`           | Quote expired.                         | Stop using it.                               |
| `quote_passed`            | Requester passed.                      | Stop using it.                               |
| `quote_done_away`         | Another quote won.                     | Stop using it.                               |
| `quote_pending_risk`      | Risk check pending.                    | Wait.                                        |
| `quote_pending_end_trade` | Requester accepted; last look started. | Confirm unless you must decline.             |
| `quote_status_rejected`   | Quote reached rejected status.         | Treat as failed.                             |

## Rate Limits

| Maker operation                                        | Rate                | Burst |
| ------------------------------------------------------ | ------------------- | ----- |
| `GET /v1/combos/rfqs`                                  | 1 request/second    | 1     |
| `GET /v1/combos/quotes`                                | 1 request/second    | 1     |
| `POST /v1/combos/quotes`                               | 100 requests/second | 100   |
| `DELETE /v1/combos/rfqs/{rfqId}/quotes/{quoteId}`      | 100 requests/second | 100   |
| `PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/confirm` | 100 requests/second | 100   |

Use the stream for live state. Reserve `GetRFQs` and `GetQuotes` for startup, recovery, and targeted reconciliation.
