| Channel | Transport | Direction | Purpose |
|---|---|---|---|
| 1 — Quote requests | SSE | server → maker | Receive live quote_request events (Quote Request Stream) |
| 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 (this page) |
A maker must be connected to both the SSE quote-request stream (to receive requests) and this WebSocket (to receive
quote:accepted) to fully participate. Confirmation signatures go back over REST (channel 2), not over the WebSocket.Connecting
Authentication
Each market maker authenticates with a per-MM API key generated from the dashboard. The key maps to a stablemakerId. There are two equivalent ways to authenticate:
Option A — query parameter:
auth message sent immediately after the socket opens:
makerId:
4001.
If the relay is started without any maker keys configured, it runs in OPEN dev mode — it accepts anyone and assigns an anonymous
makerId. See the Authentication guide for full details and how to obtain a key.The post-trade WebSocket still authenticates via
?apiKey= or the auth message. The SSE quote-request stream and the REST quote endpoints authenticate via the X-API-Key header instead (see Authentication).Keep-Alive
The server sends a WebSocket ping every ~25 seconds; your client must respond with a pong to maintain the connection (most WebSocket libraries handle this automatically). You can also send an application-level keep-alive at any time:Post-Trade Events
The WebSocket delivers only post-trade events. There is noquote_request, quote, order_to_sign, or order_signed on this channel anymore — those moved to SSE (in) and REST (out).
quote:accepted — You won; sign and confirm
Sent only to the winning maker when a taker commits. It carries the exact Order struct, the EIP-712 domain and types, and a confirmationDeadline. Sign the order with the wallet key for order.maker, then POST the signature to POST /v1/mm/quotes/:quoteId/confirm before confirmationDeadline.
order / domain / types shapes are identical to the legacy order_to_sign message — only the transport changed. The backend verifies that your signature recovers to order.maker.
quote:confirmed — Your quote won and was confirmed
Sent after your confirmation signature is verified. Your trade is locked in and the taker can now settle on-chain.
quote:rejected — Another maker won (or the request closed)
Sent when another maker’s quote won, or when the request closed without your quote winning. Drop the request from local state.
Protocol Version
The current protocol version is 3. TheprotocolVersion field in the connected message tells you which version the relay is running. Check the version on connect to ensure compatibility.
Migrating from protocol v2: The WebSocket no longer carries
quote_request, quote, order_to_sign, or order_signed. Quote requests now arrive over the SSE quote-request stream; quotes and confirmation signatures are submitted over REST. The WebSocket is now post-trade only, delivering quote:accepted, quote:confirmed, and quote:rejected.Example: Full Maker Lifecycle Across All Three Channels
This example subscribes to the SSE quote-request stream for incoming requests, POSTs quotes via REST, listens on the WebSocket forquote:accepted, signs with ethers, and POSTs the signature to the confirm endpoint.
