/v1/ prefix on the Quote Service base URL.
How It Works
Create a Quote Request
Call
POST /v1/quote-requests with your parlay legs and bet amount. You can update legs or bet amount with PATCH /v1/quote-requests/{id} — each change bumps the version and invalidates stale quotes.Stream Live Pricing
Open an SSE connection to
GET /v1/quote-requests/{id}/stream to receive best_quote events as market makers submit and update their offers. Each event includes book_seq (monotonically increasing) and the current best payout multiplier.Market Makers Price Your Request
Connected market makers receive your request via their SSE stream and submit competing quotes via
PUT /v1/mm/quote-requests/{id}/quote. You always see the best available offer.Commit the Best Quote
When you’re satisfied with the price, call
POST /v1/quote-requests/{id}/commit. The commit includes protection fields that prove you saw the current price, preventing stale execution.Trade Confirmation
The winning market maker receives a
quote:accepted event via WebSocket and confirms the trade. Vault settlement begins automatically.Commit Protection
The commit endpoint requires these fields to ensure you’re locking in the price you actually saw:| Field | Type | Description |
|---|---|---|
expected_version | integer | The quote request version you’re committing against. Rejected if the request was modified since your last update. |
displayed_quote_id | string | The id of the best quote you were shown. |
displayed_quote_book_seq | integer | The book_seq from the SSE event that delivered the quote. Proves your pricing was current. |
min_payout_odds_seen | number | The minimum payout odds you saw. Only quotes at or above this threshold can be selected. |
Rejection Codes
If a commit fails,error.details.reason tells you why:
| Reason | What Happened |
|---|---|
QUOTE_CHANGED | The request was updated since your last fetch. Re-fetch and try again. |
MARKET_NOT_LIVE | One or more markets expired, halted, or were delisted. Remove the affected legs. |
QUOTE_EXPIRED | All quotes expired. Wait for a fresh quote and retry. |
COMMIT_FAILED_RETRYABLE | Temporary error. Retry after a short delay. |
For Market Makers
Receiving Quote Requests
Connect to the MM SSE stream to receive quote requests in real time. On initial connection you receive a snapshot of all active requests, then incremental updates as new requests arrive.Submitting Quotes
CallPUT /v1/mm/quote-requests/{id}/quote with the request_version and request_hash from the SSE event. One active quote per request version — submitting again replaces your previous quote. Send only the fields below; the server derives user_cost, total_payout, and mm_cost from payout_odds and the request’s bet_amount.
PUT a new quote with the new version and request_hash. You don’t need to withdraw the old one.
Withdrawing Quotes
CallDELETE /v1/mm/quote-requests/{id}/quote to retract a quote on the current version before the user commits it — for example, if your price moved and you want to stand down. This is not part of the version-change flow: a new version already invalidates your prior quote, so you don’t withdraw to re-quote.
Heartbeat
SendPOST /v1/mm/heartbeat every 30 seconds to signal liveness. The TTL is 60 seconds.
SSE Event Format
Events on the user stream (/v1/quote-requests/{id}/stream):
best_quote is null. Store book_seq and best_quote.id from the latest event — you’ll need them for the commit request.
