> ## 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 Events Streaming

> Real-time combo RFQ and quote events via gRPC

<Note>
  **Upcoming - beta access required.** The RFQ events stream is part of the upcoming Combos API beta. Reach out to [institutional@polymarket.us](mailto:institutional@polymarket.us) to join the beta test.
</Note>

Subscribe to combo RFQ and quote lifecycle events using gRPC server-side streaming. Use this stream to avoid polling `GetRFQs` and `GetQuotes` while managing RFQ workflows.

## Service Definition

**Service:** `polymarket.v1.CombosAPI`\
**RPC:** `StreamRFQEvents`\
**Type:** Server-side streaming\
**Required scope:** `read:orders`

```protobuf theme={null}
service CombosAPI {
    rpc StreamRFQEvents(StreamRFQEventsRequest)
        returns (stream StreamRFQEventsResponse);
}
```

<Info>
  `StreamRFQEvents` is gRPC-only. The REST Combos endpoints are documented in the [Combos API Overview](/institutional/combos/overview).
</Info>

## Request Parameters

### StreamRFQEventsRequest

The request is currently empty.

```python theme={null}
from polymarket.v1 import combos_pb2

request = combos_pb2.StreamRFQEventsRequest()
```

## Response Messages

The stream returns `StreamRFQEventsResponse` messages. Each response has one `event` value.

| Event                     | Payload                     | Description                                       |
| ------------------------- | --------------------------- | ------------------------------------------------- |
| `rfq_created`             | `RFQCreatedEvent`           | A new RFQ was created.                            |
| `rfq_expired`             | `RFQExpiredEvent`           | An RFQ expired.                                   |
| `rfq_action_rejected`     | `RFQActionRejectedEvent`    | An RFQ action was rejected.                       |
| `quote_created`           | `QuoteCreatedEvent`         | A quote was created.                              |
| `quote_deleted`           | `QuoteDeletedEvent`         | A quote was deleted.                              |
| `quote_accepted`          | `QuoteAcceptedEvent`        | A quote was accepted.                             |
| `quote_expired`           | `QuoteExpiredEvent`         | A quote expired.                                  |
| `quote_passed`            | `QuotePassedEvent`          | A quote was passed.                               |
| `quote_done_away`         | `QuoteDoneAwayEvent`        | A quote was done away.                            |
| `quote_pending_risk`      | `QuotePendingRiskEvent`     | A quote entered pending-risk state.               |
| `quote_pending_end_trade` | `QuotePendingEndTradeEvent` | An accepted quote entered last-look confirmation. |
| `quote_status_rejected`   | `QuoteStatusRejectedEvent`  | A quote status transition was rejected.           |

## Event Payloads

### RFQ

| Field              | Type              | Description                                      |
| ------------------ | ----------------- | ------------------------------------------------ |
| `id`               | string            | RFQ ID.                                          |
| `qtyDecimal`       | string            | Requested quantity, when RFQ is quantity-based.  |
| `cashOrderQty`     | string            | Requested cash quantity, when RFQ is cash-based. |
| `side`             | `Side`            | Requester's side.                                |
| `instrument`       | `ComboInstrument` | Combo instrument details.                        |
| `rfqCreatorUserId` | string            | Public RFQ user ID for the requester.            |
| `clientRequestId`  | string            | Client request ID supplied at creation time.     |
| `expirationTime`   | `Timestamp`       | RFQ expiration time.                             |
| `createdTime`      | `Timestamp`       | RFQ creation time.                               |

### Quote

| Field              | Type          | Description                                  |
| ------------------ | ------------- | -------------------------------------------- |
| `id`               | string        | Quote ID.                                    |
| `rfqId`            | string        | RFQ being quoted.                            |
| `creatorRfqUserId` | string        | Public RFQ user ID for the quote creator.    |
| `symbol`           | string        | Combo symbol.                                |
| `qtyDecimal`       | string        | Quote quantity.                              |
| `side`             | `Side`        | Quote side.                                  |
| `price`            | string        | Quote price.                                 |
| `status`           | `QuoteStatus` | Current quote status.                        |
| `createdTime`      | `Timestamp`   | Quote creation time.                         |
| `expirationTime`   | `Timestamp`   | Quote expiration time.                       |
| `clientRequestId`  | string        | Client request ID supplied at creation time. |

### RFQActionReject

| Field             | Type                    | Description                                |
| ----------------- | ----------------------- | ------------------------------------------ |
| `action`          | `RFQActionRejectAction` | Action that was rejected.                  |
| `reason`          | `RFQActionRejectReason` | Rejection reason.                          |
| `symbol`          | string                  | Related symbol, when available.            |
| `text`            | string                  | Human-readable rejection text.             |
| `rfqId`           | string                  | Related RFQ ID, when available.            |
| `quoteId`         | string                  | Related quote ID, when available.          |
| `clientRequestId` | string                  | Related client request ID, when available. |

### RFQActionRejectAction

| Value                                    | Description                 |
| ---------------------------------------- | --------------------------- |
| `RFQ_ACTION_REJECT_ACTION_CREATE_RFQ`    | Create RFQ was rejected.    |
| `RFQ_ACTION_REJECT_ACTION_CREATE_QUOTE`  | Create quote was rejected.  |
| `RFQ_ACTION_REJECT_ACTION_DELETE_QUOTE`  | Delete quote was rejected.  |
| `RFQ_ACTION_REJECT_ACTION_ACCEPT_QUOTE`  | Accept quote was rejected.  |
| `RFQ_ACTION_REJECT_ACTION_PASS_QUOTE`    | Pass quote was rejected.    |
| `RFQ_ACTION_REJECT_ACTION_CONFIRM_QUOTE` | Confirm quote was rejected. |

## Complete Example

```python theme={null}
import grpc
from polymarket.v1 import combos_pb2, combos_pb2_grpc


class RFQEventsStreamer:
    def __init__(self, grpc_server: str = "grpc-api.preprod.polymarketexchange.com:443"):
        self.grpc_server = grpc_server

    def stream_rfq_events(self, access_token: str, participant_id: str):
        channel = grpc.secure_channel(
            self.grpc_server,
            grpc.ssl_channel_credentials()
        )
        stub = combos_pb2_grpc.CombosAPIStub(channel)
        metadata = [
            ("authorization", f"Bearer {access_token}"),
            ("x-participant-id", participant_id),
        ]
        request = combos_pb2.StreamRFQEventsRequest()

        for response in stub.StreamRFQEvents(request, metadata=metadata):
            event_type = response.WhichOneof("event")

            if event_type == "rfq_created":
                rfq = response.rfq_created.rfq
                print(f"RFQ created: {rfq.id} {rfq.side}")

            elif event_type == "quote_created":
                quote = response.quote_created.quote
                print(f"Quote created: {quote.id} for RFQ {quote.rfq_id}")

            elif event_type == "quote_accepted":
                quote = response.quote_accepted.quote
                print(f"Quote accepted: {quote.id}")

            elif event_type == "rfq_action_rejected":
                reject = response.rfq_action_rejected.reject
                print(f"RFQ action rejected: {reject.action} {reject.reason} {reject.text}")
```

## Stream Behavior

| Behavior   | Description                                                             |
| ---------- | ----------------------------------------------------------------------- |
| Delivery   | Server pushes events as RFQs and quotes change.                         |
| Filtering  | The request is currently empty; filtering is not currently exposed.     |
| Reconnects | Reconnect with backoff after transient `UNAVAILABLE` or network errors. |
| Ordering   | Process events in receive order for a single stream.                    |

## Error Codes

| gRPC Code             | Cause                                                                                                  |
| --------------------- | ------------------------------------------------------------------------------------------------------ |
| `INVALID_ARGUMENT`    | Missing participant ID. Pass `x-participant-id` metadata or use a token with a `participant_id` claim. |
| `UNAUTHENTICATED`     | Missing or invalid bearer token.                                                                       |
| `PERMISSION_DENIED`   | Token lacks `read:orders` or participant access.                                                       |
| `FAILED_PRECONDITION` | Participant token setup is not ready or token state is invalid.                                        |
| `UNAVAILABLE`         | Upstream Combos service or stream is unavailable.                                                      |

## See Also

<CardGroup cols={2}>
  <Card title="Combos API" icon="shuffle" href="/institutional/combos/overview">
    REST and unary gRPC RFQ operations
  </Card>

  <Card title="gRPC Streaming Overview" icon="bolt" href="/streaming-endpoints/grpc-overview">
    Endpoints, auth, and connection setup
  </Card>

  <Card title="Authentication" icon="key" href="/streaming-endpoints/authentication">
    gRPC metadata and scopes
  </Card>

  <Card title="Error Handling" icon="triangle-exclamation" href="/streaming-endpoints/error-handling">
    Reconnection and retry guidance
  </Card>
</CardGroup>
