Skip to main content
GET
/
v1
/
mm
/
quote-requests
/
stream
curl -N https://api.totalis.trade/v1/mm/quote-requests/stream \
  -H "X-API-Key: $API_KEY" \
  -H "Accept: text/event-stream"
event: connected
data: {"mm_id":"mm-uuid-1234"}

event: snapshot_begin
data: {"page_size":50}

event: quote_request
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40","user_id":"did:privy:cm3abc...","input_legs":[{"market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"legs":[{"id":"8ccf2c5d-3a61-4707-93f2-b6f0a0f0c0c6","event_ticker":"KXBTC-26JUN01","market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"bet_amount":25,"user_stake":24.75,"implied_probability":0,"version":1,"request_hash":"sha256:9f86d08...","expires_at":"2026-06-01T18:45:30.000Z"}

event: snapshot_complete
data: {"pages":1,"total":3}

event: quote_request
data: {"id":"f7e8d9c0-1234-5678-abcd-ef0123456789","user_id":"did:privy:cm9xyz...","input_legs":[{"market_ticker":"KXETH-26JUN01-T3000","side":"no","venue":"kalshi"}],"legs":[{"id":"d4e5f6a7-8901-23bc-def4-567890abcdef","event_ticker":"KXETH-26JUN01","market_ticker":"KXETH-26JUN01-T3000","side":"no","venue":"kalshi"}],"bet_amount":10,"user_stake":9.90,"implied_probability":0,"version":1,"request_hash":"sha256:b5c6d7e...","expires_at":"2026-06-01T18:50:00.000Z"}

event: quote_request:updated
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40","user_id":"did:privy:cm3abc...","input_legs":[{"market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"legs":[{"id":"8ccf2c5d-3a61-4707-93f2-b6f0a0f0c0c6","event_ticker":"KXBTC-26JUN01","market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"bet_amount":50,"user_stake":49.50,"implied_probability":0,"version":2,"request_hash":"sha256:3b1f9c2...","expires_at":"2026-06-01T18:46:10.000Z"}

event: quote_request_expired
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40"}
Open a Server-Sent Events (SSE) stream to receive all active quote requests in real time. This is the primary integration path for market makers — use it instead of polling. The stream emits new requests as they arrive, updates when requests change, and notifies when requests expire.

Authentication

API key required. Pass your market maker API key in the X-API-Key header.
X-API-Key: <key>

SSE Event Types

connected

Sent immediately on connection. Confirms your identity.
{
  "mm_id": "mm-uuid-1234"
}

snapshot_begin

Sent at the start of the initial snapshot (on new connection or reconnect). All currently active quote requests follow before snapshot_complete.
{
  "page_size": 500
}

quote_request

Sent when a new quote request is created, and once for each active request replayed during the initial snapshot. This is the primary event you price against.
{
  "id": "1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40",
  "user_id": "did:privy:cm3abc...",
  "input_legs": [
    {"market_ticker": "KXBTC-26JUN01-T72500", "side": "yes", "venue": "kalshi"},
    {"market_ticker": "KXBTC-26JUN01-T73000", "side": "no", "venue": "kalshi"}
  ],
  "legs": [
    {
      "id": "8ccf2c5d-3a61-4707-93f2-b6f0a0f0c0c6",
      "event_ticker": "KXBTC-26JUN01",
      "market_ticker": "KXBTC-26JUN01-T72500",
      "side": "yes",
      "venue": "kalshi"
    },
    {
      "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
      "event_ticker": "KXBTC-26JUN01",
      "market_ticker": "KXBTC-26JUN01-T73000",
      "side": "no",
      "venue": "kalshi"
    }
  ],
  "bet_amount": 25,
  "user_stake": 24.75,
  "implied_probability": 0,
  "version": 1,
  "request_hash": "sha256:9f86d08...",
  "expires_at": "2026-06-01T18:45:30.000Z"
}

quote_request:updated

Sent when a request you have already seen changes to a new version — the user edited the legs or the bet amount. The payload is identical to quote_request (with the incremented version and new request_hash). Any quote you submitted for the prior version is automatically invalidated; re-price and submit a new quote against the new version and request_hash. You do not need to withdraw the prior quote — it never blocks the new submission.
This is a distinct event name from quote_request. If your client only registers a listener for quote_request, it will miss every version bump. Register a listener for quote_request:updated as well (or, with a raw SSE parser, branch on the event: field).
{
  "id": "1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40",
  "user_id": "did:privy:cm3abc...",
  "input_legs": [ "..." ],
  "legs": [ "..." ],
  "bet_amount": 50,
  "user_stake": 49.50,
  "implied_probability": 0,
  "version": 2,
  "request_hash": "sha256:3b1f9c2...",
  "expires_at": "2026-06-01T18:46:10.000Z"
}

snapshot_complete

Sent when the initial snapshot is finished. After this, the stream switches to incremental updates only.
{
  "pages": 2,
  "total": 87
}

quote_request_expired

Sent when a previously seen quote request is no longer active (expired, committed, or cancelled). Remove it from your local state.
{
  "id": "1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40"
}

Reconnection

Every SSE event includes an id: field. Persist this value. On reconnect, pass it as the last_event_id query parameter to replay any events you missed instead of receiving the full snapshot again.
GET /v1/mm/quote-requests/stream?last_event_id=evt_abc123
The taker-fee rate is read once per connection (server-side), so user_stake on a long-lived stream reflects the rate in effect when you connected. If the fee rate changes, reconnect to pick up user_stake values computed at the new rate.

Notes

  • Net stake. user_stake is the net stake the MM underwrites: user_stake = bet_amount − taker_fee, where taker_fee = floor(bet_amount_micro × taker_fee_bps / 10000) is computed in integer microUSDC (1 USDC = 1e6 micro) — e.g. a 25.00 bet at 100 bps gives a 0.25 fee and user_stake 24.75. Price payout_odds and size collateral against user_stake, not bet_amount. bet_amount stays the user’s gross wager but is not the quoting base when the taker fee is on (taker_fee_bps > 0); when the fee is off, user_stake == bet_amount.
  • The stream automatically excludes quote requests created by your own user account.
  • Keep the connection alive and send a heartbeat at least every 30 seconds to signal liveness.
  • A version change arrives as a quote_request:updated event (a new request arrives as quote_request). When the version changes, any quote you submitted for the prior version is automatically invalidated — it leaves the book immediately and never blocks a new quote. Re-price and submit a new quote with the updated version and request_hash; you do not need to withdraw the old one.

Errors

StatusCodeDescription
401UNAUTHORIZEDMissing or invalid API key.
curl -N https://api.totalis.trade/v1/mm/quote-requests/stream \
  -H "X-API-Key: $API_KEY" \
  -H "Accept: text/event-stream"
event: connected
data: {"mm_id":"mm-uuid-1234"}

event: snapshot_begin
data: {"page_size":50}

event: quote_request
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40","user_id":"did:privy:cm3abc...","input_legs":[{"market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"legs":[{"id":"8ccf2c5d-3a61-4707-93f2-b6f0a0f0c0c6","event_ticker":"KXBTC-26JUN01","market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"bet_amount":25,"user_stake":24.75,"implied_probability":0,"version":1,"request_hash":"sha256:9f86d08...","expires_at":"2026-06-01T18:45:30.000Z"}

event: snapshot_complete
data: {"pages":1,"total":3}

event: quote_request
data: {"id":"f7e8d9c0-1234-5678-abcd-ef0123456789","user_id":"did:privy:cm9xyz...","input_legs":[{"market_ticker":"KXETH-26JUN01-T3000","side":"no","venue":"kalshi"}],"legs":[{"id":"d4e5f6a7-8901-23bc-def4-567890abcdef","event_ticker":"KXETH-26JUN01","market_ticker":"KXETH-26JUN01-T3000","side":"no","venue":"kalshi"}],"bet_amount":10,"user_stake":9.90,"implied_probability":0,"version":1,"request_hash":"sha256:b5c6d7e...","expires_at":"2026-06-01T18:50:00.000Z"}

event: quote_request:updated
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40","user_id":"did:privy:cm3abc...","input_legs":[{"market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"legs":[{"id":"8ccf2c5d-3a61-4707-93f2-b6f0a0f0c0c6","event_ticker":"KXBTC-26JUN01","market_ticker":"KXBTC-26JUN01-T72500","side":"yes","venue":"kalshi"}],"bet_amount":50,"user_stake":49.50,"implied_probability":0,"version":2,"request_hash":"sha256:3b1f9c2...","expires_at":"2026-06-01T18:46:10.000Z"}

event: quote_request_expired
data: {"id":"1a6d1f06-9d4f-47cb-994b-3bdfbbef7e40"}