← tickerbot.io
View as markdown
Concepts

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 the etf_holders signal) 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.

CadenceSignalsExamples
Live (1 min, market hours)217active, price, volume_today, session_open
Every 15 min16recent_upgrade, recent_downgrade, recent_initiation, recent_news_count
Hourly17analyst_target_upside_pct, analyst_count_total, analyst_count_with_target, analyst_count_strong_buy
Daily3pending_ipo, ipo_date, ipo_in_7d
Daily, post-close444ticker, 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.