Skip to content

Freshness and cadence

Every value of a snapshot layer says how long it is good for. Past that, it is not returned as a value.

field what it says
received_at when the platform received it
venue_ts the venue’s own timestamp, when it sends one
age_ms how old it is: the instant asked about minus its anchor — venue_ts where the horizon counts from the venue’s clock, received_at otherwise
venue_age_ms how old it is by the venue’s clock, whatever the anchor: the instant minus venue_ts; null without one
valid_until the instant after which it is no longer treated as current
horizon_source where valid_until comes from (below)
anchor which clock the horizon counts from: venue (its own timestamp) or receipt (ours)

There is one definition of age, and age_ms, age(F) in DQL, a query’s freshness bound and every page of the site use it: a value is as old as the venue’s own timestamp says wherever the venue dates the value, and as old as our receipt only where it does not. Where the venue’s timestamp dates the publication of the value (or, for a settled rate, its settlement), the horizon and the age count from it (anchor: "venue"): a quote whose timestamp stops advancing grows old and goes stale however often we poll it — COINBASE-INTX’s quotes stood on one timestamp from 2026-10-01 09:00:29 UTC for a week while we read them every two seconds. Where the venue sends no time, or its time dates something else, both count from our receipt (anchor: "receipt") and venue_ts stays what the venue said, with its own age: Aster’s open interest carries the instant the venue last changed the figure, so for a quiet symbol venue_age_ms is how long the figure has stood still, tens of minutes, while age_ms is how long ago the platform read it. The pairs that count from our receipt are listed below.

horizon_source meaning
venue_declared the venue said when the next value comes: a settled funding rate and the interval it publishes with it
measured a cadence the platform measured
documented the venue’s documentation
assumed a cadence the platform assumes. It is written down below, with what it rests on
connection the venue pushes only when the value changes: the value holds while the connection that delivered it is alive, up to its pair’s no-update threshold (valid_until)
null no fact covers the value: it is stale, horizon_unknown
  • Polled or streamed: twice the longer of its interval and the history window it is kept at (a second to a minute by the listing’s group and the layer, the table below; funding never less than ten seconds). A stored reading is the last of its window, so a horizon shorter than two windows would make every stored reading of a fast feed stale the moment it is kept.
  • Settled (a funding rate the venue has fixed): until the next settlement is due — the listing’s own funding interval (1 h, 4 h, 8 h, from the registry, and only from it: a listing without one has no horizon, horizon_unknown) after the settlement the rate belongs to — and five minutes more, twice the longest a settlement was measured to take to reach us. Its age is the settlement’s: forty minutes into an hourly period a current rate is forty minutes old, so ask status(funding) = present, not age(funding) < 2m.
  • Pushed only on change: while the connection lives, and no longer than its pair’s no-update threshold after its anchor (the table below). A quiet socket means “nothing changed”, for a while: past the threshold — longer than any listing of the pair was measured to stay quiet while alive — a value whose timestamp has not moved is stale, no_update, though its connection lives. The value stops being current the moment the platform records a disconnection of that venue, a collector going down or restarting, a bus outage, or its own projection lagging, and for the last only while the lag lasts: once State has caught up, a value that did not change is as current as it was, unless a disconnection, a collector going down or a bus outage was recorded inside the lag’s window. A socket on which nothing at all arrives — no data, no reply, no heartbeat — for longer than its venue guarantees it speaks is a disconnection too: the collector drops it and reconnects, and every value on it is connection_lost. The platform never sends a fake heartbeat to keep such a value fresh. A disconnection is recorded for the venue as a whole, not for one socket, so any reconnect ends every such value of that venue until the next value arrives (on Kraken, about 0.07 % of the time, never more than about two seconds at once, measured 2026-09-29).
  • A value no fact covers is stale. No proof, no value.

At valid_until itself the value is still current. A query’s own freshness bound can only make a value stale sooner; it never extends a horizon.

Past valid_until the layer’s status is stale and the value is not in the value field: values is empty (value is null on a DQL value object), and the reading is still dated — received_at, age_ms and valid_until say what it was and when it stopped being current. The value itself is written under a separate key, withheld, only when the request sets allow_stale: true (allow_stale=true on GET /v2/stream). The default is false. withheld is for post-mortems; do not feed it into a live decision.

reason why the value is stale
horizon_passed no new value within its horizon
connection_lost the connection that delivered it was recorded lost — a disconnection, or a socket on which nothing at all arrived for longer than its venue guarantees it speaks
no_update it is pushed only on change, its connection lives, and its timestamp has not moved for longer than its pair’s no-update threshold (the table below)
state_lag our live projection fell behind; the venue and the connection were fine
source_error the venue refused our requests for this layer (an error status, not a rate limit) since the value arrived, so nothing newer could come
horizon_unknown no fact covers it, or the connection’s liveness could not be read
freshness_bound older (age_ms) than the bound the query set itself
halted the venue said, at the instant asked about, that it does not trade the listing: its figures are its last, not a market, in every layer (it outranks every other reason)

The five states stay distinct everywhere — the live answer, history, DQL: present, stale, missing, not_published, off. None of them becomes another, or a zero, or the previous value.

In DQL a stale value compares as unknown, and/or/not treat it as unknown, any and all give unknown, count does not count it, and status(F) = stale is true and never unknown.

A sampled series (last at 1m) over a value pushed only on change carries the value into the periods in which it did not change, as long as its connection lived — and says so: carried: true on the history row and on the series value, and carried(S, n) in DQL, the number of the last n periods whose value was carried rather than observed. carried(last, 1) = 0 is true only when the newest period was observed. Candles are never carried.

A replay with as_of = served_at reads the facts and the connection breaks as they were recorded by that instant, so a value withheld in an answer is withheld in its replay, with the same reason and valid_until. A fact corrected later changes what is read from then on, never the past.

Every tick of every layer is in the live answer, whatever follows. History keeps the last value of each window of a fixed length, and the length depends on the listing’s group:

  • core — the five main instruments of every venue (what the owner calls the majors);
  • top-100 — the hundred busiest listings of the rest by 24 h turnover, chosen once a day. A listing enters when it is busier than the weakest member by a margin and leaves when it is not, so one on the border does not change places every morning; a listing that moves keeps what was already stored, under the window it was stored at;
  • tail — everything else the platform collects.

Every stored row says the window it was sampled at (cadence on the row), so a series’ spacing is data, never inferred. A window in which a layer was not observed has no row: the absence is what a query reads as stale.

layer core top-100 tail
ticker, book prices 10s, kept 6 months 1s, kept 1 week 15s, kept 1 month
mark 10s, kept 6 months 1s, kept 1 week 1m, kept 1 month
funding 1m, kept 2 years 15s, kept 1 month 1m, kept 1 month
oi 10s, kept 6 months 15s, kept 1 month 1m, kept 1 month
stats 10s, kept 6 months 15s, kept 1 month 1m, kept 1 month
book bands 10s, kept 6 months 15s, kept 1 month not collected
venue_depth 10s, kept 6 months 15s, kept 1 month 1m, kept 1 month
trade every event, kept 1 week every event, kept 7 days not collected
candles every event, kept 1 year every event, kept 1 month every event, kept 1 month
liquidation every event, kept 2 years every event, kept 2 years every event, kept 2 years
live answer (md.state, /v2/stream, “now”) every tick every tick the last tick of each second, as it was received
raw order book raw book kept 4 hours raw book kept 1 hour none

A layer that is not collected for a group is off in its answers (policy: "off"): the tail’s book bands are not collected at all. The tail’s trades and raw book are collected only where a venue’s ticker is made of them: BINANCE-USDM, ASTER-PERP, BINANCE-SPOT, HYPERLIQUID publish no ticker until they have seen a trade, so the tail keeps the trade stream there (and stores none of it); EDGEX-PERP, DYDX-PERP, NADO-PERP, SYNTHETIX-PERP, WEEX-FUTURES make the ticker of the book, so the tail keeps its raw book for an hour. On every other venue the ticker comes whole on its own channel and the tail has neither. The same is said per listing and layer by history_cadence on GET /v2/instruments.

Retention, and what a question beyond it is told

Section titled “Retention, and what a question beyond it is told”

What is kept is the kept of the table, per group and layer: the core six months (funding two years, candles a year, liquidations two years), the top-100 a week of its second-level ticker and mark, a month of the rest and seven days of its trades, the tail a month. The trades of the top-100 are stored in partitions of a day and dropped seven days after the day’s end, so a trade is on disk seven to eight days (the weekly classes keep a row seven to fourteen). The length is a class of the policy, not of the code. A layer’s retention_from on GET /v2/instruments says since when it is kept for that listing. A question that reaches back past it — an as_of, a window, a history row — is not answered with silence and is not answered as a quiet market: the layer is missing with the reason not_retained. A layer kept for longer, asked at the same instant, is only empty (no_value) where nothing was recorded. A listing that moves between groups keeps what it was already stored, each row for as long as the class it was written under.

117 pairs today, 46 of them on an assumed cadence and 35 living on their connection. GET /v2/instruments states the same fact per layer (horizon), as known at the instant asked about.

venue dataset (layer) mode interval label venue time dates what it rests on
ASTER-PERP depth-derived (book bands) stream 10 s assumed publication the same feed as Binance (depth20@100ms), not cited for Aster; rows 10/10 s; git ba64921
ASTER-PERP funding (funding) stream 3 s measured publication the same markPrice frame (r and T), every 3 s, live 2026-09-30, dated by E; was REST every 15 s; git 3703db0
ASTER-PERP mark (mark) stream 3 s measured publication WS {symbol}@markPrice: a frame every 3 s, live 2026-09-30 (aster-perp.md, Датасеты), dated by E; was REST every 15 s; git 3703db0
ASTER-PERP open-interest (oi) poll 300 s measured none REST openInterest every 300 s, through a CloudFront cache (Age header 1-4 s); the response’s time is when the figure last moved, not when the venue published it: DOTUSDT 12-28 minutes old with the same value in all 44 reads, TRXUSDT 17-32 minutes, BTCUSDT 12-33 s behind each change (live 2026-10-01 11:44-11:59Z, five symbols every 20 s); counted from it a figure read seconds ago stood stale (8 symbols in 14 minutes, at ages of 24-296 s), so the horizon counts from our receipt and venue_age_ms still says how old the figure is; 0048 read the lag as the cache’s; git ba64921
ASTER-PERP stats (stats) on change — measured publication WS {symbol}@ticker and !ticker@arr: a frame only after a trade in the symbol (the venue’s trade counter n rose in 3 524 of 3 555 consecutive frames) and no heartbeat; live 2026-10-01 11:24-11:49Z, 26 symbols: BTCUSDT every 4.2 s on average (longest silence 28 s), ASTERUSDT 2.0 s (50 s), the quiet tail minutes apart (DOTUSDT first frame after 447 s, LTCUSDT after 491 s, TRXUSDT two frames in 25 minutes); dated by E; 0060 stated a frame every 1000 ms (the stream of Binance’s protocol, no rate cited for Aster), which no symbol sends; git 3703db0; no_update after 6 h: the longest spell without a new value, no break of the connection and no restart in it, 7 681 s (TRXUSDT, the least traded of 26 at USD 61 thousand a day, 2026-10-03 02:38-04:46Z; 59 spells over 30 minutes of TRXUSDT alone, and every spell that long is of a listing under USD 1.5 million a day; BTCUSDT and ETHUSDT none over 65 s), 2026-10-01 to 10-08; twice it is 4.3 h
ASTER-PERP ticker (ticker, book prices) on change — measured publication aster-perp.md:78: frames only on change, 11–54 in 8 s; git ba64921; no_update after 1 h: the longest quiet spell 1 595 s (TRXUSDT, the least traded, 2026-10-04 02:31-02:58Z; DOTUSDT, the next, 240 s), 2026-10-01 to 10-08; twice it is 53 minutes
AVANTIS-PERP funding (funding) poll 20 s assumed none REST /v2/trading every 20 s; the SDK says the snapshot is rebuilt ≈ every 30 min (venue card :34-37, :185-186); no venue time; git 52077ac
AVANTIS-PERP open-interest (oi) poll 20 s assumed none REST /v2/trading every 20 s; the SDK says the snapshot is rebuilt ≈ every 30 min (venue card :34-37, :185-186); no venue time; git 52077ac
AVANTIS-PERP venue-depth (venue_depth) poll 20 s assumed none REST /v2/trading every 20 s; the SDK says the snapshot is rebuilt ≈ every 30 min (venue card :34-37, :185-186); no venue time; git 52077ac
BINANCE-SPOT depth-derived (book bands) on change — measured none WS depth20@100ms, the partial book, pushed at most every 100 ms and not while the top twenty is unchanged; no venue time in the frame; binance-spot.md: 780 frames in 80 s on BTCUSDT, mean 100 ms, longest silence 0.38 s, 474 on ADAUSDT, 1.20 s, 537 on LINKUSDT, 1.0 s; measured on one machine, not on production; git c55d9a9; no_update after 5 min, as the ticker: the top twenty moves whenever the best level does (it is the same book), so it is never quieter than the book ticker; its bands are not kept in history at the listings’ group to measure apart
BINANCE-SPOT stats (stats) on change — measured publication WS ticker, at most once a second (docs web-socket-streams: update speed 1000 ms) and silent while a pair does not move; binance-spot.md: 78 frames in 80 s on BTCUSDT, longest silence 1.16 s, 70 on ADAUSDT, 5.0 s, 73 on LINKUSDT, 2.0 s; measured on one machine, not on production; git c55d9a9; no_update after 5 min: the longest spell without a new value 115 s (HYPEUSDC, the least traded of 12, 2026-10-07 22:54Z), no break in it, 2026-10-05 to 10-08; twice it is 230 s
BINANCE-SPOT ticker (ticker, book prices) on change — measured none WS bookTicker, real-time on every change of the best level (docs web-socket-streams: update speed real-time), with the last price of the trade stream; no venue time in the frame; binance-spot.md: 9448 frames in 80 s on BTCUSDT, longest silence 0.76 s, 1795 on ADAUSDT, 5.59 s, 1749 on LINKUSDT, 2.08 s; measured on one machine, not on production; git c55d9a9; no_update after 5 min: the longest spell 103 s, inside a bus outage (2026-10-07 12:19Z), 74 s without one (HYPEUSDC, the least traded of 12), 2026-10-05 to 10-08; twice it is 206 s
BINANCE-USDM depth-derived (book bands) stream 100 ms documented publication WS depth20@100ms: binance-usdm.md:236-237; git 1520761
BINANCE-USDM funding (funding) stream 3 s documented publication the same markPrice frame (r and T), every 3 s, documented, dated by E; was REST every 15 s; git 3703db0
BINANCE-USDM mark (mark) stream 3 s documented publication WS {symbol}@markPrice: every 3 s by default, documented (binance-usdm.md, Mark / Funding), dated by E; was REST every 15 s; git 3703db0
BINANCE-USDM open-interest (oi) poll 300 s measured publication REST openInterest every 300 s; rows 300/301.6 s; git 1520761
BINANCE-USDM stats (stats) stream 1 s documented publication WS {symbol}@ticker: every 1000 ms, documented (binance-usdm.md, Stats), dated by E; was REST every 15 s; git 3703db0
BINANCE-USDM ticker (ticker, book prices) on change — assumed publication WS bookTicker: cadence undocumented, a frame on change; git 1520761; no_update after 5 min: the longest spell without a new value 58 s over 44 listings (BCHUSDC, the least traded at USD 6 million a day, among them), 2026-10-05 to 10-08; twice it is 116 s
BITGET-PERP depth-derived (book bands) stream 100 ms measured publication WS books: a snapshot, then an update every 100 ms (bitget-perp.md, depth-raw; 223 updates of two symbols in 12 s, live 2026-09-30); was REST merge-depth every 300 s; git f24877b
BITGET-PERP funding (funding) stream 10 s assumed publication WS ticker, the adapter’s comment (:12-13); git c4b1eda
BITGET-PERP mark (mark) stream 10 s assumed publication the WS ticker frame that carries the venue’s ticker, open-interest, stats and funding (markPrice and indexPrice, dated by its ts): their fact, not measured apart from them; git 7642462
BITGET-PERP open-interest (oi) stream 10 s assumed publication WS ticker “several times a second”: only the adapter’s comment (:12-13); rows 10.0/10.1 s; git c4b1eda
BITGET-PERP stats (stats) stream 10 s assumed publication WS ticker “several times a second”: only the adapter’s comment (:12-13); rows 10.0/10.1 s; git c4b1eda
BITGET-PERP ticker (ticker, book prices) stream 10 s assumed publication WS ticker “several times a second”: only the adapter’s comment (:12-13); rows 10.0/10.1 s; git c4b1eda
BYBIT-PERP depth-derived (book bands) stream 190 ms measured publication bybit-perp.md:209-210: the book ≈5.3 frames/s; git 9136b4c
BYBIT-PERP funding (funding) stream 10 s assumed publication WS tickers: cadence undocumented (bybit-perp.md:68-73); rows 10.0/10.5 s (10 s window); git 9136b4c
BYBIT-PERP mark (mark) stream 10 s assumed publication WS tickers: cadence undocumented (bybit-perp.md:68-73); rows 10.0/10.5 s (10 s window); git 9136b4c
BYBIT-PERP open-interest (oi) stream 10 s assumed publication WS tickers: cadence undocumented (bybit-perp.md:68-73); rows 10.0/10.5 s (10 s window); git 9136b4c
BYBIT-PERP stats (stats) stream 10 s assumed publication WS tickers: cadence undocumented (bybit-perp.md:68-73); rows 10.0/10.5 s (10 s window); git 9136b4c
BYBIT-PERP ticker (ticker, book prices) stream 10 s assumed publication WS tickers: cadence undocumented (bybit-perp.md:68-73); rows 10.0/10.5 s (10 s window); git 9136b4c
BYBIT-SPOT depth-derived (book bands) stream 200 ms measured publication WS orderbook.1000 every 200 ms (docs websocket/public/orderbook: spot level 1000 push frequency 200 ms); bybit-spot.md: 380 frames in 75 s on BTCUSDT, mean 201 ms; git f83d0fc
BYBIT-SPOT stats (stats) on change — measured publication WS tickers, snapshot-only and pushed only when a field changes, at most every 50 ms (docs websocket/public/ticker); bybit-spot.md: 135 frames in 75 s on BTCUSDT, mean 0.56 s, longest silence 2.0 s; measured on one machine, not on production; git f83d0fc; no_update after 5 min: the longest spell 79 s, inside a bus outage (2026-10-06 13:20Z), none over 65 s (the history window) without one, the least traded of 10 included, 2026-10-05 to 10-08; twice it is 158 s
BYBIT-SPOT ticker (ticker, book prices) on change hb 3 s documented publication WS orderbook.1 (the best level) on every change and again after 3 s without one (docs websocket/public/orderbook; bybit-spot.md: 531 frames in 75 s, longest silence 2.99 s), dated by its ts, with the last price of tickers (longest silence 2.0 s); git f83d0fc
COINBASE-INTX funding (funding) settle the listing’s (registry) measured settlement a settled rate, good until the next settlement: source_time is the settlement, the venue publishes the interval (funding_interval, measured 1 h, coinbase-perp.md:243)
COINBASE-INTX mark (mark) poll 2 s assumed publication published by the 2 s quote loop that carries the ticker (the declared 30 s loop only repeats it); the interval is the adapter’s, not measured on production; task 128
COINBASE-INTX open-interest (oi) poll 15 s measured publication REST /instruments every 15 s; rows 15.0/15.8 s; git 5076512
COINBASE-INTX stats (stats) poll 60 s assumed publication REST bulk /instruments row (qty_24hr, notional_24hr, dated by its quote timestamp) read by the 60 s loop the adapter declares; not measured on production; git 37647d0
COINBASE-INTX ticker (ticker, book prices) poll 2 s assumed publication REST quote every 2 s, 24 listings at 12 requests a second against a budget of 20 (the one-second loop of 0048 needed 24 a second); the interval is the adapter’s, not measured on production; task 128
DERIBIT-PERP depth-derived (book bands) on change — measured publication Public book channel emits full top-10 snapshots with venue update id change_id and a timestamp. The id may jump and does not count intervening updates or link deltas. Top-10 is not full-depth.
DERIBIT-PERP funding (funding) on change — documented publication Coinbase/Deribit migration documentation: continuous accrual and 8-hour-normalized published rate; no next settlement instant.
DERIBIT-PERP mark (mark) on change — measured publication Official Coinbase Derivatives ticker publishes mark_price and index_price with venue timestamps; mark is dated by that publication.
DERIBIT-PERP open-interest (oi) on change — measured publication Official Coinbase Derivatives public ticker carries open_interest and a venue timestamp.
DERIBIT-PERP stats (stats) on change — measured publication Official Coinbase Derivatives public ticker carries trailing 24-hour stats and a venue timestamp.
DERIBIT-PERP ticker (ticker, book prices) on change — measured publication Official Coinbase Derivatives public ticker channel observed on the authenticated-free gateway; venue timestamps are published with updates. 5-minute no-update threshold is conservative and not a venue guarantee.
DYDX-PERP depth-derived (book bands) stream 250 ms documented none WS v4_orderbook batches every 250 ms: dydx-perp.md:229; git c338165
DYDX-PERP funding (funding) settle the listing’s (registry) measured settlement a settled rate, good until the next settlement: hourly settlement measured (dydx-perp.md:103), source_time is the settlement’s effectiveAt
DYDX-PERP open-interest (oi) on change — measured none WS v4_markets: the trading update comes every 30 s (49 in 25 minutes, 27.1-32.4 s, live 2026-10-01 11:24-11:49Z) but lists only the markets whose field changed: openInterest was listed for 4 of 25 assigned markets in 25 minutes, for the other 21 never after the reply; the value holds while the connection lives; no venue time in the frame; 0062 (on_change_hb, 30 s) rested on an adapter that republished the held value at each update, a forward fill under the tick’s clock, rolled back the same day (the republishing commit was f4ccb90); no_update after 24 h: a market’s figure is named only when it moves, and the quiet markets stand for hours with the connection alive: the longest spell without a new value, no break of the markets socket and no restart in it, 38 828 s (AVAX-USD, 2026-10-04 08:57-19:44Z), PEPE-USD (the least traded, USD 1 thousand a day) 35 045 s, BTC-USD 5 530 s, 2026-10-01 to 10-08; twice it is 21.6 h
DYDX-PERP stats (stats) on change — measured none the same trading update, carrying volume24H (the 24 h notional in USD): listed for 10 of 25 assigned markets in 25 minutes, for 15 never after the reply; the value holds while the connection lives; no venue time in the frame; was on_change_hb in 0062, see open interest; no_update after 36 h: the longest quiet spell 54 096 s (XLM-USD, USD 7 thousand a day, 2026-10-04 11:44Z to 10-05 02:45Z), UNI-USD 51 271 s, BTC-USD 1 834 s, 2026-10-01 to 10-08; twice it is 30.1 h
DYDX-PERP ticker (ticker, book prices) derived from depth-derived — documented none the host assembles the ticker from the book; git c338165
EDGEX-PERP depth-derived (book bands) on change — measured none docs/engineering/venues/edgex-perp.md: 30-second BTC/ETH WS capture; no publication timestamp or fixed cadence. No-update threshold assumed 5 minutes, longer than the 30-second socket watchdog; not a measured guarantee.
EDGEX-PERP funding (funding) settle the listing’s (registry) documented settlement docs/engineering/venues/edgex-perp.md: metadata fundingRateIntervalMin per listing; settled ticker rate dated by fundingTime.
EDGEX-PERP mark (mark) on change — measured none docs/engineering/venues/edgex-perp.md: 30-second BTC/ETH WS capture; no publication timestamp or fixed cadence. No-update threshold assumed 5 minutes, longer than the 30-second socket watchdog; not a measured guarantee.
EDGEX-PERP open-interest (oi) on change — measured none docs/engineering/venues/edgex-perp.md: 30-second BTC/ETH WS capture; no publication timestamp or fixed cadence. No-update threshold assumed 5 minutes, longer than the 30-second socket watchdog; not a measured guarantee.
EDGEX-PERP stats (stats) on change — measured none docs/engineering/venues/edgex-perp.md: 30-second BTC/ETH WS capture; no publication timestamp or fixed cadence. No-update threshold assumed 5 minutes, longer than the 30-second socket watchdog; not a measured guarantee.
EDGEX-PERP ticker (ticker, book prices) derived from depth-derived — documented none docs/engineering/venues/edgex-perp.md: recorded ticker updates omit quotes; existing host builds ticker from live book and tape. Verified by 30-second live gate on five symbols, including reconnect.
GATE-PERP depth-derived (book bands) stream 100 ms measured publication WS futures.order_book, 100 levels without aggregation: a full book on each change, about every 100 ms (gate-perp.md, depth-raw; live 2026-09-30), dated by t; was REST order_book every 300 s; git d20998a
GATE-PERP funding (funding) stream 13 s assumed publication WS futures.tickers ≈1/s by the adapter (:14-15), not in the venue card; rows (OI) 10/13 s; git c4b1eda
GATE-PERP mark (mark) stream 13 s assumed publication the WS futures.tickers frame that carries the venue’s funding and open-interest (mark_price and index_price, dated by its t): their fact, ≈1/s by the adapter, not in the venue card; git 8599467
GATE-PERP open-interest (oi) stream 13 s assumed publication WS futures.tickers ≈1/s by the adapter (:14-15), not in the venue card; rows (OI) 10/13 s; git c4b1eda
GATE-PERP stats (stats) stream 13 s assumed publication the WS futures.tickers frame that carries the venue’s funding, open-interest and mark (volumes, high, low, change, dated by its t): their fact, ≈1/s by the adapter, not in the venue card; git fbf7eb4
GATE-PERP ticker (ticker, book prices) on change — assumed publication WS futures.book_ticker: every change of the best level (adapter :14); git c4b1eda; no_update after 10 min: the longest spell without a new value 185 s (TRX_USDT, the least traded of 25, 2026-10-06 15:16-15:19Z), no break in it, 2026-10-05 to 10-08; twice it is 370 s
GMX-PERP funding (funding) poll 15 s documented none REST arbitrum.gmxapi.io every 15 s, venue cache 0.3–1 s: gmx-perp.md:54; no venue time; git b49e1ee
GMX-PERP mark (mark) poll 15 s assumed none markPrice of the /markets/tickers message that carries the ticker, REST every 15 s (the adapter’s SnapshotIntervalSeconds): its fact (gmx-perp.md:54), not measured apart; no venue time; git 81af140
GMX-PERP open-interest (oi) poll 15 s documented none REST arbitrum.gmxapi.io every 15 s, venue cache 0.3–1 s: gmx-perp.md:54; no venue time; git b49e1ee
GMX-PERP stats (stats) poll 15 s documented none REST arbitrum.gmxapi.io every 15 s, venue cache 0.3–1 s: gmx-perp.md:54; no venue time; git b49e1ee
GMX-PERP ticker (ticker, book prices) poll 15 s documented none REST arbitrum.gmxapi.io every 15 s, venue cache 0.3–1 s: gmx-perp.md:54; no venue time; git b49e1ee
HYPERLIQUID depth-derived (book bands) stream 6 s measured publication hyperliquid.md:97-101: the book per block, measured ≈5 s; rows 5/6 s; git 7724303
HYPERLIQUID funding (funding) poll 60 s assumed none activeAssetCtx + REST predictedFundings every 60 s; its next_funding_at is in the past (a known defect) and is not used; git 7724303
HYPERLIQUID mark (mark) on change — assumed none activeAssetCtx: cadence undocumented, looks like on change; no venue time in the frame; git 7724303; no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
HYPERLIQUID open-interest (oi) on change — assumed none activeAssetCtx: cadence undocumented, looks like on change; no venue time in the frame; git 7724303; no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
HYPERLIQUID stats (stats) on change — assumed none activeAssetCtx: cadence undocumented, looks like on change; no venue time in the frame; git 7724303; no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
HYPERLIQUID ticker (ticker, book prices) stream 2500 ms measured publication hyperliquid.md:64: bbo ≈7.9/s; production 24 h: rows 1.01/2.50 s (1 s window); git 7724303
KRAKEN-FUTURES depth-derived (book bands) stream 1 s measured publication kraken-futures.md:151: ≈847 book frames/s; the host publishes depth-derived at most once a second; rows 1.00/1.00 s; git 2dfea5a
KRAKEN-FUTURES funding (funding) on change — measured publication the same ticker frame (kraken-futures.md:149), only on change; git 6ac5963; no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES mark (mark) on change — measured publication the same ticker frame (kraken-futures.md:149), only on change; git 6ac5963; no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES open-interest (oi) on change — measured publication the same ticker frame (kraken-futures.md:149), only on change; git 6ac5963; no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES stats (stats) on change — measured publication the same ticker frame (kraken-futures.md:149); git 35c7fe7; no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES ticker (ticker, book prices) on change — measured publication kraken-futures.md:149: the ticker frame, ≈3.25/s, only on change; production 24 h to 2026-09-29: rows 1.06/2.28 s; git d7f4d61; no_update after 10 min, as the rest of the ticker frame: the longest quiet spell 111 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 434 s inside the outage of 2026-10-06 07:00-07:08Z; the least traded none over 65 s, 2026-10-05 to 10-08
LIGHTER-PERP depth-derived (book bands) on change — measured publication docs/engineering/venues/lighter-perp.md: Host-derived from snapshot/deltas: BTC 466 and ETH 436 updates in 30 seconds. No-update threshold assumed 5 minutes, longer than the 90-second watchdog; not a measured guarantee.
LIGHTER-PERP funding (funding) settle the listing’s (registry) documented settlement docs/engineering/venues/lighter-perp.md: https://docs.lighter.xyz/trading/funding: hourly settlement; funding_timestamp is its source time.
LIGHTER-PERP mark (mark) on change — measured publication docs/engineering/venues/lighter-perp.md: 30-second market_stats capture: BTC 30 and ETH 28 updates; no guaranteed fixed interval. No-update threshold assumed 5 minutes, longer than the 90-second watchdog; not a measured guarantee.
LIGHTER-PERP open-interest (oi) poll 15 s assumed none docs/engineering/venues/lighter-perp.md: REST orderBookDetails every 15 seconds, native quantity; no publication timestamp.
LIGHTER-PERP stats (stats) on change — measured publication docs/engineering/venues/lighter-perp.md: 24-hour statistics on the same captured market_stats channel. No-update threshold assumed 5 minutes, longer than the 90-second watchdog; not a measured guarantee.
LIGHTER-PERP ticker (ticker, book prices) on change — measured publication docs/engineering/venues/lighter-perp.md: 30-second WS capture: BTC 322 and ETH 492 ticker updates; no guaranteed fixed interval. No-update threshold assumed 5 minutes, longer than the 90-second watchdog; not a measured guarantee.
MEXC-PERP depth-derived (book bands) stream 250 ms measured publication WS sub.depth.full, 50 levels: a full book about every 250 ms (mexc-perp.md, live 2026-09-30); was REST every 600 s; git 5f61088
MEXC-PERP funding (funding) on change hb 60 s measured publication WS sub.funding.rate: the first frame about 20 s after the subscription, then once a minute or on change (mexc-perp.md, live 2026-09-30), dated by the frame’s ts; was REST every 60 s; git 5f61088
MEXC-PERP mark (mark) stream 11400 ms assumed publication the WS sub.ticker frame that carries the venue’s ticker (fairPrice and indexPrice, dated by the frame’s timestamp): its fact; git e473ed5
MEXC-PERP open-interest (oi) stream 11400 ms assumed publication the WS sub.ticker frame that carries the venue’s ticker (holdVol, dated by the frame’s timestamp): its fact; git e473ed5
MEXC-PERP stats (stats) stream 11400 ms assumed publication the WS sub.ticker frame that carries the venue’s ticker, mark and open-interest (volume24, amount24, high, low, dated by the frame’s timestamp): their fact; git ccb0c59
MEXC-PERP ticker (ticker, book prices) stream 11400 ms assumed publication WS sub.ticker “several times a second”: the adapter (:12-13); rows 10.8/11.4 s; git f2cf05b
NADO-PERP depth-derived (book bands) stream 12 s assumed publication WS: undocumented; rows 10/12 s; git e071473
NADO-PERP funding (funding) stream 20 s documented none recomputed ≈ every 20 s: nado-perp.md:210; source_time is the last settlement, so the value is dated by receipt; git e071473
NADO-PERP mark (mark) poll 15 s assumed none REST /v2/contracts every 15 s (the adapter’s MarkPollIntervalSeconds); the page carries no venue time; not measured on production; git c4ce646
NADO-PERP open-interest (oi) poll 15 s assumed none REST /v2/contracts every 15 s, the one cycle of mark, open interest and stats (the adapter’s ContractsPollIntervalSeconds); the page carries no venue time; not measured on production; was every 60 s; git 3d3a1b9
NADO-PERP stats (stats) poll 15 s assumed none REST /v2/contracts every 15 s, the page that carries mark and open interest (the adapter’s ContractsPollIntervalSeconds); the page carries no venue time; not measured on production; git 3d3a1b9
NADO-PERP ticker (ticker, book prices) derived from depth-derived — assumed publication the host assembles the ticker from the book; git e071473
OKX-PERP depth-derived (book bands) stream 130 ms measured publication okx-perp.md:79: 148 frames in ≈19 s; git 187383c
OKX-PERP funding (funding) stream 90 s measured publication okx-perp.md:89,92: every 30–90 s; rows 60/86 s; git 187383c
OKX-PERP mark (mark) on change hb 10 s documented publication okx-perp.md:90-91: within 200 ms of a change, otherwise every 10 s; git 187383c
OKX-PERP open-interest (oi) stream 20 s assumed publication WS open-interest: undocumented; rows 13.2/20.0 s; git 187383c
OKX-PERP stats (stats) stream 150 ms assumed publication the tickers channel that carries the venue’s ticker (vol24h, open24h, high24h, low24h, dated by the frame’s ts): its fact (okx-perp.md:71, ≈6.5 frames/s), not measured apart; git 6765c89
OKX-PERP ticker (ticker, book prices) stream 150 ms measured publication okx-perp.md:71: ≈6.5 frames/s; git 187383c
OKX-SPOT depth-derived (book bands) on change — documented publication WS books: incremental data is pushed every 100 ms for the changes in the order book during that period (docs ws order book channel), a book that did not change pushes nothing; okx-spot.md: 620 frames in 75 s on BTC-USDT, mean 119 ms, longest silence 0.60 s; git 926ab2d; no_update after 5 min, as the ticker: the book moves whenever its best level does, so it is never quieter than the ticker; its bands are not kept in history at the listings’ group to measure apart
OKX-SPOT stats (stats) on change — documented publication the same tickers frame as the ticker layer (okx-spot.md), only on change; git 926ab2d; no_update after 5 min: the longest spell 74 s, inside a bus outage (2026-10-07 19:42Z), none over 65 s (the history window) without one, the least traded of 10 included, 2026-10-05 to 10-08; twice it is 148 s
OKX-SPOT ticker (ticker, book prices) on change — documented publication WS tickers: the fastest rate is 1 update per 100 ms and there is no update when nothing triggered one, a trade or a change of the best bid or ask (docs ws tickers channel); okx-spot.md: 468 frames in 75 s on BTC-USDT, longest silence 0.48 s, 370 on LINK-USDT, 0.70 s; git 926ab2d; no_update after 5 min: the longest spell without a new value 41 s over 10 listings, the least traded (LTC-USDT) included, 2026-10-05 to 10-08; twice it is 82 s
SYNTHETIX-PERP depth-derived (book bands) stream 35 s assumed publication WS: undocumented, a thin book; rows 10/35 s; git 6756c33
SYNTHETIX-PERP funding (funding) stream 1 s measured publication WS marketPrices ≈1/s: synthetix-perp.md:96; git 6756c33
SYNTHETIX-PERP mark (mark) stream 1 s measured publication WS marketPrices ≈1/s: synthetix-perp.md:96; git 6756c33
SYNTHETIX-PERP open-interest (oi) poll 15 s measured publication REST every 15 s; rows 15.0/15.3 s; git e3c946c
SYNTHETIX-PERP stats (stats) poll 15 s measured publication REST every 15 s; rows 15.0/15.3 s; git e3c946c
SYNTHETIX-PERP ticker (ticker, book prices) derived from depth-derived — assumed publication the host assembles the ticker from a thin book; git 6756c33
WEEX-FUTURES depth-derived (book bands) stream 10 s assumed publication WS depth200: undocumented; rows 10/10 s (10 s window); git 581b41f
WEEX-FUTURES funding (funding) poll 60 s measured none REST every 60 s (F-01); rows 60/61 s; git f4e309c
WEEX-FUTURES mark (mark) stream 10 s assumed publication moved from the REST /tickers poll to the ticker channel that carries stats (m and i, dated by E), so it has the fact of stats: a frame about every 0.6 s (weex-futures.md), interval as depth-derived, not measured on production; git ed1c5f2
WEEX-FUTURES open-interest (oi) poll 300 s measured none REST every 300 s; rows 300/304 s; git 581b41f
WEEX-FUTURES stats (stats) stream 10 s assumed publication the ticker channel of the v3 socket (weex-futures.md: a frame about every 0.6 s, dated by E); interval as the venue’s other push layer, depth-derived (the 10 s history window), not measured on production; git 0cf2f5a
WEEX-FUTURES ticker (ticker, book prices) derived from depth-derived — assumed publication the host assembles the ticker from the book; git 43a01e7

35 pairs come only when the value changes, and their horizon is the connection. Each has a no-update threshold: how long its anchor (anchor above) may stand still on a live connection before the value is stale, no_update. It is measured on production per pair, from the longest spell any listing of the pair went without a new value over several days — breaks of the connection set aside — and checked against the least traded listings collected, so that a quiet market that is alive is not called stale; what each rests on is in its row. The socket a value comes on is watched as well: when nothing at all arrives on it — no data, no reply, no heartbeat of the venue, no answer to our keepalive — for longer than the venue guarantees it speaks (silent socket after), the collector treats it as lost and reconnects, and every value on it is connection_lost, not no_update. A protocol-level ping of the venue does not count: it never reaches the collector. —: the socket is not watched.

venue dataset (layer) no-update threshold silent socket after what the threshold rests on
ASTER-PERP stats (stats) 6 h 60 s no_update after 6 h: the longest spell without a new value, no break of the connection and no restart in it, 7 681 s (TRXUSDT, the least traded of 26 at USD 61 thousand a day, 2026-10-03 02:38-04:46Z; 59 spells over 30 minutes of TRXUSDT alone, and every spell that long is of a listing under USD 1.5 million a day; BTCUSDT and ETHUSDT none over 65 s), 2026-10-01 to 10-08; twice it is 4.3 h
ASTER-PERP ticker (ticker, book prices) 1 h 60 s no_update after 1 h: the longest quiet spell 1 595 s (TRXUSDT, the least traded, 2026-10-04 02:31-02:58Z; DOTUSDT, the next, 240 s), 2026-10-01 to 10-08; twice it is 53 minutes
BINANCE-SPOT depth-derived (book bands) 5 min 60 s no_update after 5 min, as the ticker: the top twenty moves whenever the best level does (it is the same book), so it is never quieter than the book ticker; its bands are not kept in history at the listings’ group to measure apart
BINANCE-SPOT stats (stats) 5 min 60 s no_update after 5 min: the longest spell without a new value 115 s (HYPEUSDC, the least traded of 12, 2026-10-07 22:54Z), no break in it, 2026-10-05 to 10-08; twice it is 230 s
BINANCE-SPOT ticker (ticker, book prices) 5 min 60 s no_update after 5 min: the longest spell 103 s, inside a bus outage (2026-10-07 12:19Z), 74 s without one (HYPEUSDC, the least traded of 12), 2026-10-05 to 10-08; twice it is 206 s
BINANCE-USDM ticker (ticker, book prices) 5 min 60 s no_update after 5 min: the longest spell without a new value 58 s over 44 listings (BCHUSDC, the least traded at USD 6 million a day, among them), 2026-10-05 to 10-08; twice it is 116 s
BYBIT-SPOT stats (stats) 5 min 60 s no_update after 5 min: the longest spell 79 s, inside a bus outage (2026-10-06 13:20Z), none over 65 s (the history window) without one, the least traded of 10 included, 2026-10-05 to 10-08; twice it is 158 s
DERIBIT-PERP depth-derived (book bands) 5 min 60 s —
DERIBIT-PERP funding (funding) 5 min 60 s —
DERIBIT-PERP mark (mark) 5 min 60 s —
DERIBIT-PERP open-interest (oi) 5 min 60 s —
DERIBIT-PERP stats (stats) 5 min 60 s —
DERIBIT-PERP ticker (ticker, book prices) 5 min 60 s —
DYDX-PERP open-interest (oi) 24 h 120 s no_update after 24 h: a market’s figure is named only when it moves, and the quiet markets stand for hours with the connection alive: the longest spell without a new value, no break of the markets socket and no restart in it, 38 828 s (AVAX-USD, 2026-10-04 08:57-19:44Z), PEPE-USD (the least traded, USD 1 thousand a day) 35 045 s, BTC-USD 5 530 s, 2026-10-01 to 10-08; twice it is 21.6 h
DYDX-PERP stats (stats) 36 h 120 s no_update after 36 h: the longest quiet spell 54 096 s (XLM-USD, USD 7 thousand a day, 2026-10-04 11:44Z to 10-05 02:45Z), UNI-USD 51 271 s, BTC-USD 1 834 s, 2026-10-01 to 10-08; twice it is 30.1 h
EDGEX-PERP depth-derived (book bands) 5 min 30 s —
EDGEX-PERP mark (mark) 5 min 30 s —
EDGEX-PERP open-interest (oi) 5 min 30 s —
EDGEX-PERP stats (stats) 5 min 30 s —
GATE-PERP ticker (ticker, book prices) 10 min 60 s no_update after 10 min: the longest spell without a new value 185 s (TRX_USDT, the least traded of 25, 2026-10-06 15:16-15:19Z), no break in it, 2026-10-05 to 10-08; twice it is 370 s
HYPERLIQUID mark (mark) 5 min 90 s no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
HYPERLIQUID open-interest (oi) 5 min 90 s no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
HYPERLIQUID stats (stats) 5 min 90 s no_update after 5 min: the longest spell 120 s, every listing at once (2026-10-08 17:58-18:00Z), none over 65 s (the history window) otherwise, the least traded of 25 (TRX) included, 2026-10-05 to 10-08; twice it is 240 s
KRAKEN-FUTURES funding (funding) 10 min 60 s no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES mark (mark) 10 min 60 s no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES open-interest (oi) 10 min 60 s no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES stats (stats) 10 min 60 s no_update after 10 min: the longest spell without a new value, no break and no restart in it, 157 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 462 s inside the outage of 2026-10-06 07:00-07:08Z (bus_unavailable, ws_disconnected); the least traded (PF_GBPUSD, PF_CHFUSD, no volume) none over 65 s, 2026-10-05 to 10-08; twice it is 314 s
KRAKEN-FUTURES ticker (ticker, book prices) 10 min 60 s no_update after 10 min, as the rest of the ticker frame: the longest quiet spell 111 s (PF_USDCUSD, 2026-10-05 02:44Z) over 198 listings, 434 s inside the outage of 2026-10-06 07:00-07:08Z; the least traded none over 65 s, 2026-10-05 to 10-08
LIGHTER-PERP depth-derived (book bands) 5 min 90 s —
LIGHTER-PERP mark (mark) 5 min 90 s —
LIGHTER-PERP stats (stats) 5 min 90 s —
LIGHTER-PERP ticker (ticker, book prices) 5 min 90 s —
OKX-SPOT depth-derived (book bands) 5 min 45 s no_update after 5 min, as the ticker: the book moves whenever its best level does, so it is never quieter than the ticker; its bands are not kept in history at the listings’ group to measure apart
OKX-SPOT stats (stats) 5 min 45 s no_update after 5 min: the longest spell 74 s, inside a bus outage (2026-10-07 19:42Z), none over 65 s (the history window) without one, the least traded of 10 included, 2026-10-05 to 10-08; twice it is 148 s
OKX-SPOT ticker (ticker, book prices) 5 min 45 s no_update after 5 min: the longest spell without a new value 41 s over 10 listings, the least traded (LTC-USDT) included, 2026-10-05 to 10-08; twice it is 82 s

31 pairs count a value’s age from our receipt, because the venue’s timestamp, where it sends one, dates something other than the value (venue time dates: none above): ASTER-PERP open-interest, AVANTIS-PERP funding, AVANTIS-PERP open-interest, AVANTIS-PERP venue-depth, BINANCE-SPOT depth-derived, BINANCE-SPOT ticker, DYDX-PERP depth-derived, DYDX-PERP open-interest, DYDX-PERP stats, DYDX-PERP ticker, EDGEX-PERP depth-derived, EDGEX-PERP mark, EDGEX-PERP open-interest, EDGEX-PERP stats, EDGEX-PERP ticker, GMX-PERP funding, GMX-PERP mark, GMX-PERP open-interest, GMX-PERP stats, GMX-PERP ticker, HYPERLIQUID funding, HYPERLIQUID mark, HYPERLIQUID open-interest, HYPERLIQUID stats, LIGHTER-PERP open-interest, NADO-PERP funding, NADO-PERP mark, NADO-PERP open-interest, NADO-PERP stats, WEEX-FUTURES funding, WEEX-FUTURES open-interest. Every other pair counts from the venue’s timestamp, and falls back to our receipt only for a value that arrives without one.

The -SPOT venues are collected and shown in the site and /v2 market-data endpoints. Since change set 37, /v2/venues, /v2/instruments and measurement requests support kind=spot or kind=all; DQL and Agent remain perpetual-only. The retired public market-data /v1 routes no longer serve these rows.

The history before 2026-09-26 is covered by facts reconstructed from the platform’s own record of how each venue was collected, labelled assumed; the page shows the version in force now.