quote_request events to you as traders open them. It replaces the old WebSocket quote_request broadcast.
| Channel | Transport | Direction | Purpose |
|---|---|---|---|
| 1 — Quote requests | SSE | server → maker | Receive live quote_request events (this page) |
| 2 — Quote submission | REST | maker → server | POST /v1/mm/quotes and confirm signature |
| 3 — Post-trade | WebSocket | server → maker | quote:accepted / quote:confirmed / quote:rejected |
To fully participate you must hold both this SSE stream open (to receive requests) and the post-trade WebSocket (to learn when you win). Quotes and confirmation signatures are submitted over REST.
Connecting
Content-Type: text/event-stream). In a browser, you can use the native EventSource API only if you authenticate via ?apiKey= on the URL (browsers cannot set X-API-Key on SSE). Market-maker bots run in Node.js and should use the eventsource npm package, which supports custom headers:
Authentication
Authenticate with your per-MM API key using theX-API-Key header:
The SSE quote-request stream and the REST quote endpoints authenticate via the
X-API-Key header (or ?apiKey=). The post-trade WebSocket still uses ?apiKey= on the URL or an auth message. See Authentication.Connection Handshake
When you connect, the server emits events in a fixed order.Replay or snapshot
The server then sends either a replay (if you reconnected with a Between
Last-Event-ID header that is still in the buffer) or a fresh snapshot of all currently open requests:snapshot_begin and snapshot_complete you receive zero or more quote_request events, each carrying an SSE id:.Events
connected
Sent once, immediately on connect.
snapshot_begin / snapshot_complete
Frame the initial set of open quote requests. Everything between them reflects the state at connect time.
quote_request — New or replayed quote request
A live quote request. Each event carries a monotonic integer SSE id: — track the last one you processed so the server can replay on reconnect.
| Field | Type | Description |
|---|---|---|
requestId | string | Unique ID for this quote request — use it when you POST /v1/mm/quotes |
expiresAt | string | ISO 8601 expiry time for the quote request (default 5 min TTL) |
params.wallet | string | Taker wallet address (may be null if not yet provided) |
params.market.conditionId | string | Polymarket condition ID (bytes32) |
params.market.yesTokenId | string | Polymarket YES CLOB token ID |
params.market.question | string | Human-readable market question |
params.option.optionType | string/number | "call" or "put" (or 0/1) |
params.option.strikeBps | number | Strike in basis points of $1 |
params.option.expiryMs | number | Option expiry (Unix ms) |
params.trade.side | string | "buy" or "sell" (taker’s side) |
params.trade.budgetUsd | number | Buys only. USDC the taker will spend. Fill = floor(budgetUsd / price) whole options, capped by your quoted size. |
params.trade.size | number | Sells only. Number of whole options the taker wants to write. |
quote_request_expired — Request closed
The request closed (committed, expired, or cancelled). Drop it from local state.
Reconnect & Replay
SSE clients should reconnect automatically on disconnect. The standardEventSource API tracks the last received id: and sends it back as the Last-Event-ID header on reconnect; the server replays any events you missed.
- If the gap is small enough to be covered by the server buffer, you receive a replay of the missed
quote_request/quote_request_expiredevents. - If the gap is too large, the server falls back to a fresh
snapshot_begin…snapshot_completesequence reflecting current open requests.
Keep-Alive
The server sends SSE comment lines (: ping) roughly every 25 seconds to keep the connection and any intermediary proxies alive. SSE clients ignore comment lines automatically.
Example
See the Market Maker guide for the end-to-end flow across all three channels, and the Quote Request Stream API reference for the endpoint details.
