Polyrankdocs
Meta

Data freshness

One machine-readable answer to "how fresh is this number?" for every served surface.

Every surface Polyrank serves is stamped with the exact chain block (or observation time) it reflects, in one registry. You never have to memorize per-widget staleness folklore: ask the endpoint, or read the X-Data-As-Of-Block / X-Data-As-Of-Time response headers on the leaderboard, trader, and market rails.

GET /v1/meta/freshness

Anonymous — no API key needed.

curl -s https://api.polyrank.app/v1/meta/freshness | jq '.surfaces[] | {surface, status, as_of_block, age_seconds}'
{
  "surfaces": [
    {
      "surface": "pnl.realized",
      "anchor": "block",
      "label": "Realized P&L (per-wallet)",
      "status": "measured",
      "as_of_block": "75123456",
      "as_of_time": "2026-08-31T12:00:00.000Z",
      "age_seconds": 93,
      "budget_seconds": 18000
    }
  ],
  "frontier_readable": true,
  "as_of": "2026-08-31T12:01:33.000Z"
}

The four anchor classes

Not everything can be block-aligned, and pretending otherwise would be its own confusion:

  • block — truth lives on-chain (trades, P&L, positions, resolutions). as_of_block is the exact Polygon block the surface reflects.
  • time — observations that exist only at the moment of capture (CLOB midpoints, market metadata). A mid has no block; a missed observation is gone, not "behind".
  • slot — the prediction ledger's pre-registered 15-minute slots (a design property, not a staleness bug).
  • cohort — ranks and percentiles are anchored to the vintage of the inputs they ranked: input_frontier carries the block of the metric snapshot that was ranked. Recomputing a rank per block is neither possible nor meaningful.

A registered surface with no stamp yet is status: "unmeasured"absence never means fresh.

The registry

SurfaceAnchorWhat it isStamped byStaleness budget
chain.tradesblockRaw on-chain tradesexchange_trades_backfill, indexer_catchup_monitor15 min
pnl.realizedblockRealized P&L (per-wallet)pnl_trade_handler, position_ledger_batch5 h
chain.resolutionsblockOn-chain resolution completeness (attested)resolution_reconcile2 h
pnl.resolvedblockResolution re-marks in P&Lpnl_resolution_handler30 min
pnl.skillblockSkill counts (brier / resolved tallies)pnl_skill_handler5 h
pnl.baselineblockP&L baseline (wallet_token_agg + trade cursor)position_ledger_batch, wallet_token_agg_build30 h
pnl.unrealizedtimeUnrealized P&L re-mark (mids applied)pnl_mid_remark1 h
midstimeCLOB midpointsopen_position_mids, clob_market_subscriber30 min
markets.metatimeMarket metadata (gamma)gamma_sync1 h
markets.tokenmaptimeDerived token mapderived_token_map_load1 h
predictionsslotMarket prediction ledger (15-min slots)market_prediction_snapshot1 h
metrics.lifetimeblockLifetime wallet metrics (the board)metrics_grid_chain34 h
metrics.24hblockWindowed metrics (24h)windowed_metrics_batch36 h
metrics.7dblockWindowed metrics (7d)windowed_metrics_batch36 h
metrics.30dblockWindowed metrics (30d)windowed_metrics_batch36 h
metrics.90dblockWindowed metrics (90d)windowed_metrics_batch36 h
ranks.lifetimecohort (of metrics.lifetime)Percentile ranks (lifetime)percentile_rank_recompute, metrics_grid_chain16 h
ranks.24hcohort (of metrics.24h)Percentile ranks (24h)percentile_rank_recompute, windowed_metrics_batch16 h
ranks.7dcohort (of metrics.7d)Percentile ranks (7d)percentile_rank_recompute, windowed_metrics_batch16 h
ranks.30dcohort (of metrics.30d)Percentile ranks (30d)percentile_rank_recompute, windowed_metrics_batch16 h
ranks.90dcohort (of metrics.90d)Percentile ranks (90d)percentile_rank_recompute, windowed_metrics_batch16 h

Budgets tighten by measurement, never by aspiration

Each budget is the surface's measured worst-case cadence as of 2026-08-31. As the realtime stages of the block-frontier plan land, budgets tighten to match the new measured reality — the endpoint is always the source of truth for what is promised today.

On this page