> ## 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.

# RFQ API Overview

> Create and manage combo RFQs and quotes

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

<Info>
  Market makers should read the [Combos guide](/trader-guide/combos) before integrating. It explains quote construction, visibility, last look, and recovery.
</Info>

The public `polymarket.v1.RFQAPI` gRPC service creates, reads, and manages combo RFQs and quotes. An RFQ references the exact symbol of a [combo instrument](/institutional/combos/overview). The service also exposes the gRPC-only RFQ event stream.

Every REST endpoint below has an equivalent unary gRPC RPC. REST JSON uses lower camel case; protobuf fields use snake case.

## Endpoints

| Method   | Endpoint                                    | Scope          | Description                                |
| -------- | ------------------------------------------- | -------------- | ------------------------------------------ |
| `GET`    | `/v1/rfqs/user-id`                          | `read:orders`  | Get your pseudonymous RFQ user ID          |
| `GET`    | `/v1/rfqs`                                  | `read:orders`  | Query RFQs                                 |
| `POST`   | `/v1/rfqs`                                  | `write:orders` | Create an RFQ                              |
| `DELETE` | `/v1/rfqs/{rfqId}`                          | `write:orders` | Close an open RFQ                          |
| `GET`    | `/v1/rfqs/quotes`                           | `read:orders`  | Query visible quotes                       |
| `POST`   | `/v1/rfqs/quotes`                           | `write:orders` | Create or replace your quote for an RFQ    |
| `DELETE` | `/v1/rfqs/{rfqId}/quotes/{quoteId}`         | `write:orders` | Delete your quote                          |
| `PUT`    | `/v1/rfqs/{rfqId}/quotes/{quoteId}/accept`  | `write:orders` | Accept one side of a quote                 |
| `PUT`    | `/v1/rfqs/{rfqId}/quotes/{quoteId}/confirm` | `write:orders` | Confirm an accepted quote during last look |

All calls require bearer-token authentication and an acting participant, supplied through `x-participant-id` or the token's `participant_id` claim.

## RFQ Lifecycle

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant R as Requester
    participant API as RFQAPI
    participant M as Maker

    R->>API: CreateRFQ(symbol, sizing, account)
    API-->>M: rfq_created
    M->>API: CreateQuote(buyPrice, sellPrice, account)
    API-->>R: quote_created
    API-->>M: quote_created
    R->>API: AcceptQuote(acceptedSide)
    API-->>R: rfq_closed
    API-->>M: rfq_closed
    API-->>M: quote_accepted + confirmationDeadline
    M->>API: ConfirmQuote
    API-->>R: quote_confirmed + executionDeadline
    API-->>M: quote_confirmed + executionDeadline
    API-->>R: quote_executed + requester order IDs
    API-->>M: quote_executed + maker order IDs
```

## Create an RFQ

`POST /v1/rfqs`

```json theme={null}
{
  "cashOrderQty": "10.0000",
  "symbol": "caoc-...",
  "restRemainder": false,
  "account": "firm/account"
}
```

| Field           | Required         | Description                                                                                    |
| --------------- | ---------------- | ---------------------------------------------------------------------------------------------- |
| `qtyDecimal`    | One sizing field | Exact contract quantity. Mutually exclusive with `cashOrderQty`.                               |
| `cashOrderQty`  | One sizing field | Positive cash notional with at most four decimal places. Mutually exclusive with `qtyDecimal`. |
| `symbol`        | Yes              | Existing open and tradable combo symbol.                                                       |
| `restRemainder` | Yes              | Whether an unfilled requester remainder may rest after paired order submission.                |
| `account`       | Yes              | Requester's fully qualified trading account.                                                   |

The response contains the new `rfqId`. A created RFQ starts in `RFQ_STATUS_OPEN`.

## Query RFQs

`GET /v1/rfqs?limit=10&status=RFQ_STATUS_OPEN`

| Parameter    | Description                                                  |
| ------------ | ------------------------------------------------------------ |
| `limit`      | Results per page. Default 100; valid range 1–100.            |
| `cursor`     | Opaque cursor returned by the preceding page.                |
| `rfqId`      | Exact RFQ ID. Do not combine an exact-ID read with `cursor`. |
| `symbol`     | Exact combo symbol.                                          |
| `status`     | `RFQ_STATUS_OPEN` or `RFQ_STATUS_CLOSED`.                    |
| `userFilter` | `USER_FILTER_SELF` returns RFQs created by the caller.       |

The response has `rfqs` and an opaque `cursor`. An exact RFQ ID that is absent or not visible returns an empty `rfqs` array.

## Close an RFQ

`DELETE /v1/rfqs/{rfqId}` closes an open RFQ. Only its requester can close it. The response is `{}`.

## Quotes

A quote can offer both requester sides:

* `buyPrice` is the price for a requester buy; the maker sells.
* `sellPrice` is the price for a requester sell; the maker buys.

Set an unavailable side to `"0"`. At least one side must be positive. Nonzero prices must be within the instrument's price limits and land on its tick size.

### Create or Replace a Quote

`POST /v1/rfqs/quotes`

```json theme={null}
{
  "rfqId": "rfq_...",
  "buyPrice": "0.615",
  "sellPrice": "0.585",
  "restRemainder": false,
  "postOnly": true,
  "account": "firm/account"
}
```

| Field           | Required | Description                                                                       |
| --------------- | -------- | --------------------------------------------------------------------------------- |
| `rfqId`         | Yes      | Open RFQ to quote.                                                                |
| `buyPrice`      | Yes      | Requester-buy price, or `"0"` if unavailable.                                     |
| `sellPrice`     | Yes      | Requester-sell price, or `"0"` if unavailable.                                    |
| `restRemainder` | Yes      | Whether the maker order may rest after paired order submission.                   |
| `postOnly`      | No       | If true, submit the maker order as participate-don't-initiate. Defaults to false. |
| `account`       | Yes      | Maker's fully qualified trading account.                                          |

The service derives `buyQtyDecimal` and `sellQtyDecimal` from the RFQ:

* A quantity RFQ uses its `qtyDecimal` for every offered side.
* A cash RFQ derives each side independently from `cashOrderQty / price`, rounded down to the instrument's fractional quantity scale.

Each maker has one deterministic quote ID per RFQ. Calling `CreateQuote` again replaces that maker's quote in place, resets it to `QUOTE_STATUS_ACTIVE`, and returns the same `quoteId`.

### Query Quotes

`GET /v1/rfqs/quotes?rfqId=rfq_...`

| Parameter       | Description                                                                           |
| --------------- | ------------------------------------------------------------------------------------- |
| `limit`         | Results per page. Default 100; valid range 1–100.                                     |
| `cursor`        | Opaque cursor returned by the preceding page.                                         |
| `quoteId`       | Exact quote ID. Requires `rfqId`; do not combine with `cursor`.                       |
| `rfqId`         | Exact RFQ ID. The requester sees all quotes; another participant sees only its quote. |
| `status`        | One current `QuoteStatus` value.                                                      |
| `userFilter`    | `USER_FILTER_SELF` returns quotes created by the caller.                              |
| `rfqUserFilter` | `USER_FILTER_SELF` returns quotes on RFQs created by the caller.                      |

Without `rfqId`, provide exactly one of `userFilter=USER_FILTER_SELF` or `rfqUserFilter=USER_FILTER_SELF`. The response has `quotes` and an opaque `cursor`.

<Warning>
  Cursors are query-, participant-, and path-bound. Treat them as opaque and reuse them only with the same filters and authenticated participant.
</Warning>

### Accept a Quote

`PUT /v1/rfqs/{rfqId}/quotes/{quoteId}/accept`

```json theme={null}
{
  "acceptedSide": "SIDE_BUY"
}
```

Only the requester can accept an active quote. `SIDE_BUY` selects `buyPrice`; `SIDE_SELL` selects `sellPrice`. The selected price must be positive. Acceptance closes the RFQ, changes the quote to `QUOTE_STATUS_ACCEPTED`, and starts last look.

### Delete a Quote

`DELETE /v1/rfqs/{rfqId}/quotes/{quoteId}` deletes the caller's active quote while the RFQ is open. The selected maker can also delete its accepted quote before the confirmation deadline to decline during last look. The response is `{}`.

### Confirm a Quote

`PUT /v1/rfqs/{rfqId}/quotes/{quoteId}/confirm`

The selected maker must confirm before `confirmationDeadline`. Confirmation changes the quote to `QUOTE_STATUS_CONFIRMED` and schedules paired order submission. The response is `{}`.

## Statuses

| Type  | Status                   | Meaning                                                                               |
| ----- | ------------------------ | ------------------------------------------------------------------------------------- |
| RFQ   | `RFQ_STATUS_OPEN`        | Can receive and accept quotes.                                                        |
| RFQ   | `RFQ_STATUS_CLOSED`      | Closed by the requester or by quote acceptance.                                       |
| Quote | `QUOTE_STATUS_ACTIVE`    | Can be accepted while its RFQ is open.                                                |
| Quote | `QUOTE_STATUS_ACCEPTED`  | Selected; maker last look is active.                                                  |
| Quote | `QUOTE_STATUS_CONFIRMED` | Maker confirmed; paired order submission is scheduled or needs reconciliation.        |
| Quote | `QUOTE_STATUS_DELETED`   | Maker deleted or declined the quote.                                                  |
| Quote | `QUOTE_STATUS_EXECUTED`  | Both exchange orders were accepted for submission. Reconcile fills through Drop Copy. |

## Events and Recovery

`RFQAPI.StreamRFQEvents` is a live, best-effort gRPC stream. Public RFQ events are visible to participants; quote events are private to the requester and relevant maker. The stream has no replay, gap-free handoff, ordering, or deduplication guarantee.

Open the stream for low-latency changes. On startup or reconnect, reconcile durable state with `GetRFQs` and `GetQuotes`. See [RFQ Events Stream](/streaming-endpoints/rfq-events-stream).

## See Also

<CardGroup cols={2}>
  <Card title="Combos API" icon="shuffle" href="/institutional/combos/overview">
    Create and read combo instruments
  </Card>

  <Card title="Combos Guide" icon="shuffle" href="/trader-guide/combos">
    Maker workflow and quote rules
  </Card>

  <Card title="RFQ Events Stream" icon="bolt" href="/streaming-endpoints/rfq-events-stream">
    Current event payloads and recovery behavior
  </Card>

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