Data / Market

Market data

Hourly market observations for digital assets, stored as immutable rows on a single canonical asset identity. Price, capitalisation, volume, volatility and dominance in one schema, comparable across every asset in the snapshot.

1,000
assets per hourly snapshot
7,218
assets with at least one observation
24,000
observations written per day
November 2025
first retained observation

What this data is

A market observation is a snapshot of an asset's traded state at a specific hour. It is not a tick feed and it does not claim to be one: the layer records one row per asset per hour, and every consumer downstream reads that same row. That constraint is deliberate — it makes cross-asset comparison, historical joins and reproducible research possible, which a best-effort stream of unevenly spaced updates does not.

Where it comes from

Market figures are sourced from a commercial market and social data aggregator, which itself consolidates venue-level trading activity. Moonlytics does not connect to individual exchanges and does not present venue-level order book data. What reaches the layer is already aggregated; what Moonlytics adds is identity resolution, a stable schema, snapshot alignment and history.

A second, slower metadata source supplies reference figures — supply, all-time high and low, fully diluted valuation — on a daily rhythm. Those two rhythms are kept in separate series rather than blended, so a daily value is never presented as if it were an hourly one.

How it is processed

Fetchscheduled, every few minutes
ranked asset listup to 1,000 assets per call
Resolve
match provider id → canonical assetcreate asset record if unseen
Normalize
provider field → canonical fieldstring → decimalalign to top of hour
Persist
one row per asset per hourappend onlynever overwritten

Update frequency

The ingest job runs on a several-minute schedule; a persisted observation is written per asset per hour. In practice that means the newest market row is between zero and sixty minutes old, and the store grows by 24,000 rows a day.

We do not describe this as real-time, and there is no millisecond or sub-second guarantee anywhere in the system. The freshness page lists the measured cadence for every category.

Available fields

The canonical market observation:

pricedecimalAggregated price in USD at the snapshot timestamp.
marketCapdecimalCirculating market capitalisation in USD.
volume24hdecimalTrailing 24 hour traded volume in USD, aggregated across venues by the upstream provider.
volatilitydecimalProvider volatility measure for the asset at the snapshot. A relative figure, comparable between assets in the same snapshot rather than an annualised sigma.
marketDominancedecimalShare of total market capitalisation held by this asset, in percent.
altRankintegerCombined market-and-social rank position assigned by the upstream provider. Lower is stronger. Nullable.
observedAttimestampUTC timestamp of the snapshot the observation belongs to. Aligned to the top of the hour.
assetreferenceThe canonical asset this observation belongs to. See asset metadata.

The daily reference metadata series carries a wider set of descriptive figures:

current_pricenumberReference price from the metadata provider, updated daily.
market_cap / market_cap_ranknumberMarket capitalisation and its rank position.
fully_diluted_valuationnumberValuation at max supply.
total_volumenumberDaily traded volume from the metadata provider.
high_24h / low_24hnumberIntraday range over the trailing 24 hours.
price_change_24hnumberAbsolute 24 hour price change in USD.
price_change_percentage_24hnumberRelative 24 hour price change in percent.
market_cap_change_24hnumberAbsolute 24 hour market capitalisation change.
market_cap_change_percentage_24hnumberRelative 24 hour market capitalisation change.
circulating_supplynumberUnits in circulation.
total_supplynumberUnits issued.
max_supplynumberHard cap, where one exists. Nullable.
ath / ath_datenumber, dateAll-time high and the date it was set.
atl / atl_datenumber, dateAll-time low and the date it was set.

How it can be accessed

Market data currently reaches applications through the internal Moonlytics service layer. A public, self-serve Data API is in development — see the API page for what exists today and what does not.

canonical market observation
{
  "asset": { "id": 1, "symbol": "BTC", "name": "Bitcoin" },
  "observedAt": "2026-08-31T09: 00: 00Z",
  "price": 78135,
  "marketCap": 1568738541274,
  "volume24h": 13029310589,
  "volatility": 0.0142,
  "marketDominance": 54.9,
  "altRank": 3
}

Limitations

  • Snapshot granularity. One row per asset per hour. Intra-hour movement is not retained, so this data cannot reconstruct wicks, fills or intraday highs beyond the provider's own 24 hour aggregates.
  • Aggregated volume. Volume and volatility come from an upstream aggregation across venues. Per-exchange breakdown, order book depth and slippage are not available.
  • Rolling coverage. Each snapshot covers the top 1,000 assets by the provider's combined rank. An asset that leaves that set stops accruing observations until it returns, which leaves gaps in long series for assets near the boundary.
  • Nullable rank. altRank can be absent for an asset in a given snapshot. Treat it as missing, not as zero.
  • Not a price oracle. These figures are analytical inputs. They are not suitable as a settlement or liquidation price source.

Which applications use it

Market observations back the scoreboards, ranking tables and historical charts on moonboard.ai, and the market context behind the portfolio surfaces on moonlytics.ai. The scoring formulas that consume them are documented on moonboard.io.

Related