vike
API EndpointsPolymarket

/orderbook

An order-book snapshot for one outcome token, taken from the nearest recorded snapshot at or before ts. Rows can repeat per (side, level) — de-duplicate before summing size.

GET https://data.vike.io/v1/polymarket/orderbook?token_id={token_id}

An order-book snapshot for one outcome token, taken from the nearest recorded book snapshot at or before ts — the latest one if ts is omitted. Rows carry as_of_ts, side, level, price and size, with level numbering outward from the touch, starting at 1 on each side.

Truncated for the page: 25 rows were returned, levels 1 through 25; the first three are shown.

Three things in this capture are worth more than the row shape:

as_of_ts was two weeks stale. No ts was passed, so this is "the latest snapshot" — and the latest is 1787183491190, 2026-08-19T23:51:31Z, for a call made on 2026-09-03. That is the as_of_ts note below made concrete: the endpoint answered 200 with a perfectly well-formed book that was a fortnight old, and nothing but as_of_ts said so.

This response has no duplication at all — 25 rows, 25 distinct (side, level) pairs. That is the factor-1 case the warning below describes. Do not read it as evidence the duplication is fixed; de-duplicate anyway, because the factor is per-token and moves day to day.

Every one of the 25 rows is a bid — there is no ask row in the response

Every one of the captured rows has side bid. depth is applied per side — the query keeps level <= depth on each — so it is not what kept the asks out: that snapshot simply held no ask rows. How the sides are ordered, and why one can be absent, is on Polymarket data model.

cURL
# the latest recorded book snapshot of one outcome token; read as_of_ts, because the latest recorded snapshot can be old
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630"

# just the touch and four levels behind it: depth counts levels per side, so a two-sided book gives five bids and five asks (before any repeats, see the end)
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&depth=5"

# the book as of a moment you name, in epoch milliseconds: the nearest snapshot at or before ts, and as_of_ts says which one that was
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1787180000000"

# an hour earlier, to see how the book moved; each step back is one call, so for book history in bulk use the archive instead
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1787176400000"

# a ts before the token's tape began is 200 with [], with no as_of_ts to read
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1784900000000"

# the other outcome token has its own book
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=107869950127184141743772429738701578723770582686430100389837827512148691029625&depth=5"

# read it the way the page says: repeats are not extra depth, so keep one row per (side, level) before summing size
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&depth=5" | jq 'unique_by([.side, .level])'
token_idqueryrequired
The outcome token.
tsqueryoptional
As-of epoch ms. The nearest snapshot at-or-before it is used; omit for the latest.
depthqueryoptional
Levels per side. Default 25, hard cap 25.
Example response
[
  {
    "as_of_ts": 1787183491190,
    "level": 1,
    "price": 0.999,
    "side": "bid",
    "size": 303284.22
  },
  {
    "as_of_ts": 1787183491190,
    "level": 2,
    "price": 0.991,
    "side": "bid",
    "size": 10077
  },
  {
    "as_of_ts": 1787183491190,
    "level": 3,
    "price": 0.99,
    "side": "bid",
    "size": 20105
  }
]

as_of_ts is the snapshot's own timestamp, not the ts you asked for; Freshness says why to read it. A book shallower than depth returns fewer levels; that is the real depth, not truncation.

The same (side, level) can arrive several times, so de-duplicate before summing size: Polymarket data model.

For book history rather than a snapshot, use the bulk archive — it carries every book event, and it is far cheaper than replaying snapshots through this endpoint.

cURL
# the latest recorded book snapshot of one outcome token; read as_of_ts, because the latest recorded snapshot can be oldcurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630"# just the touch and four levels behind it: depth counts levels per side, so a two-sided book gives five bids and five asks (before any repeats, see the end)curl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&depth=5"# the book as of a moment you name, in epoch milliseconds: the nearest snapshot at or before ts, and as_of_ts says which one that wascurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1787180000000"# an hour earlier, to see how the book moved; each step back is one call, so for book history in bulk use the archive insteadcurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1787176400000"# a ts before the token's tape began is 200 with [], with no as_of_ts to readcurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&ts=1784900000000"# the other outcome token has its own bookcurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=107869950127184141743772429738701578723770582686430100389837827512148691029625&depth=5"# read it the way the page says: repeats are not extra depth, so keep one row per (side, level) before summing sizecurl -s -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/polymarket/orderbook?token_id=95532524407959903145510583684979049735028502452973932716346555811355282494630&depth=5" | jq 'unique_by([.side, .level])'
Example response
[  {    "as_of_ts": 1787183491190,    "level": 1,    "price": 0.999,    "side": "bid",    "size": 303284.22  },  {    "as_of_ts": 1787183491190,    "level": 2,    "price": 0.991,    "side": "bid",    "size": 10077  },  {    "as_of_ts": 1787183491190,    "level": 3,    "price": 0.99,    "side": "bid",    "size": 20105  }]