Resources
All endpoints are GET, unauthenticated, under https://api.hypersight.xyz/v1.
Every response includes generatedAt (epoch ms). See
Freshness.
manifest.json
The archive’s table of contents. Also served at the API root (/).
{
"generatedAt": 1786579978700,
"freshness": "regenerated on market settlement (~1 min) and nightly; not continuous",
"coverage": { "firstExpiryMs": 1777788000000, "lastExpiryMs": 1786514400000 },
"counts": { "settledMarkets": 672, "settledEvents": 313, "marketFiles": 985 },
"resources": ["/v1/archive.json", "/v1/events.json", "/v1/governance.json", "/v1/markets/{outcomeId}.json"]
}archive.json
Every settled price market (crypto binaries and buckets), newest first.
| Field | Meaning |
|---|---|
outcomeId | HIP-4 outcome id (also the key for /v1/markets/{id}.json) |
underlying | BTC, ETH, SOL, HYPE, … |
period | Market cadence, e.g. 1d |
class | priceBinary (above/below target) or priceBucket (range) |
expiryMs | Expiry timestamp (epoch ms). Price markets always have one |
targetPrice | The strike the question was asked about |
settlePrice | The oracle price the market settled against |
result | up (YES won) or down (NO won) |
yesCoin / noCoin | The HIP-4 coin tickers, e.g. #10570 / #10571 |
bucketLabel | Range label for bucket legs, null for binaries |
totalVolume | Lifetime traded volume in USDC (see completeness) |
events.json
Every resolved event market (macro decisions, sports fixtures, one-off questions), with the winning side and, for matches, the final score.
| Field | Meaning |
|---|---|
outcomeId | HIP-4 outcome id |
outcomeLabel | The outcome’s own label, e.g. No change. Distinct from questionTitle, which names the parent question |
side0 / side1 | The two sides as listed on-chain (usually Yes / No) |
winnerSide | 0 or 1: index of the winning side |
winnerLabel | The winning side’s label, resolved for you |
expiryMs | Scheduled expiry (epoch ms). null on every event row today: HL publishes no scheduled expiry for these markets. An outright such as 2026 World Cup Champion resolves when the tournament does, and a fixture resolves when it is played, neither on a date fixed in advance. Date and sort on settledAt |
settledAt | When the market resolved (epoch ms). Always present. This is the event market’s only timestamp |
questionTitle | The parent question, e.g. July Fed funds decision. null on standalone markets, where outcomeLabel is the market’s own name |
questionDescription | The full resolution rules, verbatim. null when the market resolved before we captured it, or when it never had any |
category | e.g. economics, sports/football. null on the earliest markets |
totalVolume | Lifetime traded volume in USDC |
homeTeam / awayTeam / homeScore / awayScore | Final score for sports fixtures, null otherwise |
Every field above is always present on every event row. Optional ones carry
null rather than disappearing, so the shape does not change from row to row.
archive/{YYYY-MM}.json and events/{YYYY-MM}.json
The same rows, sliced by the month a market resolved in. The whole-archive
documents stay the simplest way in, but they grow with the archive; these let
you fetch a slice, or backfill history once and never read it again. The
manifest’s shards array lists every month that exists, with its counts.
Both files exist for every month the manifest lists, with count: 0 and
an empty array when that month had none of that kind. So the obvious loop over
shards never hits a 404.
curl https://api.hypersight.xyz/v1/archive/2026-07.jsonchanges.json
The most recent resolutions, newest first: outcomeId, type, settledAt
and the market’s URL. Poll this instead of re-reading the aggregates.
It is deliberately bounded (500 entries). If your last sync is older than
oldestSettledAt, the feed cannot tell you what you missed, and it says so in
its own note field: re-read archive.json and events.json instead of
assuming the gap is empty.
bulk/manifest.json
Gzipped JSON Lines covering the whole archive, one market per line, in the
same shape this API serves everywhere else. Regenerated nightly. Ingest it
once, then follow changes.json.
The odds series come in their own chunked files because they are large; the manifest lists every part.
curl -s https://api.hypersight.xyz/v1/bulk/manifest.json | jq '.files[].url'
curl -O https://api.hypersight.xyz/v1/bulk/markets.000.jsonl.gzopenapi.json
An OpenAPI 3.1 description of this surface, generated with the live counts
and coverage window. Every response is described field by field, and the two
row shapes are named schemas (PriceMarket, EventMarket), so a generated
client comes out typed rather than as a bag of any.
npx @openapitools/openapi-generator-cli generate \
-i https://api.hypersight.xyz/v1/openapi.json -g typescript-fetch -o ./clientgovernance.json
Aggregated validator settlement activity: how many settlement actions were observed, vote counts, and the most active validators by address.
| Field | Meaning |
|---|---|
counts.byType | One entry per action type (register, settle) with its count |
counts.actions / finalized | Totals over all observed actions |
counts.votes / validators | Total votes recorded, and how many distinct validators cast them |
topValidators | The most active validators: address and number of actions voted on |
recent | The 30 latest actions: id, type, title, reason, quorumReached, finalized (0/1), lastSeen |
This file also carries n, quorum_reached and last_seen as deprecated
aliases of count, quorumReached and lastSeen. They are the raw column
names, kept only because v1 promises nothing disappears. Read the camelCase
ones; a future major version drops the others.
markets/{id}.json
One market in full: the page most builders want.
| Field | Meaning |
|---|---|
type | price or event |
market | The market’s row, exactly as in archive.json / events.json |
oddsMeta | Summary of the odds series: points, firstTs, lastTs, gaps, complete (see coverage) |
oddsUrl | Path to the series itself, or null when nothing was captured |
settlement | The settlement governance action with its voters (validator, name, stakePct, firstSeen), or null |
settlementApplicable | Whether this market class settles by validator vote at all. false on every price market: they settle from the oracle (see coverage) |
settlementCaptured | false means the votes were never captured, not that nobody voted. Only meaningful when settlementApplicable is true |
curl https://api.hypersight.xyz/v1/markets/813.json{
"generatedAt": 1786581085942,
"type": "event",
"market": {
"outcomeId": 813,
"questionTitle": "World Cup Semifinal: France vs Spain",
"outcomeLabel": "Spain",
"winnerLabel": "Yes",
"homeTeam": "France", "homeScore": 0, "awayTeam": "Spain", "awayScore": 2,
"totalVolume": 8121997
},
"oddsMeta": { "points": 3518, "firstTs": 1784707200000, "lastTs": 1785758400000, "gaps": [], "complete": true },
"oddsUrl": "/v1/markets/813/odds.json",
"settlement": { "quorumReached": true, "voters": ["…"] },
"settlementApplicable": true,
"settlementCaptured": true
}markets/{id}/odds.json
The odds series on its own, because a long-running market carries tens of
thousands of points (~1 MB uncompressed) that most consumers do not need.
Fetch it only when oddsMeta.points > 0.
{
"generatedAt": 1786581085942,
"outcomeId": 813,
"points": 3518,
"odds": [ { "ts": 1784707200000, "px": 0.42 }, "…" ]
}Each point is the YES side’s mid price on the 0 to 1 probability scale, sampled roughly every 5 minutes while the market was tracked.
Anything outside /v1 on this hostname returns a JSON 404.