Skip to main content
Vatic tells you what the price was and how a market resolved (target, TWAP close, direction). It doesn’t store the order book itself. PendulumFlow is a free, open, no-auth archive of Polymarket’s full historical order book (bids, asks, trades) going back to February 2026. Put the two together and you can replay any closed 5-minute (or 15-minute, 1-hour, 4-hour) crypto up/down market: the real BTC/ETH/SOL price line next to the real order book, second by second, ending on the actual resolution.

See it in action

A real closed BTC 5-minute market, replayed live in the terminal at 2x speed — Chainlink price truth from Vatic on top, the real order book (5 levels each side) from PendulumFlow below.

Three ways to get this data

Pick based on what you’re actually building:
  1. Just want the combined JSON, no code to run? Use our hosted endpoint: GET /api/v1/replay/:slug. It does the exact same fetch server-side (Vatic price/TWAP truth + PendulumFlow order book) and hands you the result. It’s a polling endpoint — fetch time varies too much by market to block on — so a first request returns status: "pending" and you poll the same URL again after retryAfterSeconds until you get status: "ready".
  2. Want the live terminal animation (order book + price line playing out at 2x speed, like the video above)? Run the reference implementation below yourself — it talks to PendulumFlow’s raw Parquet archive directly plus Vatic’s endpoints, and renders the terminal UI. There’s no hosted version of the animation itself, only the underlying data (/api/v1/replay/:slug above).
  3. Only need Vatic’s side (price-to-beat / TWAP resolution, no order book at all)? Skip PendulumFlow entirely and call Vatic’s own primitives directly: /api/v1/targets/timestamp for the opening target, /api/v1/twap/resolve for target + snapshot + TWAP close in one call, or /api/v1/twap/report to sample a continuous price series across a window (see Chainlink TWAP for which window to use).
If you’re pointing a coding agent at this page: give it the agent prompt below when you want it to build the animation from scratch (PendulumFlow + raw Parquet), or just tell it to call /api/v1/replay/:slug directly when you only need the data.

Give this to your coding agent

The block below is a complete, self-contained spec — paste it into Claude Code, Cursor, or any coding agent and it has everything needed to build a working replay tool without rediscovering the gotchas (byte encodings, ordering conventions, a TWAP window edge case, and an HTTP client that hangs on this archive).

What you get

  • Price truth: Vatic’s target price + Chainlink TWAP close, exactly what the market resolved on.
  • Market microstructure: PendulumFlow’s real order book — best bid/ask over time, full depth snapshots, actual trade prints.
  • No API keys, no cost. Both sources are free and public.
PendulumFlow is run by an independent maintainer on donations, with no account, key, or rate limit. If you build something with it, credit it and consider supporting it.

A worked example

btc-updown-5m-1790244900 (Sep 24, 2026, resolved Up):
  • Target (open): $83,204.32
  • TWAP close (resolution): $83,289.67
  • The order book’s implied “Up” probability lagged the real Chainlink price for the first ~10 seconds of the window — the price was already $52 above target while the “Up” share was still asking $0.66 — then converged to $1.00 by resolution, with the ask side fully depleted well before the window closed.
That lag between price-truth and order-book-implied-probability is exactly the kind of thing this combination makes visible.

Reference implementation

If you’d rather start from working code than a spec, expand the accordion below for the actual script used to produce the recording above — battle-tested against the gotchas listed in the agent prompt (the fsspec hang, the byte-encoding traps, the TWAP window edge case). Three dependencies: requests, pandas, pyarrow. Copy it out with the button in the top-right of the code block, save it as replay.py, and run:
The --video flag in this script is a placeholder for a separate matplotlib/ffmpeg renderer that isn’t included here — the terminal output above is the fully working path.