Refresh cadence
Signals don’t all refresh on the same schedule. The signal catalog labels each signal with its cadence; this page is the broad shape.
The cadence buckets
Cadence is per-signal, not global. These are the buckets the table below counts.
- Live (1 min, market hours): most price-, volume-, and indicator-based signals. For US equities that means 4 AM–8 PM ET weekdays, pre-market and after-hours included. Crypto runs on the same 1-minute clock 24/7; FX runs it 24/5, closing Friday 5 PM ET and reopening Sunday 5 PM ET.
- Every 15 min: the
recent_*analyst-action booleans. - Hourly: analyst-rating signals (
analyst_count_*, targets), 24/7. - Once per business day (rates): the
R:series are not tick data — they are published once a day by their source, so that is how often they can change. The Fed reference rates land in the morning and the Treasury par-yield curve in the afternoon, each for the preceding session. Polling faster returns the same number. - Daily: the IPO-calendar signals (
pending_ipo,ipo_date). - Daily, post-close: fundamentals like
market_cap, daily cross booleans (golden_cross), 52-week extremes. Financial-statement signals (pe_ratio,eps) refresh here too; their values change when issuers file, roughly quarterly. - Nightly (ETF X-ray): ETF holdings and sector weights (
/v2/tickers/{t}/holdings,/sectors, and theetf_holderssignal) come from a nightly post-close vendor refresh — expect them to be up to a day behind.
How to tell which is which
The signal catalog has the per-signal answer.
Every signal in the catalog is tagged with its cadence. If you’re building a UI that shows freshness, pull that signal and label the source field accordingly.
Columns per cadence
Straight from the spec: how many live signals update on each cadence.
| Cadence | Signals | Examples |
|---|---|---|
| Live (1 min, market hours) | 217 | active, price, volume_today, session_open |
| Every 15 min | 16 | recent_upgrade, recent_downgrade, recent_initiation, recent_news_count |
| Hourly | 17 | analyst_target_upside_pct, analyst_count_total, analyst_count_with_target, analyst_count_strong_buy |
| Daily | 3 | pending_ipo, ipo_date, ipo_in_7d |
| Daily, post-close | 444 | ticker, total_employees, shares_outstanding, weighted_shares_outstanding |
The as_of timestamp
Every response tells you when it was assembled.
Every payload carries a top-level as_of ISO timestamp. For live endpoints it’s the server time at which the response was assembled. For as-of-history endpoints (/tickers/{t}?asof=, POST /v2/scan with asof) it’s the moment you asked about: the date (that day’s close) or the ISO timestamp you passed. Older as_of values are proportionally stale.
as_of is when we answered. price_asof, a column on the live row, is when the market data behind the price was produced: the moment the snapshot landed for a fair-value price, the tick’s own time for a trade or quote, the end of the bar for a minute bar. as_of minus price_asof is the age of the row’s live signals (price, volume, session fields, the intraday indicators on the one-minute update), and nothing else: every other signal is as of the last run of the cadence the catalog shows for it. A price_asof more than a few minutes old during the session is a halted or illiquid name, and q="price_asof < now() - interval '15 minutes'" on /v2/scan lists them. The stream’s update frames carry the same two: as_of is when the frame was pushed, data.price_asof the data time.