Products
Market Data
Market Data provides available equity and crypto prices, historical bars, and
reference data. A quote may come from a warehouse observation, a cached source, or a vendor fallback. Availability and observation time determine whether it is suitable for your use case; a successful request does not guarantee real-time data.
What's inside#
Quote and OHLCV routes expose prices and available market fields. Reference, corporate-action, calendar, and ETF routes provide their respective records. Coverage varies by symbol, source, and date. Full transcript text belongs to Transcripts & Corporate Events, with separate coverage and paid access requirements.
For the separate SSE interface, see Streaming.
Interpret quote provenance and freshness#
The quote's source identifies the returned provider or warehouse provenance.
Use these fields together rather than treating the response time as a market time.
| Field | Meaning |
|---|---|
source_as_of_ts | Source observation time when known; null when the provider omitted it |
retrieved_at | Time the service retrieved or observed the returned record |
timestamp_basis | source_observation, retrieval_time, or unknown; qualifies the legacy quote timestamp |
freshness_status | observed, stale, or unknown; observed alone does not guarantee a real-time price |
price_age_seconds | Age derived from a known source observation; nullable |
is_stale | Nullable source staleness indicator; null means unknown, not false |
price_basis | Source price basis when supplied, such as the relevant price or session context; nullable |
When timestamp_basis is retrieval_time, the compatibility timestamp can be
recent even if the underlying price is old. source_as_of_ts, price_age_seconds,
and is_stale remain null when source time is missing, and freshness_status is
unknown. Neither retrieved_at nor the response envelope's timestamp proves
that a trade or quote occurred then. Interpret known observations against the
market session and your own freshness requirement.
Access#
The available data routes below cost 1 credit per successful call and are included on Free and up. System health is exempt from credit charges. The legacy CDS route is currently unavailable and costs 0 credits.
Endpoints#
| Method | Path | Plan / credits | Description |
|---|---|---|---|
GET | /api/market/quote/{ticker} | Free+ / 1 | Available quote: price, nullable bid/ask, volume, change, and source observation fields. |
GET | /api/v3/fundamentals/prices | Free+ / 1 | OHLCV bars for ?ticker=: interval (second/minute/hour/day/week/month) with interval_multiplier, start_date/end_date window, limit (default 1000, max 5000). Pass asset_class=crypto for crypto. |
GET | /api/market/fundamentals/{ticker} | Free+ / 1 | Ref data: market cap, PE, forward PE, PB, EV/EBITDA, dividend yield, beta, sector, industry. |
GET | /api/market/corporate-actions/{ticker} | Free+ / 1 | Corporate actions (splits, dividends, spinoffs, mergers, delistings) on a rolling window. |
GET | /api/data/universe | Free+ / 1 | Tradable universe: tickers, tier (mega/large/mid/small), permno, market cap, is_active. Filter by tier. |
GET | /api/v3/monitoring/system_health | Free+ / 0 | Aggregate system health: per-subsystem status and score, with data staleness. |
GET | /api/data/calendar | Free+ / 1 | Market calendar: trading sessions by exchange (XNYS/XNAS/ARCA) with open/close times. |
GET | /api/crypto/{ticker} | Free+ / 1 | Crypto quotes: Bitcoin, Ethereum, etc.; price, 24h change, 24h volume, optional daily bars. |
GET | /api/v2/transcripts/{ticker} | Free+ / 1 | Legacy transcript-summary route; not the full-text archive. Check availability and source fields. |
GET | /api/v2/credit/cds/{ticker} | Unavailable / 0 | Legacy CDS route; backing data is pending. See Credit & Fixed-Income for the credit API. |
GET | /api/v3/intel/chart/{ticker} | Free+ / 1 | Candlestick chart with technical overlays (RSI, MACD, Bollinger Bands) as base64 PNG. |
GET | /api/v3/intel/etf_holdings | Free+ / 1 | ETF composition: pass ?etf=SPY for holdings, or ?ticker=AAPL for which ETFs hold it. |
GET | /api/v3/intel/etf_summary/{ticker} | Free+ / 1 | ETF intelligence rollup: top holdings, commodity exposure (if applicable), available signals. |
Prices apply to the exact paths listed here; other transcript and credit routes have their own product costs and plan requirements.
Examples#
Read a quote (1 credit)#
1curl -H "Authorization: Bearer $TENGU_API_KEY" \2 "https://firm.wealthnow.io/api/market/quote/AAPL"3 4# Illustrative quote fields; not a live price or freshness claim:5# {6# "ok": true,7# "ticker": "AAPL",8# "price": 333.08,9# "bid": null,10# "ask": null,11# "bid_size": null,12# "ask_size": null,13# "day_volume": 39269147,14# "prev_close": 333.08,15# "change": 0,16# "change_pct": 0,17# "market_status": "closed",18# "source": "vendor_fallback",19# "source_as_of_ts": null,20# "retrieved_at": "2026-09-15T07:30:53.701858+00:00",21# "timestamp_basis": "retrieval_time",22# "freshness_status": "unknown",23# "price_age_seconds": null,24# "is_stale": null,25# "timestamp": "2026-09-15T07:30:53.701858+00:00"26# }1import os, requests2 3r = requests.get(4 "https://firm.wealthnow.io/api/market/quote/AAPL",5 headers={"Authorization": f"Bearer {os.environ['TENGU_API_KEY']}"},6 timeout=30,7)8r.raise_for_status()9data = r.json()10change = data.get("change_pct")11change_label = f"{change:+.2f}%" if isinstance(change, (int, float)) else "change unavailable"12print(f"{data['ticker']} @ ${data['price']} ({change_label})")13if data.get("bid") is not None and data.get("ask") is not None:14 print(f"Bid/Ask: ${data['bid']} / ${data['ask']}")15else:16 print("Bid/ask unavailable for this quote.")17source_time = data.get("source_as_of_ts")18if source_time and data.get("timestamp_basis") == "source_observation":19 print(f"Source observation: {source_time}; freshness: {data.get('freshness_status', 'unknown')}")20else:21 print("Source observation time unavailable; freshness is unknown.")Daily bars with date range (1 credit)#
1curl -H "Authorization: Bearer $TENGU_API_KEY" \2 "https://firm.wealthnow.io/api/v3/fundamentals/prices?ticker=NVDA&interval=day&start_date=2026-06-01&end_date=2026-07-02&limit=30"3 4# Response structure (abbreviated):5# {6# "ok": true,7# "timestamp": "2026-09-23T02:00:26Z",8# "ticker": "NVDA",9# "asset_class": "equity",10# "interval": "day",11# "interval_multiplier": 1,12# "start_date": "2026-06-01",13# "end_date": "2026-07-02",14# "items": [15# {16# "ticker": "NVDA",17# "open": 215.73,18# "high": 224.87,19# "low": 215.7,20# "close": 224.36,21# "volume": 212850685.062286,22# "vwap": 221.4785,23# "trades": 3465498,24# "time": "2026-06-01T04:00:00Z",25# "time_milliseconds": 178028640000026# },27# ...28# ]29# }Bars are oldest first, with time in UTC. limit keeps the most recent N bars in the window.
1import os, requests2 3r = requests.get(4 "https://firm.wealthnow.io/api/v3/fundamentals/prices",5 params={6 "ticker": "NVDA",7 "interval": "day",8 "start_date": "2026-06-01",9 "end_date": "2026-07-02",10 "limit": 30,11 },12 headers={"Authorization": f"Bearer {os.environ['TENGU_API_KEY']}"},13 timeout=30,14)15r.raise_for_status()16data = r.json()17bars = data["items"]18print(f"{len(bars)} bars for {data['ticker']} ({data['interval']})")19for bar in bars[-5:]:20 print(f"{bar['time'][:10]}: {bar['open']:.2f} → {bar['close']:.2f}")Crypto quote — Bitcoin with 7-day series (1 credit, Free and up)#
1curl -H "Authorization: Bearer $TENGU_API_KEY" \2 "https://firm.wealthnow.io/api/crypto/BTC?vs=USD&series=true"3 4# Illustrative response structure, not a live sample:5# {6# "ok": true,7# "timestamp": "2026-07-05T14:30:20Z",8# "ticker": "BTC",9# "pair": "X:BTCUSD",10# "vs": "USD",11# "quote": {12# "price": 64250.50,13# "change_pct_24h": 2.15,14# "change_24h": 1360.00,15# "volume_24h": 28900000000.0,16# "market_cap": null,17# "as_of_ts": "2026-07-05T14:30:00Z"18# },19# "day": {20# "open": 63200,21# "high": 64800,22# "low": 62950,23# "close": 64250.50,24# "volume": 28900000000.025# },26# "series_daily": [27# {28# "date": "2026-07-04",29# "open": 62890,30# "high": 63400,31# "low": 62100,32# "close": 63200,33# "volume": 26500000000.034# }35# ],36# "source": "vendor:polygon",37# "as_of": "2026-07-05T14:30:00Z"38# }1import os, requests2 3r = requests.get(4 "https://firm.wealthnow.io/api/crypto/BTC",5 params={"vs": "USD", "series": True},6 headers={"Authorization": f"Bearer {os.environ['TENGU_API_KEY']}"},7 timeout=30,8)9r.raise_for_status()10data = r.json()11quote = data["quote"]12print(f"Bitcoin: ${quote['price']:,.2f} ({quote['change_pct_24h']:+.2f}% in 24h)")13if data.get("series_daily"):14 print(f"7-day low: ${min(b['low'] for b in data['series_daily']):,.2f}")Related#
- API reference — complete endpoint reference and per-plan access.
- Pricing & credits — product costs, plan inclusions, and add-ons.
- Research Datasets — row-level access to the licensed research archives.
- Real-Time Streaming — live quotes, 1-minute bars, and trade ticks over SSE.