Skip to main content
Market makers on Totalis stream incoming parlay quote requests via SSE, submit competitive prices, and earn the spread when users commit and confirm trades. There is no separate market maker role — any authenticated user with an API key can quote.

How it works

1

Connect to the quote request stream

Open an SSE connection to GET /v1/mm/quote-requests/stream to receive live quote requests in real time. Maintain a heartbeat every 30 seconds. See the event summary table for every event name this stream sends — including a spelling inconsistency worth knowing about up front.
2

Submit draft quotes

Analyze the legs and submit payout odds via PUT /v1/mm/quote-requests/{id}/quote for the exact version and request_hash you received. Price payout_odds and size collateral against the net stake (user_stake), not bet_amountuser_stake is what the vault applies your odds to when the taker fee is on.
3

Confirm trades

When a user commits your quote, Totalis creates a real accepted RFQ and sends quote:accepted. The same mm:quotes:{mm_id} subscription may also receive mm_quote:accepted with details visible only to the selected MM, such as user_id, final quote economics, and exposure legs. Confirm with POST /v1/mm/quotes/{quoteId}/confirm before the deadline to lock in the trade. The user’s stake and your collateral lock together in on chain Solana vaults.

Core quoting loop

For most market makers, the integration surface should stay small:
StepEndpoint
Pull market context and current pricesGET /markets
Check invalid leg combinationsGET /markets/exclusion-groups
Stream live quote requestsGET /v1/mm/quote-requests/stream
Submit a draft quotePUT /v1/mm/quote-requests/{id}/quote
Withdraw a draft quoteDELETE /v1/mm/quote-requests/{id}/quote
Send liveness heartbeatPOST /v1/mm/heartbeat
Receive committed tradesquote:accepted on mm:quotes:{mm_id}
Receive accepted trade detailsmm_quote:accepted on mm:quotes:{mm_id}
Confirm an accepted quotePOST /v1/mm/quotes/{quoteId}/confirm
Use GET /v1/wallet to check available USDC and locked funds before quoting at size.

Pricing early cashouts

A user can close an active position before settlement by accepting a buyback price from you, its counterparty MM. You receive cashout requests on the same SSE stream you already subscribe to (GET /v1/mm/quote-requests/stream), as a distinct cashout_request event scoped to you and never broadcast. Respond with one of:
ActionEndpoint
Submit / update a buyback quotePUT /v1/mm/cashout-requests/{id}/quote
Decline (permanent refuse)POST /v1/mm/cashout-requests/{id}/decline

Fair value

Revalue the position at live odds: fair_value = fair_win_prob × total_payout, where fair_win_prob is the parlay’s current joint win probability. Convert that to a directional quote by shrinking it with a conservative exit edge that is MM favorable in both directions — you pay less when the user is up, the user pays more when they’re down. A partial settle buyback (some legs already resolved and pinned at certainty) uses a wider edge. The user’s stake is always refunded separately; your quote is the directional net amount on top of it, gross of the profit fee.

When to refuse

Pricing runs a fixed sequence of gates; the first match wins. There are two kinds of outcome:
  • Permanent decline — the position can’t be priced and won’t become priceable on retry. Call the decline endpoint; the user sees an instant declined.
  • Transient refuse — a leg has no trustworthy live price right now (a wide book or a feed blip). Submit nothing and stay silent; the request rides its ~90 s TTL so a later quote can still land.
GateConditionOutcome
Unrecognized resolutiona leg’s resolution isn’t a known valuepermanent decline
Worthlessany leg resolved lost or voidpermanent decline
Already decidedall legs resolved won (settlement pays full value shortly)permanent decline
Malformeda leg is missing its ticker or sidepermanent decline
No live pricea leg has no trustworthy live book (spread too wide / stale)transient — stay silent
Near decideda leg’s live price is outside the [0.05, 0.95] odds band, so repricing is unreliablepermanent decline
The no live price gate refuses a leg whose two sided spread exceeds the venue cap (Polymarket 5%, Kalshi 7%) or whose book is stale. A leg already resolved and pinned at certainty is exempt from the odds band check.

Get set up

Get an API key

Generate an API key from the Totalis Dashboard to authenticate REST and SSE requests.

Live quote requests

Learn the full trading flow: versioned quote requests, SSE streaming, commit protection, and rejection codes.

Rate limits

Authenticated clients get 300 req/min across REST endpoints, with X-RateLimit-* headers on every response.

MM API reference

Full endpoint reference for the MM side of the Quote Service.

Provide liquidity at scale

To provide liquidity on Totalis at scale, contact founders@totalis.trade to discuss onboarding, integration, and partnership terms.