Skip to main content

Envelope

Every error, on every endpoint, has the same shape:

HTTP statuses

A parlay id you do not own returns 404, not 403, so the API never confirms that another account’s parlay exists. A quote request id you do not own returns 403.

Top level codes

Authentication

The 403 for a malformed key carries a hint about the expected format. Keys match api_(live|test)_[A-Za-z0-9_-]{28,36}. The scope catalog is on Authentication.

Committing a quote

Returned by POST /v1/quote-requests/{id}/commit in error.details.reason. No commit failure moves funds: if the commit did not return success, the trade did not happen.

Submitting a quote

Returned by PUT /v1/mm/quote-requests/{id}/quote. Both 503s fail closed on purpose, so a quote is never admitted against a balance or fee rate that could not be read. Priced at an unknown fee, your odds would apply to the gross bet and you would underwrite more than you modeled.

Bidding on a cashout auction

Returned by PUT /v1/mm/cashout-requests/{id}/quote. buyback_wallet_missing fails only your bids. Others can still win the auction as an acquisition, so do not blacklist the position.

Rejections you never see

These cashout rejections happen when the user commits, not when you bid. They never reach you as an HTTP response. You learn of them by not being filled.

Triage

Separate 400 / 401 / 403 from 404 / 409 in your alerting from day one. Logged together, a losing auction and a broken integration look identical. A market maker whose key silently lost the mm:quote scope sees nothing but quiet 403s.