APIHIP-4 ArchiveResources

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.

FieldMeaning
outcomeIdHIP-4 outcome id (also the key for /v1/markets/{id}.json)
underlyingBTC, ETH, SOL, HYPE, …
periodMarket cadence, e.g. 1d
classpriceBinary (above/below target) or priceBucket (range)
expiryMsExpiry timestamp (epoch ms). Price markets always have one
targetPriceThe strike the question was asked about
settlePriceThe oracle price the market settled against
resultup (YES won) or down (NO won)
yesCoin / noCoinThe HIP-4 coin tickers, e.g. #10570 / #10571
bucketLabelRange label for bucket legs, null for binaries
totalVolumeLifetime 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.

FieldMeaning
outcomeIdHIP-4 outcome id
outcomeLabelThe outcome’s own label, e.g. No change. Distinct from questionTitle, which names the parent question
side0 / side1The two sides as listed on-chain (usually Yes / No)
winnerSide0 or 1: index of the winning side
winnerLabelThe winning side’s label, resolved for you
expiryMsScheduled 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
settledAtWhen the market resolved (epoch ms). Always present. This is the event market’s only timestamp
questionTitleThe parent question, e.g. July Fed funds decision. null on standalone markets, where outcomeLabel is the market’s own name
questionDescriptionThe full resolution rules, verbatim. null when the market resolved before we captured it, or when it never had any
categorye.g. economics, sports/football. null on the earliest markets
totalVolumeLifetime traded volume in USDC
homeTeam / awayTeam / homeScore / awayScoreFinal 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.json

changes.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.gz

openapi.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 ./client

governance.json

Aggregated validator settlement activity: how many settlement actions were observed, vote counts, and the most active validators by address.

FieldMeaning
counts.byTypeOne entry per action type (register, settle) with its count
counts.actions / finalizedTotals over all observed actions
counts.votes / validatorsTotal votes recorded, and how many distinct validators cast them
topValidatorsThe most active validators: address and number of actions voted on
recentThe 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.

FieldMeaning
typeprice or event
marketThe market’s row, exactly as in archive.json / events.json
oddsMetaSummary of the odds series: points, firstTs, lastTs, gaps, complete (see coverage)
oddsUrlPath to the series itself, or null when nothing was captured
settlementThe settlement governance action with its voters (validator, name, stakePct, firstSeen), or null
settlementApplicableWhether this market class settles by validator vote at all. false on every price market: they settle from the oracle (see coverage)
settlementCapturedfalse 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.