Market Maker
Quote Request Stream
Server-Sent Events stream that pushes live quote requests to market makers. Authenticated via the X-API-Key header.
GET
Subscribe to the maker quote-request stream over Server-Sent Events. This is channel 1 of the three-channel maker transport — it pushes a
If your client cannot set custom headers, pass
connected event, an initial snapshot of open requests, and then live quote_request / quote_request_expired events. See the Quote Request Stream guide for the full walkthrough.
The response has Content-Type: text/event-stream. Use the browser EventSource API or any SSE-capable client.
Authentication
Provide your per-MM API key in theX-API-Key header:
?apiKey=<your-key> as a query parameter instead.
Headers
Your per-MM API key (or pass
?apiKey= as a query parameter).The last SSE event
id you processed. On reconnect, the server replays events after this id if they are still in the buffer; otherwise it falls back to a fresh snapshot. The browser EventSource API sets this automatically.Events
Sent once on connect. Data:
{ "makerId": "mm-alpha", "serverTime": "<iso>" }.Marks the start of the initial snapshot of open requests. Data:
{}.A new (or replayed/snapshot) quote request. Each carries an SSE
id: (monotonic integer). Data contains requestId, expiresAt, and params (wallet, market, option, trade).Marks the end of the initial snapshot. Data:
{}. Live events follow.A request closed (committed, expired, or cancelled). Data:
{ "requestId": "req-789" }.quote_request Data Fields
| 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 (their premium budget). The fill is floor(budgetUsd / yourPrice) whole options, capped by your quoted size. |
params.trade.size | number | Sells only. Number of whole options the taker wants to write. |
On a buy, the taker enters a USDC amount, not a contract count — so the request carries
trade.budgetUsd and no trade.size. You quote a per-option price; the number of options the taker receives is floor(budgetUsd / price). Size your collateral accordingly: floor(budgetUsd / price) × (1 − K) for a call, × K for a put.Keep-alive: the server sends SSE comment lines (
: ping) about every 25 seconds. SSE clients ignore them automatically.