APIHIP-4 ArchiveCoverage & completeness

Coverage & completeness

Every limit on this page is exposed as a structured field in the data, so your code can check it.

Coverage windows

  • Settled markets: every market resolving from May 2026 onward. coverage.firstExpiryMs in the manifest is the archive’s first expiry. A market still trading is in live.json; its record is written when it settles.
  • Odds capture began in June 2026: markets resolved before then have oddsMeta.points: 0. The series is not served; its summary is (see Odds).
  • 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 Validator votes).

When an id changes hands

An outcomeId is Hyperliquid’s, not ours, and the archive follows it.

/v1/markets/16.json returns 404, permanently. Hyperliquid listed the 11 May 2026 question (BTC above $80,657 on May 11, 06:00 UTC?) twice: at #16, where nothing was ever bought or sold, and at #20, where it traded. The archive serves #20 at /v1/markets/20.json, rendered at liquary.xyz/data/hip-4/20. #16 was removed on 22 August 2026, and #20 and #21 were added. If you cached #16, drop it.

#16 is the only id the archive has withdrawn. Withdrawals are not announced through changes.json, which tracks settlements; they are stated here.

Odds

Hyperliquid serves no historical odds; Liquary records each market’s YES mid while it is live. The series is not served through this API: markets/{id}/odds.json and trade-odds.json answer 404, and oddsUrl / tradeOddsUrl are null on every document. The curve is drawn on each market’s Data page. What the API serves is the capture’s report card, 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
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

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
mixedBoth, typically an imported history with a live tail
nullNothing was captured

Under event-5s, a flat stretch is a market that did not move, not a coarse measurement. Under sampled-5min, a move that started and ended between two samples was never observed. Points are never interpolated.

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.

A gap is not a capture failure. The curve is stored as a step function (a point equal to its predecessor is dropped), so a price that holds still for forty minutes yields two points forty minutes apart. dataQuality does not treat that as missing data.

Validator votes

Hyperliquid serves settlement votes only while an action is in flight. Liquary records them then, with each validator’s name and stake weight at vote time. Read two fields, in order:

  • settlementApplicable: whether this market settles by validator vote at all. It is false for price markets (settled from the oracle) and third-party markets (settled by the wallet that deployed them), and settlementCaptured is then false too, with nothing missing.
  • settlementCaptured: whether we hold the voter set. Only meaningful when settlementApplicable is true. false means the votes were never captured, not that nobody voted.

settlementCaptured measures the roster, not the action. A market can carry its settlement (reason, quorum flag, timestamps) and no voters: it then reports settlementCaptured: false and dataQuality.missing: ["settlement-votes"]. Read settlement.voterCount for the roster’s size and settlementUrl for the roster itself. When such a market carries quorumReached: true, the vote happened and reached quorum; what is missing is who cast it.

governance.json publishes the capture ratio as counts.settlementsCovered / settlementsTotal. settlementsTotal counts only the markets a validator vote settles, that is Hyperliquid’s own event markets; third-party and price markets are counted apart (settlementsDeployerSettled, settlementsPriceSettled). So the gap between covered and total is only Hyperliquid’s own event markets whose roster was not captured while the vote was live. A missed voter may since have been rebuilt from the L1 vote transaction, and says so with source: "chain" in settlement.json.

Volume

totalVolume is lifetime volume in USDC, single-counted, measured over each market’s whole life.

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 are minted as a pair and trade in near-identical share counts, so the dollars land on whichever side is expensive: a losing range routinely shows nearly all its volume as noVolume, people trading against it. Read the split before treating totalVolume as conviction in the outcome.

null on either field means the split was never captured, which is not zero. Once Hyperliquid has purged an outcome’s coins the split cannot be reconstructed, so those gaps stay null rather than being guessed.

Traders & flow

traders, familyTraders and the market document’s flow object are measured on the chain’s fill rows, market by market after settlement.

  • Deduplicated per trade. The chain reports 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 counts it once.
  • Two instruments before 3 September 2026. On markets settled before that date, totalVolume comes from a third-party candle index, frozen at settlement, and flow from the fill rows: they agree in aggregate, not market by market. From that date totalVolume is recomputed from the fills with the same rule, and the two agree market by 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): protocol mechanics, not matching. splitNotional and settleNotional (the payout alone) are served on every archive.json and events.json row.
  • Fees are converted, not quoted. Where the chain charges in outcome-token shares rather than dollars, fee and builderFee value each share at its own fill’s price. They include fees on merges and settlements; tradeFee and tradeBuilderFee give the buys and sells alone.
  • 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.
⚠️

Add the two, do not subtract. totalVolume - splitNotional is not the traded volume: it is a residual between two instruments, and it can be non-zero on a market that never saw a single buy or sell. Use buyNotional + sellNotional.

null on traders or familyTraders means the market has not been swept, never that nobody traded; a market that truly never traded shows 0. The flow object is served before the sweep too, with a basis that says which record it comes from and some fields null until the sweep (see Resources).

Underlying price

Price markets carry priceMeta (the summary, in the market document) and priceUrl (the series): what the underlying did while the market was live, at 5-minute resolution. It is Hyperliquid’s own price, the one the market settled against, not another venue’s. Frozen at settlement. 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. null means the event was not a sports fixture.