OverviewCore concepts
Data freshness
A price and a daily statistic on the same market can have different ages. Use the timestamp for the value you display. A successful request does not make every field current.
Read the clocks
Section titled “Read the clocks”Every market record carries asOf, the observation time rather than your request
time. A newer price observation can advance it while catalog statistics stay older.
Read Capability-honest data for provenance and capabilities.
asOfdescribes the catalog observation, or the newer price observation when applied.volume24hAsOfdescribes the volume observation. It does not advance with a price update.priceChangeAsOfis the oldest evaluation time among the market’s enriched outcomes. It is not the current quote time or the time the calculation finished.
A null timestamp means unknown. Keep it unknown in your display.
Across venues, a market with unchanged stored content keeps its catalog asOf until
content changes or the first walk meets its per-market age threshold of
4.5 to under 7.5 hours by code default (normally 6 or 8 hours on the
2-hour schedule), so an older timestamp alone does not mean a walk failed.
Field units and refresh schedules
Section titled “Field units and refresh schedules”The catalog walk is scheduled every 2 hours. The production serving snapshot refreshes every 15 minutes using incremental reloads of rows whose write time advanced. A full rebuild runs every 6 hours by code default, which operators may tune. Changes become visible after the completed refresh that includes them. Collection time and serving time therefore both matter.
Intervals marked default below are code defaults. Operators may tune them. Work takes time, so a scheduled interval is not a promise that every row updates within that interval.
| Field family | Unit and meaning | Refresh schedule |
|---|---|---|
outcomes[].price | Probability from 0 to 1; null means unavailable. Read priceBasis to distinguish a midpoint, last trade, or another source. | An enabled hot set for Polymarket and Kalshi refreshes selected markets independently of the full catalog walk, then waits 45 seconds by default. The long tail uses full venue walks, with a 30-second default wait between completed walks. These cadences apply only to venues with price-refresher lanes; walk duration adds to each interval and venue-specific settings can differ. novig and predictstreet have no price-refresher lane; any available prices update only with the catalog walk. novig publishes no catalog price. sxbet also has no price-refresher lane, but its default V3 catalog walk fetches books for open active markets within a 25-minute default budget. Each outcome gets a midpoint with priceBasis: mid only when its book has both a best bid and a best ask. A missing side leaves that outcome unpriced. A failed snapshot leaves that market unpriced. If the 25-minute default budget expires or 25 snapshot requests fail consecutively (the code default), the walk stops fetching books. Markets left without a fetched book are written with null prices; an earlier midpoint is not kept. As of 2026-10-10, booked SX Bet rows use their book request time when ingest advances asOf. This time precedes pacing and metadata waits. A walk without a book keeps the previous stamp, including at due freshness touches. A newly inserted, never-booked row uses its first walk’s start. An in-age fill can price a null outcome even at or before that stamp. A stored non-null price requires a newer fill. When the overlay supplies a price, the served asOf becomes the fill time. A booked market whose stored content did not change keeps its earlier catalog asOf until the first walk reaches its per-market age threshold. By code default, that threshold is 4.5 to under 7.5 hours, normally reached after 6 or 8 hours on the 2-hour schedule. The due booked walk uses that market’s book request time, so fills after the book request remain eligible. Eligible fills can show for up to 30 minutes by code default, while the venue marker below stays fresh. Between walks, a live-fill overlay supplies last-trade prices and the other outcome’s complement for recently traded SX Bet markets with provenance.source: predictefy-live. An overlay is served only while its row is at most 30 minutes old by code default. A venue’s overlay is also ignored when its last completed refresh is older than 5 minutes by code default. Recorded production settings use 10 minutes for this limit. For SX Bet, this clock instead tracks the newest accepted fill time. Kalshi long-tail records mostly show the catalog-walk price. |
volume24h | Rolling 24-hour volume in venue units. Polymarket uses USD; Kalshi and Gemini use contracts; Hyperliquid uses USDC. Read volume24hUnit before comparing. | Venue-published values follow the catalog walk. Enabled derived-volume jobs wait 5 minutes by default between passes, using collected history. For limitless, pred, sxbet, rain, and novig, derived values do not advance the row’s write time. Database-served reads see committed updates immediately. Snapshot-served records wait for the next ingest walk that advances the row’s write time, then a refresh, or the next full rebuild. Read volume24hAsOf and volume24hSource. |
outcomes[].priceChange* | Absolute probability changes over 1m, 5m, 15m, 1h, 6h, 24h, 7d, and 30d. These are not percentage returns. | Recalculation is queued after successful catalog refreshes. Cached entries become eligible after 10 minutes by default; that is not an independent timer. Read priceChangeAsOf. |
liquidity | The venue’s statistic in its native unit, not standardized executable depth. Kalshi supplies USD. null means unavailable; zero is a reported zero. | Catalog walk, then serving snapshot. Price updates do not refresh it. |
status, resolutionDate | Market state and the stored close date as a timestamp. A missing close date stays null. | Catalog walk, then serving snapshot. Resolution checks separately recover venue-reported outcomes for markets that disappear from active listings. They do not guarantee immediate settlement updates. |
Matched pairs, matchQuality | Stored relationships and recorded resolution judgments, not live verification. Use the pair’s asOf and matchQuality.judgedAt. | The matcher is scheduled hourly. Passes can take hours, so the schedule does not promise hourly results. A pair can remain not_judged or unavailable. |
| Sports odds | Returned probability, American, and decimal representations. | Use each cell’s asOf, stale, and meta.freshness. The sports freshness tiers define the thresholds. |
For dollar comparisons, use volume24hUsd. It accepts USD and USDC values, counting
USDC at par. Contract counts and unsupported, unknown, or conflicting units return
null; the native volume24h remains unchanged.
By default, price changes use a fresh overlay value as the current input for each
outcome the entry holds; otherwise they use the stored catalog price.
The same freshness rule applies as for the served record: the entry must be newer
than any known catalog observation and pass the venue marker and row age limits.
A matching number replaces the catalog price. A matching null makes the outcome
unpriced, so it is skipped unless enabled tape enrichment supplies the current input.
Unmatched outcomes keep the catalog price. SX Bet keeps the catalog input because
the calculation ignores the stream’s last-trade overlay. novig and predictstreet
have no overlay lane, so they use any available catalog price.
The reference is the newest eligible tick or candle at or before the evaluation
instant minus the requested window. The value is the current input minus the reference.
An overlay row can be up to 30 minutes old by default when selected.
Cached figures refresh no more often than every 10 minutes by default.
Even with overlays, the reference can still be newer than the current input for
1m, 5m, and 15m. Then the sign can oppose recent movement, so those values are
unreliable measures of recent movement whenever the current input is older than the window.
With catalog inputs, this risk remains whenever the catalog walk is older than the requested window.
The returned asOf dates the applied overlay price, otherwise the catalog observation.
It dates the calculation’s current input when both use the same observation;
a later served overlay can advance it independently.
If the overlay the figures used stops being served before they are recalculated, while the
served catalog observation is older than that overlay, the record can return to an older
catalog price and asOf while the figures keep that overlay input. In that case asOf
can also be older than the calculation’s current input. The refresher atomically keeps
a stored entry when a candidate has an equal or earlier stamp, so a full price walk
cannot replace a newer hot-lane entry.
priceChangeAsOf still dates the evaluation, not both price observations.
When no catalog price exists, enabled tape enrichment can supply the current input.
Price-change windows need reference history. A null change can mean missing
history or, for Kalshi, a pricing-method change inside the window. It can also mean
Predictefy cannot confirm that no such change occurred. It never means zero.
These windows enrich open, active snapshot records; database-served records omit
them and return priceChangeAsOf: null.
Kalshi prices
Section titled “Kalshi prices”The order-book pricing method is enabled in production. With a valid YES bid and
ask and positive size on both sides, YES uses their midpoint unless the last trade
lies within that spread. In that case, YES uses the last trade. NO is the complement
of YES. Without a valid two-sided book, the previous pricing method remains the fallback.
Read each outcome’s priceBasis; a displayed price is not a fill guarantee.
The priceBasis vocabulary includes the four Kalshi order-book rules: book-mid
(both sides quote, so their midpoint), book-last-inside (the last trade sits
within the two-sided book), book-one-sided (one side quotes, so that side’s
quote) and venue-price-chain (no book side quotes, so the venue’s own price
fields apply; the API reference lists the exact field order).
Open interest
Section titled “Open interest”Catalog market responses currently omit the optional openInterest field. Collection
does not imply that this field is returned by fetchMarkets or fetchMarket.
Collected units differ: Kalshi, Pascal, and Hyperliquid use contracts; PredictStreet uses shares; Polymarket and Limitless use USDC. Availability still depends on the market.
Venue-provided open interest follows ingest. The enabled Polymarket sampler has
separate schedules: 60 seconds by default for live up/down-market history and
2 hours by default for catalog sampling. The live sampler writes history only.
Sampled Polymarket open interest uses usdc.
Arbitrage observations
Section titled “Arbitrage observations”fetchArbitrage has separate clocks for book observations, assessment, and publication:
legs.buyYes.asOfandlegs.buyNo.asOfdate the exact input books used for each leg’s assessment.- Row
asOfis the earlier leg observation, or null when either book is missing. assessedAtdates the assessment. A new assessment can reuse an older book without advancing that book’s observation time.- Published
meta.asOfdates the surface publication. Computed-fallback pages omit it.
Clock-only changes wait for a snapshot, normally every 30 seconds. Material row changes can carry updated clocks sooner.
A recent response, publication, or live: true does not prove that both observations occurred within 60 seconds.
The code default for ARB_ENGINE_HUB_BOOK_MAX_AGE_MS is 60,000 ms for hub snapshots without confirmed subscription liveness.
Confirmed live subscriptions use ARB_ENGINE_LIVE_BOOK_MAX_AGE_MS, 600,000 ms (10 minutes) by default.
Production runs with 7,200,000 ms (2 hours) for the live-book ceiling, as recorded at the last production roll.
The 120,000 ms default for ARB_ENGINE_PASS_DEADLINE_MS limits a pass, not accepted book age.
An accepted hub snapshot avoids a venue read. Otherwise, the engine attempts a fallback, subject to cached failures and other read limits. The fallback’s two-second positive cache can also reuse a book. Neither path advances the stored observation time.
After the reads rollout carrying legacy-null normalization, unknown legacy REST leg timestamps are explicit nulls. They stay null until the engine replaces the row with observed evidence. Older servers and stream frames can omit them. Reject null or absent observations when enforcing a strict age limit. Never substitute a row, assessment, or publication clock for missing leg evidence. The 60-second example checks both legs separately and leaves Core’s book-age ceilings unchanged.
When a value looks stale
Section titled “When a value looks stale”Normal lag includes collection cadence, processing time, and the next serving refresh. Slow or failed work can extend it. A recent price does not prove recent volume, liquidity, or matching. Treat the returned record and metric timestamps as the evidence of age, rather than calculating a guaranteed maximum from a timer.
An older catalog asOf may reflect the rule for unchanged content in
Read the clocks.
Historical data
Section titled “Historical data”History endpoints have their own capture, backfill, and aggregation schedules. A fresh catalog record does not prove complete history. Read Historical data for candle provenance and coverage.