Wealthnow
Sign up

Products

Status

Crypto

Crypto prices, the liquid trading universe, perpetual-futures positioning, options volatility, exchange announcements, on-chain flows, and crypto news, all behind the same API key as the rest of Wealthnow.

What's inside

  • Quotes and universe. A live quote for one pair from the real-time market-data feed (439 pairs), and the full liquid universe ranked by 24-hour dollar volume, with stablecoins excluded.
  • Derivatives positioning. Cross-venue perpetual funding normalised to an 8-hour rate, open interest in USD, perpetual basis in basis points, and the BTC or ETH options volatility surface.
  • Exchange events and on-chain flows. Listing, delisting and trading-caution notices taken from seven exchanges' own announcement APIs, breaking crypto-native headlines classified by event type, and stablecoin supply and lending liquidations read from Ethereum logs.
  • Market data (Pro). Coin profiles with supply and all-time highs and lows, daily history back to each coin's first day, the whole market's size and dominance, sector (category) performance, top movers with a volume floor, where each coin trades, exchanges, public-company treasuries and decentralised-exchange pools.
  • Recorded history (Pro). The derivatives, events and on-chain readings above as history: funding, open interest and basis per asset and per venue, the BTC and ETH volatility surface, the exchange-announcement and headline archive, and on-chain flows, one row per 15-minute recording cycle.
  • News, sentiment and whale flow. A crypto newswire with per-coin and market-wide sentiment rollups, trending headlines, clustered events, an evening digest, delayed prices, and large on-chain and exchange transactions.

The derivatives, events and on-chain routes are data context. Their responses carry not_a_score: true and not_a_forecast: true: they report what the venues and the chain published, not a trading view.

For historical crypto OHLCV bars, or a snapshot with an is_stale flag, pass asset_class=crypto to /api/v3/fundamentals/prices or /api/v3/fundamentals/price_snapshot on Market Data. Bars run on the UTC day, and a bar still forming (today's day bar, the open week's bar) carries partial: true, with as_of, as_of_basis, last_bar_partial, data_through and session_complete on the response; see Bars still forming. Without it, a symbol such as BTC or LINK returns the US-listed equity of the same ticker. No other Market Data route takes asset_class: prices/history, prices/corporate_actions and intel/chart read BTC as the US-listed ticker.

Access

This page spans several products. Each row in the tables below states its plan and credit cost.

RoutesProductCredits/callPlans
/api/crypto/*, /api/v3/crypto/* (quotes, universe, derivatives, events, on-chain)market_data1Free and up
/api/v3/news_crypto/* (news, sentiment, whale flow)news_sentiment2Starter and up
/api/v3/crypto/market/* (market data: profiles, history, global, categories, movers, exchanges, treasuries, on-chain pools)crypto_market2Pro and up
/api/v3/crypto/history/* (recorded history: derivatives per asset and per venue, vol surface, events, on-chain)crypto_history3Pro and up

Failed requests are not billed. When no upstream source answers, the derivatives, events and on-chain routes return 503 with error: "upstream_unavailable", an error_code such as crypto_derivatives_unavailable and a Retry-After, instead of an empty 200. On the derivatives routes, a ticker the venues list as a security (such as NVDA) answers 422 not_a_crypto_asset, and a symbol no venue lists answers 404 symbol_not_listed. Neither is retryable. See Pricing & credits.

The universe, derivatives, events and on-chain routes also accept asset_class=crypto. It is optional and crypto is its only value.

Endpoints

Prices and universe

MethodPathPlan / creditsMCP toolDescription
GET/api/crypto/{ticker}Free+ / 1crypto_quoteLive quote for one pair: last-trade price, 24h change and volume on a UTC-day basis, day and previous-day OHLC, and the last trade. Accepts BTC, BTCUSD or X:BTCUSD. vs (string, default USD): quote currency, such as EUR or BTC. series (boolean, default true): include the last 7 daily bars. An unknown symbol returns a structured 404.
GET/api/crypto/universeFree+ / 1crypto_universeEvery priced pair that clears a liquidity floor, ranked by 24h dollar volume, stablecoins excluded. min_dollar_volume (number, default 1000000): the floor. limit (integer, 1 to 1000, optional): page size; omit it to get every pair above the floor. offset (integer, default 0).

Market data (Pro)

Every answer states when its figures were fetched (fetched_at, age_s), whether they are older than their refresh window (stale) and the unit of each number (units). Nothing is served older than 24 hours. Tools that take a coin accept symbol or id: when several coins share a symbol, the one with the best market-cap rank is used and symbol_resolution names it and the other candidates. An unknown parameter answers 422 with the accepted list, and when the source cannot answer the route returns 503 with error: "upstream_unavailable" and a Retry-After.

MethodPathPlan / creditsMCP toolDescription
GET/api/v3/crypto/market/profilePro+ / 2crypto_market_profileA coin's price, market cap, rank, supply or all-time high/low, for one coin or up to 50 at once (symbols=BTC,ETH,SOL or ids=). Each coin comes back with its id, name and symbol. Params: symbols, ids, vs_currency.
GET/api/v3/crypto/market/historyPro+ / 2crypto_market_historyHow a coin's price, market cap or volume moved over a year, five years or its whole life: one row per day. Params: symbol, id, days, interval, vs_currency.
GET/api/v3/crypto/market/coinPro+ / 2crypto_market_coinWhat a coin is (links, categories, genesis, contract addresses), or every market figure for one coin in one answer. Params: symbol, id, localization, tickers, market_data, community_data, developer_data, sparkline, include_categories_details, dex_pair_format.
GET/api/v3/crypto/market/chartPro+ / 2crypto_market_chartA coin's recent price, market cap and volume series (e.g. the last 1, 7, 30 or 90 days) to chart or compare. Params: symbol, id, days, interval, vs_currency, precision.
GET/api/v3/crypto/market/chart/rangePro+ / 2crypto_market_chart_rangeA coin's price, market cap and volume between two exact dates. Params: symbol, id, from, to, interval, vs_currency, precision.
GET/api/v3/crypto/market/ohlcPro+ / 2crypto_market_ohlcA coin's open-high-low-close candles. Params: symbol, id, days, interval, vs_currency, precision.
GET/api/v3/crypto/market/tickersPro+ / 2crypto_market_tickersWhere a coin trades: its trading pairs on every exchange, with price, 24 h volume, spread and liquidity grade (100 per page). Params: symbol, id, exchange_ids, include_exchange_logo, page, order, depth, dex_pair_format.
GET/api/v3/crypto/market/on_datePro+ / 2crypto_market_on_dateWhat a coin's price, market cap or volume was on a specific past date. Params: symbol, id, date, localization.
GET/api/v3/crypto/market/contractPro+ / 2crypto_market_contractGiven a token's contract address and chain: which coin it is and its market data. Params: platform, address.
GET/api/v3/crypto/market/coinsPro+ / 2crypto_market_coinsA ranked table of coins (by market cap, volume or name), optionally filtered to ids, symbols or a category, with price and percentage changes. Params: vs_currency, ids, symbols, include_tokens, category, order, per_page, page, sparkline, price_change_percentage, precision.
GET/api/v3/crypto/market/coins/listPro+ / 2crypto_market_coins_listEvery coin's id, symbol and name (about 17,000 rows), e.g. to map symbols to ids in bulk. Large: prefer crypto_market_search or a symbol on the other tools. Params: include_platform, status.
GET/api/v3/crypto/market/coins/newPro+ / 2crypto_market_coins_newWhich coins were listed most recently.
GET/api/v3/crypto/market/moversPro+ / 2crypto_market_moversWhich coins rose or fell the most (top gainers and losers) over 1h to 1y, filtered to coins with real trading volume, plus what is trending in searches. Params: duration, min_volume_usd, top_coins, include_trending.
GET/api/v3/crypto/market/trendingPro+ / 2crypto_market_trendingWhat coins, categories or NFTs are trending in searches right now. Params: show_max.
GET/api/v3/crypto/market/categoriesPro+ / 2crypto_market_categoriesHow crypto sectors are doing (DeFi, layer 1, memes, AI ...): market cap and 24 h change per category; with category= the top coins inside one category. Params: limit, order, category, vs_currency.
GET/api/v3/crypto/market/categories/listPro+ / 2crypto_market_categories_listEvery category id and name (to pass as category= elsewhere).
GET/api/v3/crypto/market/globalPro+ / 2crypto_market_globalThe whole crypto market: total market cap, 24 h volume and their change, Bitcoin and Ether dominance, and DeFi's share. Params: vs_currency.
GET/api/v3/crypto/market/global/chartPro+ / 2crypto_market_global_chartThe total crypto market cap and volume over time. Params: days, vs_currency.
GET/api/v3/crypto/market/searchPro+ / 2crypto_market_searchFind a coin, exchange, category or NFT by name or symbol when you do not know its id. Params: query.
GET/api/v3/crypto/market/pricePro+ / 2crypto_market_priceThe current price of one or more coins (up to 50 symbols or 250 ids), with market cap, 24 h volume and 24 h change. Params: symbols, ids, vs_currencies, include_market_cap, include_24hr_vol, include_24hr_change, include_last_updated_at, precision.
GET/api/v3/crypto/market/exchangesPro+ / 2crypto_market_exchangesWhich crypto exchanges are the largest or most trusted. Params: per_page, page.
GET/api/v3/crypto/market/exchanges/listPro+ / 2crypto_market_exchanges_listEvery exchange id and name (to pass as id= elsewhere). Params: status.
GET/api/v3/crypto/market/exchangePro+ / 2crypto_market_exchangeOne exchange: its volume, trust score, country and top pairs. Params: id, dex_pair_format.
GET/api/v3/crypto/market/exchange/tickersPro+ / 2crypto_market_exchange_tickersEvery trading pair on one exchange, optionally for given coins (100 per page). Params: id, coin_ids, include_exchange_logo, page, depth, order, dex_pair_format.
GET/api/v3/crypto/market/exchange/volumePro+ / 2crypto_market_exchange_volumeHow an exchange's trading volume changed over time. Params: id, days.
GET/api/v3/crypto/market/derivatives/exchangesPro+ / 2crypto_market_derivatives_exchangesWhich derivatives exchanges have the most open interest or volume. Params: order, per_page, page.
GET/api/v3/crypto/market/derivatives/exchanges/listPro+ / 2crypto_market_derivatives_exchanges_listEvery derivatives exchange id and name.
GET/api/v3/crypto/market/derivatives/exchangePro+ / 2crypto_market_derivatives_exchangeOne derivatives exchange: open interest, volume and, with include_tickers, its contracts. Params: id, include_tickers.
GET/api/v3/crypto/market/asset_platformsPro+ / 2crypto_market_asset_platformsEvery blockchain (asset platform) id, e.g. to look a token up by contract address. Params: filter.
GET/api/v3/crypto/market/exchange_ratesPro+ / 2crypto_market_exchange_ratesBitcoin's exchange rate against fiat currencies, commodities and other coins.
GET/api/v3/crypto/market/treasuriesPro+ / 2crypto_market_treasuriesWhich public companies hold Bitcoin or Ether and how much. Params: coin.
GET/api/v3/crypto/market/onchain/trending_poolsPro+ / 2crypto_market_onchain_trending_poolsWhich decentralised-exchange pools are trending on a chain. Params: network, include, page, duration.
GET/api/v3/crypto/market/onchain/token_pricePro+ / 2crypto_market_onchain_token_priceThe on-chain USD price of tokens by contract address (up to 30 on one chain). Params: network, addresses, include_market_cap, mcap_fdv_fallback, include_24hr_vol, include_24hr_price_change, include_total_reserve_in_usd.
GET/api/v3/crypto/market/onchain/tokenPro+ / 2crypto_market_onchain_tokenA token on a decentralised exchange: its price, liquidity, volume and top pools. Params: network, address, include.
GET/api/v3/crypto/market/onchain/poolPro+ / 2crypto_market_onchain_poolOne decentralised-exchange pool: its prices, liquidity, volume and trades. Params: network, address, include.

Derivatives positioning

MethodPathPlan / creditsMCP toolDescription
GET/api/v3/crypto/derivatives/fundingFree+ / 1crypto_derivatives_fundingIs a coin's perpetual market crowded? Cross-venue funding per base asset from first-party venues, each rate normalised to 8 hours from the venue's own settlement interval: the open-interest-weighted rate across verified venues (the headline), the plain mean, dispersion across venues in bps, APR, and a 30-day z-score once 60 settlements exist. symbols (string, optional): comma list of base assets such as BTC,ETH, at most 20; default is the top 20 by open interest. detail (auto, full or summary, default auto): auto keeps the response under about 15,000 characters (flat per-venue rows for one coin, compact {venue: value} maps for several); full returns every field, for one coin; summary leaves out the flat rows.
GET/api/v3/crypto/derivatives/open_interestFree+ / 1crypto_derivatives_open_interestLeverage in the system: perpetual open interest per base asset in USD across the reachable venues, the total, and the dominant venue. symbols (string, optional, at most 20). detail (auto, full or summary, default auto): auto keeps the response under about 15,000 characters (flat per-venue rows for one coin, compact {venue: value} maps for several); full returns every field, for one coin; summary leaves out the flat rows.
GET/api/v3/crypto/derivatives/basisFree+ / 1crypto_derivatives_basisCarry: perpetual premium (mark against index) in bps per venue and the cross-venue mean. Positive means perps trade rich to spot. symbols (string, optional, at most 20). detail (auto, full or summary, default auto): auto keeps the response under about 15,000 characters (flat per-venue rows for one coin, compact {venue: value} maps for several); full returns every field, for one coin; summary leaves out the flat rows.
GET/api/v3/crypto/derivatives/vol_surfaceFree+ / 1crypto_derivatives_vol_surfaceThe options market's view from one full-chain read: at-the-money IV at 7, 30 and 90 days, 10%-OTM put-call skew at 30 days, put/call open-interest ratio, max pain per expiry, and the 30-day implied-vol index against realised vol. symbol (string, default BTC): BTC or ETH have deep chains; other currencies report thin expiries as missing.

Exchange events and on-chain flows

MethodPathPlan / creditsMCP toolDescription
GET/api/v3/crypto/events/announcementsFree+ / 1crypto_events_announcementsWhat an exchange announced and when: listings, delistings and trading-caution notices from seven venues' own announcement APIs, each with the venue's origin timestamp and how late it was seen (lag_ms). The same event on several venues is collapsed into one row that keeps the earliest origin and lists every venue. hours (integer, 1 to 168, default 24). event_type (listing, delisting, caution or other, optional). symbols (string, optional): comma list of base assets.
GET/api/v3/crypto/events/headlinesFree+ / 1crypto_events_headlinesWhat is breaking on crypto-native social posts and blogs, mapped to coins, with each post's own timestamp. Every item is classified by event type and tagged tier 1 when the account is a known breaking source, tier 2 otherwise. Retweets and replies are dropped. limit (integer, 1 to 200, default 50). event_type (exploit, halt, depeg, regulatory, listing, delisting, etf, unlock, liquidation or headline, optional). symbols (string, optional). tier1_only (boolean, default false).
GET/api/v3/crypto/onchain/flowsFree+ / 1crypto_onchain_flowsStablecoin issuance and lending liquidations read from chain logs: USDC and USDT mint and burn totals with the net supply change, and liquidation counts from the Aave v3 pool, all on Ethereum. hours (integer, 1 to 72, default 24).

Recorded history (Pro)

The live derivatives, events and on-chain routes answer only for the present. These five read the recording Wealthnow keeps of them, one row per 15-minute cycle, newest first. Every route requires date or start (with optional end): at most 31 days per call, 7 on derivatives_venues, and a window before the recording began is a 422. Each answer carries as_of (the newest observation), gaps (stretches of more than an hour with no recording) and freshness (how old the newest row is). Like the live routes, they are data context, not a score.

MethodPathPlan / creditsMCP toolDescription
GET/api/v3/crypto/history/derivativesPro+ / 3crypto_history_derivativesHow crowding or leverage built up over days: cross-venue perpetual funding, open interest and basis for one base asset per cycle. Units: funding_rate_8h is a fraction per 8 hours (funding_apr is that times 3 × 365, also a fraction), oi_usd_total and mark_px are USD, perp_premium_bps and dispersion_bps are basis points. Only rows of the current multi-venue method are served (multivenue_since); earlier rows are withheld and counted. licence_mode states the licensed tier's access in that cycle (commercial, unavailable, timeout or error). Params: symbol, date, start, end, limit, asset_class.
GET/api/v3/crypto/history/derivatives_venuesPro+ / 3crypto_history_derivatives_venuesEvery venue row behind those aggregates, to rebuild one, audit a venue or compare venues over time: per venue and cycle, the native and 8-hour-normalised funding rate (fractions), settlement interval (hours), open interest (USD), mark, index and last price, premium (basis points), tier and source (first_party or aggregator), and whether a gate quarantined the row and why. venue filters to one venue. At most 7 days per call. Params: symbol, venue, date, start, end, limit, asset_class.
GET/api/v3/crypto/history/vol_surfacePro+ / 3crypto_history_vol_surfaceHow BTC or ETH implied vol and its term structure moved around an event, recorded since 2026-09-02: at-the-money implied vol at the expiries nearest 7, 30 and 90 days and the 90d-7d slope, the 10%-OTM put-minus-call implied-vol difference at 30 days, the put/call open-interest ratio, the 30-day implied-vol index, realised vol and their ratio. Every vol figure is annualised vol points (38.3 = 38.3%). Realised vol and the ratio are served only from realized_vol_valid_since; earlier rows are null with the reason. Params: symbol, date, start, end, limit, asset_class.
GET/api/v3/crypto/history/eventsPro+ / 3crypto_history_eventsWhat was listed, delisted or exploited last week, recorded since 2026-09-02: exchange announcements and the crypto headline feed (exploits, halts, depegs, regulatory, ETF, unlocks, liquidations), one row per item by publication time. Each row has its publication time (as_of_ts; when an item carried none, published_time_missing is true and as_of_ts is when it was first recorded), when it was detected and recorded, the delay (lag_ms), venue, the coins it names, title and link; headline rows carry tier 1 or 2 (1 = an account known to break events). event_type is a class, never a direction. Params: date, start, end, feed, event_type, symbol, venue, limit, asset_class.
GET/api/v3/crypto/history/onchainPro+ / 3crypto_history_onchainHow stablecoin supply or liquidations trended over days, recorded since 2026-09-02, one row per metric per cycle: stablecoin_flows_24h (USDC and USDT minted and burned on Ethereum in USD, and their net) and aave_liquidations_24h (liquidations on the Aave v3 Ethereum pool, with the pool's total event count so a calm market is told apart from a dead feed). Each row covers the 24 hours ending at as_of_ts, so consecutive rows overlap: never add rows together. A reading where a mint or burn query did not answer has its totals withheld (null, with the reason). Params: metric, date, start, end, limit, asset_class.

News, sentiment and whale flow

All routes in this table bill as news_sentiment: Starter and up, 2 credits per call.

MethodPathPlan / creditsMCP toolDescription
GET/api/v3/intel/news_cryptoStarter+ / 2intel_news_cryptoThe newswire's cryptocurrency channel, live, newest first: title, teaser, url, published (UTC), channels, tags, tickers and coins; body=true adds the full HTML. tickers takes coins (BTC, ETH, SOL) or coin-stock proxies (COIN, MSTR): a major coin's symbol is read as the coin, and a symbol shared by a smaller coin and a listed stock (DASH, COMP, LIT) is read as the stock and flagged ambiguous, so send X:<COIN>USD for that coin. tickers_read_as says how each was read. date_from and date_to (UTC days, inclusive) read past windows back to 2018. An empty list is a real empty answer; a feed that did not answer is a 503. Params: tickers, limit, body, date_from, date_to, asset_class.
GET/api/v3/news_crypto/summary/{ticker}Starter+ / 2news_crypto_summaryOne call for "what is going on with BTC?": the last 24 hours of news, 7-day sentiment stats and trending headlines for one coin.
GET/api/v3/news_crypto/latestStarter+ / 2news_crypto_latestRecent articles for one or more coins: title, source, sentiment label, date and topic tags. tickers (string, required): comma list such as BTC,ETH. items (integer, 1 to 50, default 20). date_range (today, yesterday, last7days or last30days, default today).
GET/api/v3/news_crypto/ticker_onlyStarter+ / 2news_crypto_ticker_onlyArticles that mention only the requested coin, with no co-tagged altcoins. ticker (string, required). items (integer, 1 to 100, default 50). page (integer, 1 to 50, default 1).
GET/api/v3/news_crypto/multi_tickerStarter+ / 2news_crypto_multi_tickerArticles in which every listed coin appears. tickers (string, required). items (integer, 1 to 100, default 50). page (integer, 1 to 50, default 1).
GET/api/v3/news_crypto/by_categoryStarter+ / 2news_crypto_by_categoryMarket-wide crypto news. section (general for overall crypto-market headlines, alltickers for cross-coin coverage; default general). items (integer, 1 to 50, default 20). date_range (string, default today).
GET/api/v3/news_crypto/trendingStarter+ / 2news_crypto_trendingTrending crypto headlines, filtered down to top stories. ticker (string, optional): omit for market-wide.
GET/api/v3/news_crypto/eventsStarter+ / 2news_crypto_eventsRelated stories clustered into discrete events. Omit every parameter for recent events. tickers (string, optional): events touching these coins. eventid (string, optional): every story in one event. page (integer, 1 to 20, default 1).
GET/api/v3/news_crypto/sundownStarter+ / 2news_crypto_sundownEvening crypto market recap, published Monday to Friday at 7pm ET. page (integer, 1 to 10, default 1).
GET/api/v3/news_crypto/sentiment_statsStarter+ / 2news_crypto_sentiment_statsDaily sentiment rollup for one coin: positive, negative and neutral article counts and a sentiment score from -1.5 to +1.5. ticker (string, required). date_range (last7days, last30days or last60days, default last30days).
GET/api/v3/news_crypto/market_sentimentStarter+ / 2news_crypto_market_sentimentSentiment rollup across the whole crypto news feed, with no coin filter. date_range (string, default last7days).
GET/api/v3/news_crypto/all_tickers_sentimentStarter+ / 2news_crypto_all_tickers_sentimentSentiment leaderboard: every tracked coin's sentiment score over the window. date_range (string, default last7days). page (integer, 1 to 20, default 1).
GET/api/v3/news_crypto/top_mentionsStarter+ / 2news_crypto_top_mentionsThe 50 most-mentioned coins over the window, an attention measure. date_range (string, default last7days).
GET/api/v3/news_crypto/ticker_priceStarter+ / 2news_crypto_ticker_priceDelayed prices (up to 15 minutes) with 24h volume and price changes. tickers (string, optional): one coin, a comma list, or omit for the top 50 by 24h volume. For a live price, use /api/crypto/{ticker}.
GET/api/v3/news_crypto/whale_transactionsStarter+ / 2news_crypto_whale_transactionsLarge transactions on the BTC, ETH, SOL and TRX networks plus major exchanges, updated about every 5 minutes. tickers (string, optional). date_range (string, default last24hours; also last1hour, last7days, last30days or MMDDYYYY-MMDDYYYY). min_amount (integer, USD, optional). items (integer, 1 to 100, default 50). page (integer, 1 to 20, default 1).
GET/api/v3/news_crypto/whale_summaryStarter+ / 2news_crypto_whale_summaryIs large money moving onto or off exchanges? Total whale volume, net exchange flow (in against out) and the biggest single transaction over the window. tickers (string, optional). date_range (string, default last7days).

A coin filter a news_crypto route does not take is refused, not dropped: a non-blank ticker, tickers, symbol, symbols, sector, sectors, industry, topic or topics that the route does not declare answers 422 with error: "unsupported_filter", not billed, and detail names the crypto parameter or route to use (for example news_crypto/latest?tickers=BTC, or news_crypto/ticker_only?ticker=BTC for articles about one coin alone). news_crypto/latest takes tickers, not ticker. Market-wide routes such as by_category, market_sentiment and top_mentions take no coin filter at all.

Reading the responses

Quotes

/api/crypto/{ticker} returns pair (the normalised X:<BASE><QUOTE> form), a quote block, day and prev_day OHLC bars with vwap, the last_trade, and series_daily when series=true.

  • quote.change_24h and quote.change_pct_24h compare the price with the previous UTC day's close (change_basis: "vs_prev_utc_day_close"), not a rolling 24 hours.
  • quote.volume_24h is the volume of the current UTC day so far (volume_basis: "utc_day"), the same figure as day.volume. Until the new UTC day's bar has data, just after midnight UTC, it is the previous UTC day's full volume instead: volume_basis is prev_utc_day and day is null.
  • quote.market_cap is always null: the feed carries no supply data.
  • as_of and quote.as_of_ts are the feed's observation time. last_trade.ts is the time of the last print.

Universe

/api/crypto/universe reports the size of the book it ranked alongside the rows: priced (pairs the feed priced), excluded_quote, excluded_stable, below_floor, and liquid (pairs above the floor). Each row in universe has symbol, pair, price, dollar_volume_24h, change_pct_24h and rank. Ranks are assigned on the whole liquid book, so a page that starts at offset=50 begins at rank 51. Walk the book with has_more and next_offset.

This is a liquidity ranking: it tells you which pairs trade enough to be tradeable, not which will move.

Market data

Every /api/v3/crypto/market/* answer wraps its payload in the same fields:

  • ok and tool, the tool that answered (for example tengu_v3_crypto_market_profile).
  • source, always "market-data:crypto".
  • as_of and fetched_at: when the data was read from the source, in UTC. age_s is its age in seconds, and max_age_s (86400) is the oldest it can be.
  • cache: hit (a stored copy still fresh for this route), miss (read on this call) or stale. stale: true means the source could not be read and a copy under 24 hours old was served in its place.
  • units: what each number in data is measured in. On the chart routes, for example, prices are [timestamp ms epoch UTC, price in vs_currency].
  • data: the route's payload.
  • parts, on an answer built from more than one read: each read's fetched_at, age_s, stale and cache. as_of is then the oldest read, age_s the largest, and stale is true if any read was.

Reading the payloads:

  • One coin, by symbol or id. The coin routes take symbol (BTC) or id (bitcoin), exactly one of them: neither is 422 missing_param, both is 422 invalid_param. When several coins share a symbol, the one with the best market-cap rank is used. The answer names it in coin (id, name, symbol) and shows the choice in symbol_resolution: chosen_id, the basis, up to 10 candidates with their market_cap_rank, and candidates_total. To get a different coin, pass its id.
  • Several coins. profile (up to 50 coins) and price (up to 50 symbols or 250 ids) take symbols and ids lists, and symbol_resolution is keyed by symbol. profile returns data.coins and data.not_found. Each coin has its price, market cap and rank, fully diluted valuation, volume, circulating, total and max supply, all-time high and low with their dates, and price_change_percentage_1h to price_change_percentage_1y. price returns data keyed by coin id, beside coins (what each requested symbol or id resolved to, with priced: false where no price came back) and not_found. Either call is 404 coin_not_found only when none of the coins matched.
  • History. history returns one row per UTC day in data.rows: date, t_ms, close, market_cap and volume_24h, with the window's from and to in unix seconds. days=max reaches back to the coin's first day. on_date answers for one past day (from 2009-01-03 to today), and chart/range takes from and to in unix seconds, from first.
  • Ids. Ids are lowercase: coins (bitcoin), exchanges (binance), derivatives exchanges (binance_futures) and categories (from categories/list). The on-chain routes name a chain by network id (eth, solana, base); contract names it by platform id (ethereum, binance-smart-chain), which asset_platforms lists.
  • Errors. An unknown parameter is 422 unknown_param, with the route's parameters in accepted. A malformed value is 422 invalid_param. An id that is malformed or unknown is 404 with a typed code: coin_not_found, exchange_not_found, platform_not_found, category_not_found, network_not_found or address_not_found. When the source cannot answer, the route returns 503 with error: "upstream_unavailable", a Retry-After header and an error_code: vendor_unavailable, rate_limited, budget_exhausted (today's allowance for all API customers is used up; it resets at 00:00 UTC), key_budget_exhausted (this key's share of that allowance is used up) or not_enabled. Answers already cached are still served meanwhile. No refusal is billed.

Derivatives, events and on-chain

These routes share one envelope: kind, purpose: "data_context", not_a_score, not_a_forecast, asset_class, as_of, status, rows, count and a sources block that states each venue's status.

  • Missing is typed, never zero. A symbol or venue with no data comes back with status: "missing" and a reason. A venue that cannot be reached from the API's region is reported as geo_blocked, and a venue in back-off as circuit_open.
  • Freshness. Funding, open interest and basis responses carry freshness_seconds and stale_after_seconds (600), and status is stale when the newest row is older than that. Every venue row carries its own as_of.
  • Funding. Each row has funding_rate_8h with funding_rate_basis, funding_apr (the 8-hour rate × 3 × 365), oi_weighted_rate_8h, mean_rate_8h_verified, dispersion_bps, funding_z_30d with funding_z_status, coverage and a venues map. The venues are first-party: OKX, Deribit, Kraken, dYdX, Bitget, Gate and Coinbase International, each marked tier: "verified" in sources. funding_rate_8h is the open-interest-weighted rate across verified venues (funding_rate_basis: "oi_weighted_verified"), or their median when a verified venue has no open interest; the plain mean is mean_rate_8h_verified. Binance and Bybit report status: "geo_blocked": their APIs are blocked from the API's region, and Wealthnow never reaches them another way. Deribit reports not_applicable when a request names neither BTC nor ETH, the only perpetuals it lists. The aggregator tier reports unavailable while no licensed key is configured; fields ending _all add aggregator rows that passed its quality gates.
  • Open interest. Each row has oi_usd_total, per-venue oi_usd, n_venues and dominant_venue. USD is the only unit summed across venues; contract counts are never served.
  • Basis. Each row has perp_premium_bps (the cross-venue mean) and per-venue premium_bps.
  • Vol surface. The single row has spot, a term list (per expiry: expiry, days, n_strikes, atm_iv, pc_oi_ratio, max_pain), atm_iv_7d, atm_iv_30d, atm_iv_90d, term_slope_90d_7d, skew_10pct_30d, pc_oi_ratio_total, and dvol, realized_vol and vol_risk_premium blocks. IV is in vol points (38.3 means 38.3%). The skew is a moneyness proxy, labelled as such in skew_method, not a delta-space skew. An expiry with fewer than 6 strikes is typed missing. vol_risk_premium.iv_rv_ratio below 1 means the market is pricing less movement than it is realising. realized_vol ends at the last completed hour: the venue stamps the hour in progress with its end time, and that partial point is never served. vol_risk_premium carries iv_as_of and rv_as_of, the time of each leg, because the two come from different series and a premium is only as current as its older leg.
  • Announcements and headlines. Each row has event_type, symbols, title, url, origin_ts (the venue's or post's own time), detected_ts and lag_ms. Announcement rows add venues and n_venues; headline rows add handle and tier. The event type is a classification, never a direction.
  • On-chain flows. rows holds one block per metric. stablecoin_flows has mint_usd, burn_usd, net_usd, net_status and a per_event breakdown. net_usd is null with net_status: "partial" unless every mint and burn query answered, because one failed leg would otherwise report a large false contraction. aave_liquidations has liquidations beside pool_logs and feed_live, so a quiet market (zero liquidations, live pool) can be told apart from a dead feed. Until 2026-09-25 this route answered 503 with error_code: "crypto_onchain_unavailable" on every call, because the server could not compute the event hashes it filters the chain logs by; it now computes them itself and answers.

News and sentiment

The news routes wrap the news vendor's records: items holds article lists, stats the per-coin and leaderboard sentiment rollups, and market, mentions, digest, prices and summary the market sentiment, top mentions, sundown, ticker price and whale summary payloads. summary/{ticker} returns recent_news, sentiment_stats, trending and news_count_24h. Treat the per-article sentiment label as unverified. When the response includes a sentiment_label_policy note, the label is served as vendor_sentiment_label_untrusted and should not be used as a signal. For what an exchange or the chain actually did, use the events and on-chain routes above. When the crypto news feed fails and returns nothing, the news_crypto routes answer 503 with error: "upstream_unavailable", not billed, instead of a 200 with an empty list: error_code names the failure (for example upstream_quota_exhausted, or upstream_not_configured when no feed is configured), upstream_error summarises it, and Retry-After says when to retry. The body has no data field. A feed that answered with nothing is still a 200, and a partial failure keeps its rows beside a vendor_error block. When the feed is out of quota and states when its quota resets, upstream_error adds quota_resets_at (UTC) and quota_resets_at_basis, and the body adds retry_after_basis: "firm_recheck": Retry-After is when Wealthnow next checks the feed, not when the quota returns.

Examples

Quote Bitcoin (1 credit)

Shell
curl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \  "https://firm.wealthnow.io/api/crypto/BTC?series=false"

Live response captured 2026-09-23, abbreviated:

JSON
{  "ok": true,  "timestamp": "2026-09-23T05:00:17.284033+00:00",  "ticker": "BTC",  "pair": "X:BTCUSD",  "vs": "USD",  "quote": {    "price": 87125.0,    "as_of_ts": "2026-09-23T05:00:00+00:00",    "change_pct_24h": 1.075372354711037,    "change_24h": 926.9499999999971,    "change_basis": "vs_prev_utc_day_close",    "volume_24h": 2006.02328534,    "volume_basis": "utc_day",    "market_cap": null  },  "day": { "open": 86201.35, "high": 87379.7, "low": 86108, "close": 87159.93, "volume": 2006.02328534, "vwap": 86697.8829 },  "prev_day": { "open": 86594.94, "high": 86752, "low": 85059.28, "close": 86198.05, "volume": 16565.86870454, "vwap": 86060.7417 },  "last_trade": { "price": 87125, "size": 3e-08, "exchange": 1, "ts": "2026-09-23T05:00:17.057000+00:00" },  "source": "vendor:market-data",  "as_of": "2026-09-23T05:00:00+00:00"}
Python
import os, requests r = requests.get(    "https://firm.wealthnow.io/api/crypto/BTC",    params={"vs": "USD", "series": True},    headers={"Authorization": f"Bearer {os.environ['WEALTHNOW_API_KEY']}"},    timeout=30,)r.raise_for_status()data = r.json()quote = data["quote"]print(f"{data['pair']}: {quote['price']:,.2f} ({quote['change_pct_24h']:+.2f}% vs prior UTC close)")bars = data.get("series_daily") or []if bars:    print(f"Lowest low in the last {len(bars)} daily bars: {min(b['low'] for b in bars):,.2f}")

Is the BTC perp market crowded? (1 credit)

Shell
curl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \  "https://firm.wealthnow.io/api/v3/crypto/derivatives/funding?symbols=BTC,ETH"

Live response captured 2026-09-26, abbreviated to one symbol, two venues and three sources. With several symbols and the default detail=auto, venues is a compact {venue: rate_8h} map, and detail reports the level auto resolved to:

JSON
{  "ok": true,  "kind": "crypto_derivatives_funding",  "purpose": "data_context",  "not_a_score": true,  "not_a_forecast": true,  "asset_class": "crypto",  "as_of": "2026-09-26T23:17:23.517000+00:00",  "stale_after_seconds": 600.0,  "status": "ok",  "rows": [    {      "symbol": "BTC",      "funding_rate_8h": 1.1619e-06,      "funding_rate_basis": "oi_weighted_verified",      "funding_apr": 0.001272,      "oi_weighted_rate_8h": 1.1619e-06,      "mean_rate_8h_verified": 5.0381e-06,      "dispersion_bps": 0.63,      "funding_z_30d": -1.97,      "funding_z_status": "ok",      "venues": {        "okx": -8.305e-06,        "deribit": 1.21e-06      },      "n_venues": 7,      "status": "ok"    }  ],  "count": 2,  "count_ok": 2,  "sources": {    "okx": {      "status": "ok",      "tier": "verified"    },    "binance": {      "status": "geo_blocked",      "reason": "venue API is geo-blocked from the serving host; FIRM never routes around it",      "funding": "unavailable",      "oi": "unavailable"    },    "coingecko": {      "status": "unavailable",      "tier": "aggregator",      "mode": "disabled",      "reason": "no licensed key"    }  },  "units": {    "funding_rate_8h": "fraction per 8h, venue-interval normalised; headline = OI-weighted over VERIFIED (first-party) venues (funding_rate_basis names it)",    "funding_apr": "fraction, rate_8h×3×365",    "dispersion_bps": "(max−min venue rate_8h) × 1e4"  },  "detail": "summary",  "shape": "compact"}
Python
import os, requests r = requests.get(    "https://firm.wealthnow.io/api/v3/crypto/derivatives/funding",    params={"symbols": "BTC,ETH,SOL"},    headers={"Authorization": f"Bearer {os.environ['WEALTHNOW_API_KEY']}"},    timeout=30,)r.raise_for_status()for row in r.json()["rows"]:    if row.get("status") != "ok":        print(f"{row['symbol']}: {row.get('reason', 'missing')}")        continue    z = row["funding_z_30d"] if row.get("funding_z_status") == "ok" else None    print(f"{row['symbol']}: {row['funding_apr']:.1%} APR across {row['n_venues']} venues, 30d z = {z}")

What listed in the last 24 hours? (1 credit)

Shell
curl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \  "https://firm.wealthnow.io/api/v3/crypto/events/announcements?hours=24&event_type=listing"

Read origin_ts for when the venue published and lag_ms for how late the API saw it. Check sources before concluding nothing was listed: a venue marked geo_blocked or missing did not answer.

Is stablecoin supply expanding? (1 credit)

Python
import os, requests r = requests.get(    "https://firm.wealthnow.io/api/v3/crypto/onchain/flows",    params={"hours": 24},    headers={"Authorization": f"Bearer {os.environ['WEALTHNOW_API_KEY']}"},    timeout=30,)r.raise_for_status()blocks = {row["metric"]: row for row in r.json()["rows"]}flows = blocks.get("stablecoin_flows")if flows and flows.get("net_status") == "ok":    print(f"Net stablecoin supply change: ${flows['net_usd']:,.0f}")else:    print("Net supply withheld: not every mint and burn query answered.")liq = blocks.get("aave_liquidations")if liq:    print(f"Liquidations: {liq['liquidations']} (pool logs: {liq['pool_logs']}, feed live: {liq['feed_live']})")

Crypto news for one coin (2 credits, Starter and up)

Shell
curl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \  "https://firm.wealthnow.io/api/v3/news_crypto/summary/ETH"