Skip to main content

Shape

Each row is the complete orderbook for one market outcome at one source timestamp. It replaces both sides of the previous book; it is not a level update. Orderbook snapshots are event-driven, not sampled at a fixed interval. Probalytics processes the venue’s ordered event stream, applies each change to the reconstructed book, and publishes a new complete snapshot when the book changes. VERIFIED snapshots are thoroughly checked and guarantee that the orderbook is correct. A quiet market can therefore have a long time between rows without any missing data.
Orderbook reconstruction has more moving parts than our other datasets. If anything here is unclear, ask us in the Probalytics Telegram channel or email support@probalytics.io. Include the market_id, outcome.id, and time range when asking about a specific series.

Reading a snapshot

Every row is a complete, independently usable orderbook. bids contains all bids present at that moment, and asks contains all asks. You do not need to apply the row to an earlier snapshot or reconstruct missing levels. An empty bids or asks array means there were no orders on that side of the book. It does not mean “unchanged.” Ordering matters when building a time series:
  1. Read one (market_id, outcome.id) series at a time.
  2. Order snapshots by timestamp, then path_index.
  3. If duplicate copies of the same snapshot exist, keep the one with the latest indexed_at.
  4. When continuity = RESET, treat that row as a fresh starting point. If an earlier row exists, do not calculate a change between the two rows or forward-fill values from the earlier row. Continue normally from the RESET row.

State and continuity

state and continuity answer different questions:
  • state: how was this row validated within its emitted path?
  • continuity: can this path be connected to the previously published dataset state?

Ordering rows

Read one (market_id, outcome.id) series at a time and order it by timestamp, then path_index. Several reconstructed states can share a timestamp; path_index orders those states and starts again at 0 for the next update sequence. indexed_at is not source-event order. If the same row identity was written more than once, keep the copy with the latest indexed_at. RESET means Probalytics cannot connect this row to a preceding published row. It does not describe whether the current row is final or prove that data is missing. The first published row for every outcome is always RESET because no earlier row exists. For a later reset, the connection to the preceding published row could not be proven. That is why the first row after a continuity break can be INTERMEDIATE + RESET, followed by VERIFIED + CONTIGUOUS in the same update sequence.

Choosing rows by use case

INTERMEDIATE does not mean provisional or expected to disappear. These rows are published only after the final snapshot in their update sequence passes validation.

What continuity does not mean

CONTIGUOUS does not mean rows arrive at regular intervals. An inactive market can remain unchanged for hours and then continue with a proven transition. RESET marks a fresh starting point, not necessarily a data gap. Every outcome contributes one expected reset when its first snapshot is published. Later resets mean only that Probalytics could not prove the transition from the previous published state; they do not tell you whether venue events were missed or how many. Causes can include processor replacement, a source sequence gap, an update that cannot be applied, or recovery from a fresh full book. To classify a reset, check whether an earlier snapshot exists for the same (market_id, outcome.id). If no earlier snapshot exists, this is the expected initialization reset. If an earlier snapshot exists, do not calculate a change between that row and the reset row. A query restricted to a date range can hide the earlier row, so it cannot classify the first reset in the result by itself.

Timestamp, path order, and identity

Several reconstructed states can share one source timestamp:
Do not deduplicate by timestamp alone. Different books at the same timestamp are valid distinct rows. The logical row identity is:
If the same identity appears more than once, keep the copy with the greatest indexed_at.

timestamp versus indexed_at

  • Use timestamp to order source events.
  • Use path_index to order reconstructed states sharing one timestamp.
  • Use indexed_at as the final tiebreaker and to see when Probalytics produced the row.
indexed_at - timestamp is observed delivery delay. It includes source-clock differences, buffering, reconstruction, and recovery—not only network time. Recovery can also publish an older source state later, so indexed_at must not replace event ordering.

Hash

hash is a Probalytics 64-bit content hash. It covers:
  • market_id;
  • outcome.id;
  • timestamp;
  • every published bid price and size;
  • every published ask price and size.
It does not include indexed_at, state, continuity, path_index, or platform metadata. The stored hash is separate from the hash supplied by Polymarket. Polymarket verification happens before the normalized row is produced; the stored hash identifies the normalized row.

Price and size precision

Published orderbook prices and sizes are stored as decimal values with six digits after the decimal point. Use decimal values rather than binary floating point when exact level comparisons or hash reproduction matter. Prediction-market prices are normally between 0 and 1. Perpetual and margin prices use venue instrument units. Join market_id to markets and inspect market_type before combining products.

Coverage by venue and product

Counts as of 2026-08-27 11:59 UTC. Coverage starts use the earliest source timestamp. Prediction and perpetual/margin rows are separated using the linked market’s market_type. Orderbook rows are produced when a book changes, not on a fixed timer. An inactive market can therefore have long intervals with no rows. The dataset updates continuously, so these values change throughout the day. Query the data warehouse for current values:

Polymarket prediction-market books

Source and reconstruction

Each outcome asset has its own published row. Multiple source connections are reconstructed independently. Equivalent states are deduplicated, and a healthy source can continue publication when its state is anchored to the last published book.

What VERIFIED means for Polymarket prediction markets

VERIFIED guarantees that the orderbook was reconstructed without gaps. For Polymarket prediction markets, the final reconstructed book must reproduce the venue-provided book hash. INTERMEDIATE rows are earlier book states from that same verified update sequence. continuity remains separate. A VERIFIED + RESET row matches the venue hash, but its connection to the preceding published row cannot be proven. Treat it as a fresh starting point.

Polymarket perpetual books

Source and reconstruction

Each published source frame contains the complete bid and ask book for one instrument. Probalytics publishes it against the instrument’s synthetic Long outcome.

What VERIFIED means for Polymarket perpetuals

Every source frame is already a complete book, so a published frame is VERIFIED without reconstructing it from level changes or comparing a book hash. The first frame for an instrument starts with continuity = RESET; later frames are CONTIGUOUS while the processor retains that instrument’s published state.

Kalshi prediction-market books

Source and reconstruction

Kalshi supplies bid books for Yes and No. Probalytics publishes one conventional two-sided book for each outcome.
The size at the opposing bid becomes the size at the derived ask. Kalshi asks are therefore derived from the opposite outcome’s bids, not supplied as independent ask orders.

What VERIFIED means for Kalshi prediction markets

VERIFIED guarantees that the orderbook was reconstructed without gaps. If Probalytics detects a source sequence gap or cannot apply a change, it stops publishing from that source stream until a fresh full snapshot rebuilds the book. continuity answers a separate question. A VERIFIED + RESET row is gap-free itself, but Probalytics cannot prove that it connects to the preceding published row. Treat it as a fresh starting point. This can happen during processor redeployments, service downtime, software updates, or recovery from a fresh full book. The Yes and No rows for one reconstructed state share the same timestamp and path_index. A market-level reset therefore normally appears as two rows - one for each outcome.

Kalshi margin books

Source and reconstruction

Kalshi margin supplies full bid/ask books and subsequent level changes for each instrument. Probalytics publishes the reconstructed book against the instrument’s synthetic Long outcome.

What VERIFIED means for Kalshi margin

Kalshi margin uses the same VERIFIED and continuity rules as Kalshi prediction-market books.

Historical rows

Some quality fields were added after the first orderbook rows were stored. Older rows can contain these compatibility values: Historical VERIFIED rows were also checked to ensure that their orderbooks were reconstructed without gaps. The hash = 0 and path_index = 0 values only indicate that those fields were not recorded when the rows were originally written. See Tables & Schemas for access-specific database types and query examples.