APIHIP-4 ArchiveCoverage & completeness

Coverage & completeness

An archive that states its limits is more useful than one that pretends to be exhaustive. Everything on this page is exposed as structured fields in the data itself: your code can check it, not just your eyes.

Coverage windows

  • Archive: markets resolving from May 2026 onward (the manifest’s coverage.firstExpiryMs is authoritative).
  • Odds history: capture began June 2026. Markets resolved before then have oddsMeta.points: 0.
  • Validator votes: event markets only, and only where the action was recorded while it was live. Price markets settle from the oracle and have no vote at all. Check settlementApplicable, then settlementCaptured (see below).

When an id changes hands

An outcomeId is Hyperliquid’s, not ours, and the archive follows it. Twice now that has meant publishing a market Hyperliquid had itself listed twice.

#16 was removed on 22 August 2026, and #20 and #21 were added. All three belong to the same day. Hyperliquid registered the 11 May question — BTC above $80,657 on May 11, 06:00 UTC? — at #16, inside the 10 May id block, where it never traded: one five-minute candle at $0 on the yes side, none at all on the no side, and 287 fills that are entirely mints, merges and the settlement. The market people actually traded is #20, in the 11 May block, where $5.17M changed hands across 289 candles a side.

⚠️

/v1/markets/16.json now returns 404, and will not come back. It was a record of a listing, not of a market: nothing was ever bought or sold on it. If you cached it, drop it — the same question, with its real figures, its 999 traders and a 118,026-point odds curve, is at /v1/markets/20.json.

This is the only id the archive has ever withdrawn. Deletions are not routine and are not announced through changes.json, which tracks settlements; they will always be stated here.

We had this backwards for months, and the way we had it backwards is worth stating: an earlier pass read #20 and #21 as duplicates of #45 and #50 and deleted them. The daily binaries run in a strict +5 sequence — #15 on 10 May, #20 on 11 May, #25 on 12 May, … #45 on 16 May — so #45 and #50 are their own days, and what looked like a duplicate was the archive’s biggest early market. It is back, rebuilt end to end: volume from the candle index, flow and traders from the fill rows, and the odds replayed from the order-book archive.

Odds

Hyperliquid does not serve historical odds at all: this series exists only because Hypersight records each market’s YES mid while it is live, and the chain purges the market afterwards. That has two honest consequences, both visible in oddsMeta:

FieldMeaning
pointsNumber of recorded points
firstTs / lastTsThe captured range (epoch ms)
gapsHow many intervals over 15 minutes hold no recorded price change — a count, not a list. Fetch the curve and apply the same rule if you want the intervals
maxGapMsThe longest of them, in ms
completetrue wherever a curve exists
captureRegimeHow finely the series was recorded: event-5s or sampled-5min
sourceWho recorded it: live, book-archive or mixed

Resolution and provenance

Two fields, because they answer two different questions: captureRegime says how finely a curve was recorded, source says who recorded it.

captureRegimeMeaning
event-5sOne point per actual price change. ~5 seconds live, finer on curves rebuilt from the order-book archive
sampled-5minOne sample every ~5 minutes regardless of activity
nullNothing was captured for this market
sourceMeaning
liveOur own capture of Hyperliquid’s mid feed
book-archiveRebuilt from a third party’s order-book archive. A genuine measurement, not ours
mixedBoth, typically an imported history with a live tail
nullNothing was captured

A flat stretch in an event-5s series is a market that genuinely did not move, not a coarse measurement: unmoved markets are still anchored at a fixed interval, and markets the chain has stopped quoting are not anchored at all. Under sampled-5min, by contrast, any move that started and ended between two samples was never observed and cannot be recovered — that curve is a faithful set of observations, not a complete record.

We never interpolate. Where a curve gained resolution, it is because a finer real record was found and replayed, never because points were invented between two samples.

⚠️

complete: true means nothing is known to be missing, not that the range covers the market’s whole life. Combine firstTs with the market’s own timestamps if you need wall-to-wall coverage.

It no longer derives from gaps. A deduplicated step function cannot show the difference between “capture was down” and “the price did not move”, so the field says what it can. Where our capture genuinely stops, we measure it directly at the socket rather than inferring it from the curve.

⚠️

A gap is not a capture failure. The stored curve is a step function: any point equal to its predecessor is dropped, which is what fits 8.72 GB of capture into 29.3 MB. So a market whose price simply holds still for forty minutes yields two points forty minutes apart. dataQuality does not treat that as missing data, and neither should you.

Where our capture genuinely stops, we measure it at the socket rather than inferring it from the curve.

Where our capture genuinely was down, those minutes are unrecoverable: the chain keeps no copy.

Validator votes

Hyperliquid’s settlement-vote feed is in-flight only: votes vanish from the node API the moment an action finalizes. Hypersight freezes them (with each validator’s name and stake weight at vote time) while the action is live.

Two fields, answering two different questions. Read them in order:

  • settlementApplicable - whether this market class settles by validator vote at all. Price markets settle from the oracle and never carry a settlement action, so this is false on every one of them, and the settlementCaptured next to it is false by construction. Nothing is missing there.
  • settlementCaptured - whether we hold the voter set. Only meaningful when settlementApplicable is true. false means the votes were never captured (capture started after the market settled, or the action finalized between two of our polls). It does not mean nobody voted.

On event markets, where the vote exists, the archive holds the voter set for 269 of 313. The other 44 finalized before anyone recorded them and left no trace anywhere; that cannot be improved retroactively. Where settlementCaptured is true, the voter set is the only surviving copy.

⚠️

settlementCaptured measures the roster, not the action. 43 of those 44 markets DO carry a settlement action — with its written reason, its quorum flag and its timestamps, all in settlement — and simply no voters. They report settlementCaptured: false and dataQuality.missing: ["settlement-votes"], exactly like the one market that carries no action at all, because the question both fields answer is “do we have the roster”.

So settlement can be non-null while settlementCaptured is false. Read settlement.voterCount for the roster’s size in one number, and settlementUrl for the roster itself.

All 43 carry quorumReached: true: the votes happened and reached quorum. What is missing is who cast them.

Volume

totalVolume is lifetime traded volume in USDC, single-counted, measured over each market’s whole life rather than accumulated live, so it is exact rather than drift-prone.

0 means no trading was recorded, and on multi-outcome markets that is usually the literal truth: the fallback leg (labelled Other) only pays if the oracle fails, so nobody buys it, and extreme price buckets often close without a single trade. Those markets are complete, not missing.

Which side the money took

totalVolume is the YES and NO legs summed, and that sum hides the direction. Both legs of an outcome are minted as a pair and trade in near-identical share counts, so the dollars land entirely on whichever side is expensive.

⚠️

A losing range routinely shows tens of thousands of dollars of which nearly all is noVolume — people trading against it. Read the split before treating totalVolume as conviction in the outcome.

Measured on one BTC range family (13 August 2026):

LegtotalVolumeyesVolumenoVolume
< $62,539$11,029$92$10,936
$62,539 – $65,092 (won)$76$46$30
> $65,092$8,949$72$8,876

The two rows dwarfing the winner were two ways of betting the same thing it was: that the price would stay inside the range.

null on either field means the split was never captured, which is not zero. Hyperliquid purges an outcome’s coins days after it closes, so the split cannot be reconstructed after the fact by anyone who was not already storing it. Everything settled before 16 August 2026 was recovered from the index while its coins were still readable; older gaps stay null rather than being guessed.

Traders & flow

traders, familyTraders and the market document’s flow object come from a different instrument than the volumes above: the on-chain index’s own fill rows, swept market by market after settlement and archived raw. Three properties worth knowing before building on them:

  • Deduplicated per trade. The index serves one row per participant — a trade between two wallets is two rows sharing a trade id — so naive sums count each trade up to twice. flow is deduplicated: buyNotional + sellNotional + splitNotional reconciles with totalVolume on 94.7% of markets (1,010 of 1,067, within 1%).

    ⚠️

    The last 5.3% do not, and the reason is worth knowing. totalVolume is frozen from the candle index at settlement; flow is measured on the fill rows. They are two instruments, and their agreement is guaranteed in aggregate, not market by market: across the whole archive both land on $289.97M of trading to the cent, while 57 individual markets differ — 17 where the fills see more (up to +34%) and 40 where they see less. Use flow when you want what was measured on trades, totalVolume when you want the figure the chain’s own candles carry, and do not expect the subtraction of one from the other to mean anything on a single market.

  • Order-book volume is buyNotional + sellNotional, and nothing else. splitNotional holds everything that is not a taker buy or sell — settlement, merges, negations, minting — so it is protocol mechanics, not matching. Measured across all 1,012 markets, settlement alone is 43.5% of it and minting only 10.2%. Subtract it whenever you need a figure comparable to a venue that counts matched trades. It is not a rounding difference: across the archive, $208.3M of $498.2M never changed hands. Both splitNotional and settleNotional are also served on every archive.json and events.json row, so the correction does not require fetching each market.

    ⚠️

    Add the two, do not subtract. totalVolume - splitNotional looks like the same answer and is not: the two come from different instruments (a frozen candle total against a fills-measured lump), so their difference is a residual. On the fallback rung of a price ladder — a market nobody has ever traded — that subtraction returns up to $235 while the archived fills hold 706 negate-outcome, 138 merge-question and 7 settlement rows, and not one buy or sell. Across the archive the subtraction totals $290,001,776 against a measured $289,971,691. buyNotional + sellNotional is served on every row for exactly this reason.

  • Fees are converted, not quoted. The chain charges fees in outcome-token shares, not dollars; fee and builderFee value each share at its own fill’s price. Buying is free on outcome markets, so fees are sell-side by construction.

  • Unions, not sums. familyTraders is the set union of wallets across every leg of a question or ladder. Summing each leg’s traders double-counts wallets that traded several legs — measured on one bucket family, legs summing to 23 were 18 distinct wallets.

null on any of these means the market has not been swept, never that nobody traded. A market that truly never traded shows 0 — and on fallback legs (Other), 0 is usually the literal truth.

Underlying price

Price markets carry priceMeta and priceUrl: what the underlying actually did over the window the market was live, at 5-minute resolution. The summary sits in the market document, the series in its own file — see Resources.

It is Hyperliquid’s own price — the one the market settled against — not another venue’s, so a market that resolved $35 from its threshold can be read against the line that decided it rather than against a Binance chart that disagrees by a few dollars.

Frozen at settlement and never recomputed: a settled market’s window cannot change, so the series is written once and reused. null on event markets, which have no ticker, and on the earliest price markets whose window predates this capture.

Scores

Final scores on sports events are snapshotted at settlement from public scoreboard data and survive independently of the chain. null means the event was not a sports fixture.