Skip to main content
GET
/
markets
/
{slug}
/
orderbook
Get Orderbook
curl --request GET \
  --url https://api.limitless.exchange/markets/{slug}/orderbook
{
  "adjustedMidpoint": 0.75,
  "asks": [
    {
      "price": 0.76,
      "size": 100
    }
  ],
  "bids": [
    {
      "price": 0.74,
      "size": 150
    }
  ],
  "lastTradePrice": 0.75,
  "maxSpread": 0.05,
  "minSize": 1,
  "tokenId": "19633204485790857949828516737993423758628930235371629943999544859324645414627"
}
For real-time orderbook updates, use the WebSocket API instead of polling this endpoint. Subscribe to subscribe_market_prices with marketSlugs.

Complementary token prices (deriving the NO book)

This endpoint returns a single, YES-side book. The tokenId in the response is the market’s YES position ID, and bids/asks are quoted in YES-token terms. The two outcome tokens are complementary — a YES share and a NO share always redeem together for exactly $1 — so their prices satisfy:
price(YES) + price(NO) = 1
The book you get back already merges all liquidity for the market: native NO orders are converted into their YES-side equivalent before aggregation, using the same identity:
NO bid  @ P   ≡   YES ask @ (1 - P)     (someone bidding for NO is offering YES)
NO ask  @ P   ≡   YES bid @ (1 - P)     (someone offering NO is bidding for YES)
So you never lose NO liquidity by reading the YES book — it’s all there, expressed in YES prices.

Deriving the NO orderbook

To quote or trade the NO token, mirror the returned YES book: flip bids ↔ asks and replace every price p with 1 - p (sizes are unchanged).
NO bookDerived fromBest level
NO bids (orders to buy NO)YES asksbest NO bid = 1 - bestYesAsk
NO asks (orders to sell NO)YES bidsbest NO ask = 1 - bestYesBid
The midpoint and spread carry over directly: noMidpoint = 1 - yesMidpoint, and the spread is identical.
type Level = { price: number; size: number };
type Book = { bids: Level[]; asks: Level[] };

// Mirror the YES-side book into the NO-side book.
function deriveNoBook(yes: Book): Book {
  const invert = (l: Level): Level => ({ price: 1 - l.price, size: l.size });
  return {
    bids: yes.asks.map(invert).sort((a, b) => b.price - a.price), // best (highest) first
    asks: yes.bids.map(invert).sort((a, b) => a.price - b.price), // best (lowest) first
  };
}

// To SELL NO, hit the best NO bid:  1 - bestYesAsk
// To BUY  NO, lift the best NO ask: 1 - bestYesBid
When you then place a NO order, sign it against the NO tokenId (noPositionId from Get Market) at the derived price — the price inversion only affects how you read the book, not how the order is signed.

Multi-outcome (NegRisk) markets

In a NegRisk multi-outcome market, each outcome is its own market with its own slug, its own YES/NO tokens, and its own orderbook. Fetch each outcome’s book by its slug and derive that outcome’s NO book with the same inversion above — there is no single cross-outcome book to invert. What links the outcomes is a soft pricing constraint, not a shared book: across the N outcomes, the YES prices tend toward summing to 1 (exactly one outcome resolves YES), and all the NO contracts are linked for share conversion. To assemble a full picture of a multi-outcome market, request the orderbook for each outcome slug and mirror each one independently.

Path Parameters

Response

Current orderbook with bids and asks

adjustedMidpoint
number
Example:

0.75

asks
object[]
bids
object[]
lastTradePrice
number
Example:

0.75

maxSpread
number
Example:

0.05

minSize
number
Example:

1

tokenId
string
Example:

"19633204485790857949828516737993423758628930235371629943999544859324645414627"