> ## 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 API Overview

> Create combo RFQs, quote RFQs, accept quotes, and confirm last-look quotes

<Note>
  **Upcoming - beta access required.** The Combos API is not generally available yet. Reach out to [institutional@polymarket.us](mailto:institutional@polymarket.us) to join the beta test.
</Note>

The Combos API lets participants request and quote multi-leg combo trades. A requester creates an RFQ with one or more legs, makers respond with quotes, the requester accepts one quote, and the quote creator confirms it during last look.

For real-time RFQ and quote changes, use the [RFQ Events Stream](/streaming-endpoints/rfq-events-stream).

## Endpoints

| Method   | Endpoint                                           | Required Scope | Description                                |
| -------- | -------------------------------------------------- | -------------- | ------------------------------------------ |
| `GET`    | `/v1/combos/rfq/user-id`                           | `read:orders`  | Get your public RFQ user ID                |
| `GET`    | `/v1/combos/rfqs`                                  | `read:orders`  | Query RFQs                                 |
| `POST`   | `/v1/combos/rfqs`                                  | `write:orders` | Create an RFQ                              |
| `GET`    | `/v1/combos/quotes`                                | `read:orders`  | Query quotes                               |
| `POST`   | `/v1/combos/quotes`                                | `write:orders` | Create a quote                             |
| `DELETE` | `/v1/combos/rfqs/{rfqId}/quotes/{quoteId}`         | `write:orders` | Delete a quote                             |
| `PUT`    | `/v1/combos/rfqs/{rfqId}/quotes/{quoteId}/accept`  | `write:orders` | Accept a quote                             |
| `PUT`    | `/v1/combos/rfqs/{rfqId}/quotes/{quoteId}/confirm` | `write:orders` | Confirm an accepted quote during last look |

<Info>
  All Combos API calls require normal bearer-token authentication. Calls must also identify the acting participant either through the `x-participant-id` header or through a `participant_id` claim in the bearer token.
</Info>

## RFQ Flow

1. Call `GetRFQUserID` to learn the public RFQ user ID for the authenticated participant.
2. Call `CreateRFQ` with the combo legs, requested side, quantity or cash order quantity, and expiration time.
3. Makers call `GetRFQs` and `CreateQuote` to respond.
4. Requesters monitor `GetQuotes` or subscribe to `StreamRFQEvents`.
5. The requester calls `AcceptQuote` to select one quote.
6. The quote creator calls `ConfirmQuote` during last look.
7. Watch `GetQuotes` or `StreamRFQEvents` for the final quote status.

## Create RFQ

```bash theme={null}
POST /v1/combos/rfqs
```

### Request Body

| Field             | Type         | Required    | Description                                                 |
| ----------------- | ------------ | ----------- | ----------------------------------------------------------- |
| `qtyDecimal`      | string       | Conditional | Share quantity for the RFQ. Provide this or `cashOrderQty`. |
| `cashOrderQty`    | string       | Conditional | Cash notional for the RFQ. Provide this or `qtyDecimal`.    |
| `legs`            | `ComboLeg[]` | Yes         | Combo legs. Each leg has `symbol` and `side`.               |
| `side`            | `Side`       | Yes         | Requester's side for the combo.                             |
| `clientRequestId` | string       | No          | Client idempotency / correlation ID.                        |
| `expirationTime`  | RFC3339      | Yes         | Time when the RFQ expires.                                  |

### Example

```json theme={null}
{
  "qtyDecimal": "100",
  "side": "SIDE_BUY",
  "clientRequestId": "rfq-20260613-001",
  "expirationTime": "2026-06-13T18:00:00Z",
  "legs": [
    {
      "symbol": "aec-mlb-nyy-bos-2026-06-13-nyy",
      "side": "SIDE_BUY"
    },
    {
      "symbol": "aec-mlb-nyy-bos-2026-06-13-bos",
      "side": "SIDE_SELL"
    }
  ]
}
```

### Response

```json theme={null}
{
  "clientRequestId": "rfq-20260613-001"
}
```

## Query RFQs

```bash theme={null}
GET /v1/combos/rfqs?symbol=combo-aec-mlb-nyy-bos-2026-06-13&status=QUOTE_STATUS_PENDING&pageSize=100
```

### Query Parameters

| Parameter          | Type          | Description                            |
| ------------------ | ------------- | -------------------------------------- |
| `pageSize`         | integer       | Number of RFQs to return. Max 100.     |
| `pageToken`        | string        | Pagination token from `nextPageToken`. |
| `rfqId`            | string        | Filter by RFQ ID.                      |
| `rfqCreatorUserId` | string        | Filter by requester RFQ user ID.       |
| `symbol`           | string        | Filter by combo symbol.                |
| `clientRequestId`  | string        | Filter by client request ID.           |
| `status`           | `QuoteStatus` | Filter by RFQ status.                  |

## Create Quote

```bash theme={null}
POST /v1/combos/quotes
```

### Request Body

| Field             | Type    | Required | Description                          |
| ----------------- | ------- | -------- | ------------------------------------ |
| `rfqId`           | string  | Yes      | RFQ being quoted.                    |
| `side`            | `Side`  | Yes      | Quote side.                          |
| `price`           | string  | Yes      | Quote price as a decimal string.     |
| `symbol`          | string  | Yes      | Combo symbol.                        |
| `qtyDecimal`      | string  | Yes      | Quote quantity as a decimal string.  |
| `clientRequestId` | string  | No       | Client idempotency / correlation ID. |
| `expirationTime`  | RFC3339 | No       | Quote expiration time.               |

## Query Quotes

```bash theme={null}
GET /v1/combos/quotes?rfqId=rfq_123&status=QUOTE_STATUS_PENDING
```

### Query Parameters

| Parameter          | Type          | Description                            |
| ------------------ | ------------- | -------------------------------------- |
| `pageSize`         | integer       | Number of quotes to return. Max 100.   |
| `pageToken`        | string        | Pagination token from `nextPageToken`. |
| `quoteId`          | string        | Filter by quote ID.                    |
| `rfqId`            | string        | Filter by RFQ ID.                      |
| `creatorRfqUserId` | string        | Filter by quote creator RFQ user ID.   |
| `symbol`           | string        | Filter by combo symbol.                |
| `status`           | `QuoteStatus` | Filter by quote status.                |
| `clientRequestId`  | string        | Filter by client request ID.           |

## Accept Quote

```bash theme={null}
PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/accept
```

Accepting a quote selects it for last-look confirmation. The body repeats the economic terms being accepted.

| Field        | Type   | Required | Description          |
| ------------ | ------ | -------- | -------------------- |
| `side`       | `Side` | Yes      | Side being accepted. |
| `price`      | string | Yes      | Accepted price.      |
| `symbol`     | string | Yes      | Combo symbol.        |
| `qtyDecimal` | string | Yes      | Accepted quantity.   |

## Confirm Quote

```bash theme={null}
PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/confirm
```

Confirming a quote completes the last-look step for an accepted quote. The request has no body and returns an empty JSON object.

```json theme={null}
{}
```

## Quote Statuses

| Status                           | Description                                           |
| -------------------------------- | ----------------------------------------------------- |
| `QUOTE_STATUS_PENDING`           | Quote is active and can be accepted.                  |
| `QUOTE_STATUS_ACCEPTED`          | Quote was accepted.                                   |
| `QUOTE_STATUS_DELETED`           | Quote was deleted by its creator.                     |
| `QUOTE_STATUS_EXPIRED`           | Quote expired.                                        |
| `QUOTE_STATUS_PASSED`            | Quote was passed.                                     |
| `QUOTE_STATUS_DONE_AWAY`         | Quote was done away.                                  |
| `QUOTE_STATUS_PENDING_RISK`      | Quote is waiting on risk checks.                      |
| `QUOTE_STATUS_PENDING_END_TRADE` | Accepted quote is waiting for last-look confirmation. |
| `QUOTE_STATUS_REJECTED`          | Quote was rejected.                                   |

## Rate Limits

| Endpoint                                               | Rate               | Burst |
| ------------------------------------------------------ | ------------------ | ----- |
| `GET /v1/combos/rfq/user-id`                           | Firm-wide REST cap | -     |
| `GET /v1/combos/rfqs`                                  | 1 req/sec          | 1     |
| `GET /v1/combos/quotes`                                | 1 req/sec          | 1     |
| `POST /v1/combos/rfqs`                                 | 10 req/sec         | 10    |
| `POST /v1/combos/quotes`                               | 100 req/sec        | 100   |
| `DELETE /v1/combos/rfqs/{rfqId}/quotes/{quoteId}`      | 100 req/sec        | 100   |
| `PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/accept`  | 100 req/sec        | 100   |
| `PUT /v1/combos/rfqs/{rfqId}/quotes/{quoteId}/confirm` | 100 req/sec        | 100   |

Exceeding these limits returns `ResourceExhausted` (`429 Too Many Requests`).

## Error Codes

| Error                | Cause                                                                                           |
| -------------------- | ----------------------------------------------------------------------------------------------- |
| `InvalidArgument`    | Missing participant ID, invalid RFQ, quote, symbol, side, price, quantity, or pagination input. |
| `Unauthenticated`    | Missing or invalid bearer token.                                                                |
| `PermissionDenied`   | Token lacks the required scope or participant access.                                           |
| `FailedPrecondition` | Participant token setup is not ready or token state is invalid.                                 |
| `Unavailable`        | Upstream Combos service is unavailable.                                                         |
| `ResourceExhausted`  | Per-firm rate limit exceeded.                                                                   |

## See Also

<CardGroup cols={2}>
  <Card title="RFQ Events Stream" icon="bolt" href="/streaming-endpoints/rfq-events-stream">
    Real-time RFQ and quote events
  </Card>

  <Card title="Trading API" icon="arrow-right-arrow-left" href="/institutional/trading/overview">
    Order entry and lifecycle APIs
  </Card>

  <Card title="Authentication" icon="key" href="/trader-guide/authentication#api-scopes">
    Required scopes and OAuth flow
  </Card>

  <Card title="Rate Limits" icon="gauge" href="/trader-guide/rate-limits">
    Endpoint-level request limits
  </Card>
</CardGroup>
