{"openapi":"3.0.0","paths":{"/v1/flows/summary":{"get":{"description":"Returns the latest net ETF flow (USD millions) for each of the 16 tracked assets — BTC, ETH, SOL, XRP, HYP, DOGE, LINK, AVAX, HBAR, LTC, BNB, DOT, SUI, NEAR, TRX and ZEC. \"Latest\" is the most recent day with a non-zero flow for that asset, so `date` can differ between assets: a small fund with no creations for a few days shows its last active day. For a time series of one asset use `/v1/flows/{asset}`.","operationId":"summary","parameters":[],"responses":{"200":{"description":"Latest non-zero net flow per asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowsSummaryDto"}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Latest net flow for every asset","tags":["Flows"]}},"/v1/flows/{asset}":{"get":{"description":"Returns the daily net ETF flow series of one asset for the history window of your plan (30 days on Free), ordered oldest → newest. For btc, eth, sol, xrp and hyp every calendar day is listed, with weekends and a day not yet published as `0`; the other assets list trading days only. Flows are T+1: a trading day appears the next morning (UTC).","operationId":"byAsset","parameters":[{"name":"asset","required":true,"in":"path","description":"Lowercase symbol of the asset. Full names work too (bitcoin, ethereum, solana, dogecoin, chainlink, avalanche, hedera, litecoin, polkadot, tron, zcash), and Hyperliquid accepts hyp or hype. Anything else returns 400.","schema":{"enum":["btc","eth","sol","xrp","hyp","doge","link","avax","hbar","ltc","bnb","dot","sui","near","trx","zec"],"type":"string"}}],"responses":{"200":{"description":"Daily net flows of the asset within your plan's history window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFlowsDto"}}}},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Daily net flows of one asset","tags":["Flows"]}},"/v1/flows/{asset}/funds":{"get":{"description":"Returns one asset within your plan's history window, broken down by fund (IBIT, FBTC, …), ordered oldest → newest. Only trading days with fund-level data are listed. A fund appears from its first trading day; `netFlowUsdM` is null while the fund has not reported that day. Flows are T+1: a trading day appears the next morning (UTC), and a late fund can fill in later that day.","operationId":"fundsByAsset","parameters":[{"name":"asset","required":true,"in":"path","description":"Lowercase symbol of the asset. Full names work too (bitcoin, ethereum, solana, dogecoin, chainlink, avalanche, hedera, litecoin, polkadot, tron, zcash), and Hyperliquid accepts hyp or hype. Anything else returns 400.","schema":{"enum":["btc","eth","sol","xrp","hyp","doge","link","avax","hbar","ltc","bnb","dot","sui","near","trx","zec"],"type":"string"}}],"responses":{"200":{"description":"Daily net flows of every fund of the asset within your plan's history window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFundFlowsDto"}}}},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Daily net flows of one asset, fund by fund","tags":["Flows"]}},"/v1/funds":{"get":{"description":"Returns every US spot crypto ETF that has started trading: ticker, name, issuer, asset, exchange, listing date and sponsor fee, plus its current net assets (AUM) and the coins it holds. Each fund also carries the fee charged today with any fee waiver in effect, its yearly fee revenue at current assets, its share of the asset’s circulating supply and its staking status from SEC filings. `assets` adds the net assets, coins held and supply share of each asset complex. Net assets are a current snapshot, not a history; `netAssetsDate` is the day they belong to.","operationId":"list","parameters":[{"name":"asset","required":false,"in":"query","description":"Only the funds of one asset: lowercase symbol or full name, as in `/v1/flows/{asset}`. Without it, all 16 assets.","schema":{"example":"btc","type":"string"}}],"responses":{"200":{"description":"Funds with their current net assets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundsDto"}}}},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Fund directory with assets under management","tags":["Funds"]}},"/v1/index/cefi":{"get":{"description":"Returns the composite Crypto ETF Flow Index (CEFI): a 0–100 index of money moving through US spot crypto ETFs on all 16 tracked assets — the current value, its components and recent history. Net flows are added up in dollars and three components are scored against the past year: flow (today's net flow, smoothed, 40%), trend (net flow over 20 trading days, 30%) and breadth (share of funds with inflows, 30%). 50 = zero net flow. This is the only CEFI index: there are no per-asset variants. History covers your plan's history window (30 days on Free), trading days only. Methodology: https://cryptoetf.today/en/crypto-etf-sentiment-index","operationId":"composite","parameters":[],"responses":{"200":{"description":"Current CEFI value, its components and history within your plan's window.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CefiIndexDto"}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"CEFI — Crypto ETF Flow Index","tags":["Index"]}},"/v1/tickers":{"get":{"description":"Returns the 16 tracked assets — symbol, internal id and name. Either the `asset` value or the lowercase `symbol` works as the `{asset}` path parameter. Hyperliquid is listed as `HYP`.","operationId":"list","parameters":[],"responses":{"200":{"description":"The 16 tracked assets.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TickerDto"}}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"List tracked assets","tags":["Tickers"]}},"/v1/prices":{"get":{"description":"Returns the last price and the rolling 24-hour change of each tracked coin (the coin, not the ETF share), quoted in USDT. The answer is cached for 60 seconds and can be up to five minutes old — `updatedAt` tells when it was fetched. A coin the exchange did not return is left out.","operationId":"list","parameters":[],"responses":{"200":{"description":"Last price and 24-hour change per coin.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricesDto"}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Spot prices of the coins","tags":["Prices"]}},"/v1/analytics/weekly":{"get":{"description":"Returns flow totals for each of the 16 assets over a window of seven calendar days ending today (UTC, `from`…`to`): total net flow, average per listed day, and the number of inflow and outflow days. The window holds about five trading days, and today is usually not published yet (flows are T+1).","operationId":"weekly","parameters":[],"responses":{"200":{"description":"Seven-day totals per asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeeklyAnalyticsDto"}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Seven-day flow totals","tags":["Analytics"]}},"/v1/holdings":{"get":{"description":"Coins held in trust by US spot crypto ETFs, their share of circulating supply (`supplyPct`, percent) and, per fund, `coinsBasis`: `reported` when the issuer publishes coins, `estimated` when coins are net assets per share at the same-day coin price. Includes 7- and 30-day changes and the daily history the site keeps.","operationId":"getHoldings","parameters":[{"name":"asset","required":false,"in":"query","description":"Optional asset filter: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec. Omit for all 16.","schema":{"example":"btc","type":"string"}}],"responses":{"200":{"description":"Holdings by asset and fund, with daily history."},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Coins held by ETFs, per fund and per asset","tags":["Paid datasets"]}},"/v1/funds/{ticker}/snapshots":{"get":{"description":"Daily snapshots of one fund as published by its issuer: shares outstanding, NAV per share, net assets (USD), coins in trust, market close and `premiumPct` = (close − NAV) / NAV × 100. Fields are null on days the issuer did not publish them. Snapshots are collected from August 2026.","operationId":"getSnapshots","parameters":[{"name":"ticker","required":true,"in":"path","description":"Fund ticker, case-insensitive. The list is in `/v1/funds`.","schema":{"example":"IBIT","type":"string"}}],"responses":{"200":{"description":"Daily snapshots of the fund, oldest → newest."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Daily fund mechanics: shares, NAV, net assets, premium","tags":["Paid datasets"]}},"/v1/etf-prices/{ticker}":{"get":{"description":"Daily open, high, low, close and volume (shares) of one ETF ticker for the regular US session, 09:30–16:00 New York time. Pre- and after-market trades are not included.","operationId":"getEtfPrices","parameters":[{"name":"ticker","required":true,"in":"path","description":"Fund ticker, case-insensitive. The list is in `/v1/funds`.","schema":{"example":"IBIT","type":"string"}}],"responses":{"200":{"description":"Daily bars, oldest → newest."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Daily OHLCV of one ETF","tags":["Paid datasets"]}},"/v1/metrics/cost-basis":{"get":{"description":"Estimated average entry price per coin of ETF holders: coins accumulated through net flows, money invested, average entry, latest coin price, unrealised P&L, and how many days holders have been above or below entry. Built from daily flows valued at the volume-weighted price of each day; coins of converted trusts (GBTC, ETHE) are not included.","operationId":"getCostBasis","parameters":[{"name":"asset","required":false,"in":"query","description":"Optional asset filter: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec. Omit for all 16.","schema":{"example":"btc","type":"string"}}],"responses":{"200":{"description":"Cost basis by asset."},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Average entry price of ETF holders","tags":["Paid datasets"]}},"/v1/metrics/issuer-revenue":{"get":{"description":"Net assets times the prospectus sponsor fee, with temporary waivers applied: per fund, per issuer and for the market, per day and annualised. Arithmetic on the published fee, not reported revenue.","operationId":"getIssuerRevenue","parameters":[{"name":"asset","required":false,"in":"query","description":"Optional asset filter: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec. Omit for all 16.","schema":{"example":"btc","type":"string"}}],"responses":{"200":{"description":"Fee revenue by fund, issuer and in total."},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Estimated sponsor fee revenue","tags":["Paid datasets"]}},"/v1/metrics/staking":{"get":{"description":"Staking status of each fund from SEC filings, share of assets staked, disclosed staking yield, providers, how rewards are handled, and the estimated coins staked per asset.","operationId":"getStaking","parameters":[{"name":"asset","required":false,"in":"query","description":"Optional asset filter: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec. Omit for all 16.","schema":{"example":"btc","type":"string"}}],"responses":{"200":{"description":"Staking by asset and fund."},"400":{"description":"Unsupported asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":400,"error":"Bad Request","message":"Unsupported asset \"abc\". Supported: btc, eth, sol, xrp, hyp, doge, link, avax, hbar, ltc, bnb, dot, sui, near, trx, zec."}}}},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Staking inside crypto ETFs","tags":["Paid datasets"]}},"/v1/metrics/vs-miners":{"get":{"description":"Net creations of US spot bitcoin ETFs in BTC against newly mined bitcoin: last full week, 30 days, year to date and since launch, the streak of weeks with ETF demand above new supply, and every week since launch.","operationId":"getVsMiners","parameters":[],"responses":{"200":{"description":"Windows, streak and weekly series."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Bitcoin ETF net buying vs newly mined bitcoin","tags":["Paid datasets"]}},"/v1/institutions":{"get":{"description":"Quarterly SEC 13F holdings of US spot crypto ETFs: totals by quarter, top holders and holder types. Pass `period` (for example 2026Q2) for an earlier quarter.","operationId":"getInstitutions","parameters":[{"name":"period","required":false,"in":"query","schema":{"example":"2026Q2","type":"string"}}],"responses":{"200":{"description":"13F overview for the quarter."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Institutional holders from 13F filings","tags":["Paid datasets"]}},"/v1/institutions/funds/{ticker}":{"get":{"description":"Largest 13F holders of one fund in the quarter, up to `limit` (default 10, max 50).","operationId":"getFundInstitutions","parameters":[{"name":"ticker","required":true,"in":"path","description":"Fund ticker, case-insensitive. The list is in `/v1/funds`.","schema":{"example":"IBIT","type":"string"}},{"name":"period","required":false,"in":"query","schema":{"example":"2026Q2","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"example":10,"type":"string"}}],"responses":{"200":{"description":"13F holders of the fund."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Institutional holders of one fund","tags":["Paid datasets"]}},"/v1/filings":{"get":{"description":"Every tracked crypto ETF application with its stage (filed, amending, effective, trading, withdrawn), key dates and the latest documents, from SEC EDGAR and the Federal Register.","operationId":"getFilings","parameters":[],"responses":{"200":{"description":"All tracked filings."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"Crypto ETF filings at the SEC","tags":["Paid datasets"]}},"/v1/filings/{slug}":{"get":{"description":"Stage, dates and every SEC document of one application. Slugs come from `/v1/filings`.","operationId":"getFiling","parameters":[{"name":"slug","required":true,"in":"path","schema":{"example":"canary-trx-etf","type":"string"}}],"responses":{"200":{"description":"The filing and its documents."},"401":{"description":"Missing, unknown or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":401,"error":"Unauthorized","message":"API key required. Register at cryptoetf.today and pass it as \"Authorization: Bearer <key>\"."}}}},"403":{"description":"The dataset is part of the paid plans; the key is on Free.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":403,"error":"Forbidden","code":"plan_required","message":"This dataset is available on Builder, Commercial and Enterprise plans. See https://cryptoetf.today/en/pricing"}}}},"429":{"description":"More requests in the current minute than your plan allows (60 on Free, 300 on Builder and Commercial). The `Retry-After` header says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"},"example":{"statusCode":429,"error":"Too Many Requests","message":"Rate limit exceeded (60/min). Retry in 17s."}}}}},"security":[{"ApiKey":[]}],"summary":"One crypto ETF filing with its document history","tags":["Paid datasets"]}}},"info":{"title":"CryptoETF API","description":"Free REST API for US spot crypto ETF data: daily net flows for 16 assets and for every fund behind them (IBIT, FBTC, ETHA, …), a fund directory with net assets (AUM), the CEFI — Crypto ETF Flow Index, spot prices of the coins and weekly totals. These are the numbers behind [cryptoetf.today](https://cryptoetf.today). Overview, FAQ and the MCP setup: [cryptoetf.today/api](https://cryptoetf.today/en/api).\n\n## Quick start\n\n```bash\ncurl -H \"Authorization: Bearer $CRYPTOETF_KEY\" \\\n  https://api.cryptoetf.today/api/v1/flows/btc\n```\n\n```js\nconst KEY = process.env.CRYPTOETF_KEY;\nconst res = await fetch(\n  \"https://api.cryptoetf.today/api/v1/flows/btc\",\n  { headers: { Authorization: `Bearer ${KEY}` } },\n);\nconst { days } = await res.json(); // oldest → newest\n```\n\n```python\nimport os, requests\n\nKEY = os.environ[\"CRYPTOETF_KEY\"]\nres = requests.get(\n    \"https://api.cryptoetf.today/api/v1/flows/btc\",\n    headers={\"Authorization\": f\"Bearer {KEY}\"},\n)\nres.raise_for_status()\nprint(res.json()[\"days\"][-1])  # newest day\n```\n\n## Authentication\n\nEvery `/v1` request needs a free API key — no card, no plan. Sign in at cryptoetf.today and open your [profile](https://cryptoetf.today/en/profile): the key (`cetf_live_…`) is created there. Send it as `Authorization: Bearer <key>` or as `X-API-Key: <key>`. A missing, unknown or revoked key returns `401`.\n\n## Client libraries\n\nOfficial SDKs cover every `/v1` endpoint, read the key from `CRYPTOETF_API_KEY` and raise a typed error with the HTTP status, the error code and `Retry-After`. Both have no dependencies. Source: [zerosix-studio/cryptoetf-sdk](https://github.com/zerosix-studio/cryptoetf-sdk).\n\n**TypeScript / JavaScript** — Node 18+, Deno, Bun and browsers · [cryptoetf on npm](https://www.npmjs.com/package/cryptoetf)\n\n```bash\nnpm i cryptoetf\n```\n\n```js\nimport { CryptoETF } from \"cryptoetf\";\n\nconst etf = new CryptoETF(); // reads CRYPTOETF_API_KEY\nconst { days } = await etf.flows.asset(\"btc\"); // oldest → newest\n```\n\n**Python** — 3.9+ · [cryptoetf on PyPI](https://pypi.org/project/cryptoetf/)\n\n```bash\npip install cryptoetf\n```\n\n```python\nfrom cryptoetf import CryptoETF\n\netf = CryptoETF()  # reads CRYPTOETF_API_KEY\nprint(etf.flows.asset(\"btc\")[\"days\"][-1])  # newest day\n```\n\n## Rate limits\n\nLimits depend on the plan of the account the key belongs to: **60 requests per minute** on Free, 300 on Builder and Commercial. They are counted per key in fixed 60-second windows. The `X-Plan` header names your plan. Responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (Unix time in seconds when the window resets). Over the limit the API returns `429` with a `Retry-After` header in seconds.\n\n## CSV export\n\nPaid plans can add `?format=csv` to any `/v1` request to get the same data as a CSV file. Nested lists become rows: `/v1/flows/{asset}/funds` gives one row per day and fund. When a response has several tables, pick one with `?table=`, for example `/v1/funds?format=csv&table=funds`. A Free key gets `403 plan_required`.\n\n## Webhooks\n\nPaid plans can receive events instead of polling. Add an HTTPS address and pick events in your [profile](https://cryptoetf.today/en/profile). Builder gets `flows.day_complete` and `flows.record` on one address; Commercial gets all eight on up to five addresses: `flows.fund_reported`, `flows.day_complete`, `flows.record`, `fund.launched`, `fund.closed`, `filing.new`, `filing.status_changed`, `cefi.zone_changed`.\n\nEach delivery is a JSON `POST` of `{ id, type, createdAt, data }` with the headers `X-CryptoETF-Event`, `X-CryptoETF-Delivery` and `X-CryptoETF-Signature: t=<unix seconds>,v1=<hex>`, where `v1` is HMAC-SHA256 of `<t>.<raw body>` with your endpoint secret. Reply with any 2xx within 10 seconds. Failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours; an address that fails for 24 hours is switched off and can be switched back on in the profile.\n\n```js\nimport crypto from 'node:crypto';\n\n// rawBody: the request body exactly as received, before JSON.parse\nfunction verify(rawBody, header, secret) {\n  const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));\n  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;\n  const hex = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');\n  return crypto.timingSafeEqual(Buffer.from(hex), Buffer.from(v1));\n}\n```\n\n## Data window and freshness\n\n- **History.** A Free key reads the last 30 days; paid plans read the full history from 11 January 2024. `windowDays` in the response says how many days your key covers. Plans and prices: [cryptoetf.today/en/pricing](https://cryptoetf.today/en/pricing).\n\n- **T+1.** A trading day becomes available the next morning (UTC), before the US open. The newest day can be revised once later that day. SUI funds arrive a day later.\n\n- **Prices** come from exchange tickers and are cached for 60 seconds; a response can be up to five minutes old — check `updatedAt` in `/v1/prices`.\n\n- **Per fund.** `/v1/flows/{asset}/funds` breaks each trading day down by fund, with the same history window as your plan. A fund appears from its first trading day; `netFlowUsdM` is `null` while there is no figure for it that day.\n\n- **Net assets.** `/v1/funds` gives each fund’s current net assets and coins held: one snapshot, not a history. Fidelity, Grayscale, Franklin Templeton, Canary and WisdomTree do not publish holdings in coins, so `coinsHeld` is `null` for their funds.\n\nCharts with the full history: [Flows dashboard](https://cryptoetf.today/en/dashboard) · [Funds](https://cryptoetf.today/en/funds) · [CEFI methodology](https://cryptoetf.today/en/crypto-etf-sentiment-index).\n\n## CEFI — Crypto ETF Flow Index\n\nEvery trading day CEFI adds up the net flows of all spot ETFs on the 16 tracked assets, in dollars. Three parts are scored against the past year: today's flow, smoothed (40%), the net flow of the last 20 trading days (30%) and breadth, the share of funds with inflows (30%). Zero flow scores 50; a typical inflow day scores about 69 and a typical outflow day about 31. There is one composite index — no per-asset variants.\n\n## MCP server for AI agents\n\nThe same data over the Model Context Protocol (Streamable HTTP) at `https://mcp.cryptoetf.today/api/mcp`. **No key and no sign-up**; the limit is 60 requests per minute per IP, and over it the server answers with JSON-RPC error `-32029`. Same 30-day window as the REST API. Tools: `get_flows_summary`, `get_asset_flows`, `get_fund_flows`, `get_funds`, `get_cefi_index`, `get_prices`, `get_weekly_analytics` (all read-only).\n\n**Claude Code**\n\n```bash\nclaude mcp add --transport http cryptoetf https://mcp.cryptoetf.today/api/mcp\n```\n\n**Claude Desktop** (`claude_desktop_config.json`)\n\n```json\n{\n  \"mcpServers\": {\n    \"cryptoetf\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.cryptoetf.today/api/mcp\"\n    }\n  }\n}\n```\n\n**Cursor** (`~/.cursor/mcp.json` or `.cursor/mcp.json`)\n\n```json\n{\n  \"mcpServers\": {\n    \"cryptoetf\": {\n      \"url\": \"https://mcp.cryptoetf.today/api/mcp\"\n    }\n  }\n}\n```\n\n**Any stdio client** — the bridge package fetches the data from the same server:\n\n```json\n{\n  \"mcpServers\": {\n    \"cryptoetf\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@zerosix-studio/cryptoetf-mcp\"\n      ]\n    }\n  }\n}\n```\n\nPackage: [@zerosix-studio/cryptoetf-mcp](https://www.npmjs.com/package/@zerosix-studio/cryptoetf-mcp) · source: [zerosix-studio/cryptoetf-mcp](https://github.com/zerosix-studio/cryptoetf-mcp) · [MCP Registry](https://registry.modelcontextprotocol.io): `io.github.sly13/cryptoetf`.\n\n## Conventions\n\n- Dates are UTC, `YYYY-MM-DD`; timestamps are ISO 8601.\n\n- Flows are net, in millions of USD, rounded to 0.1: positive = inflow, negative = outflow.\n\n- `btc` `eth` `sol` `xrp` `hyp` return every calendar day: weekends and a day not yet published come as `0`. The other eleven assets return trading days only. `/v1/flows/{asset}/funds` returns trading days only for every asset.\n\n- The `{asset}` path takes a lowercase symbol (`btc`, `doge`) or a full name (`bitcoin`, `dogecoin`). Hyperliquid is `HYP` in responses; the path takes `hyp` or `hype`.\n\n- The `asset` field in responses is the internal id: `bitcoin`, `ethereum`, `solana`, `xrp`, `hyp`, then the symbol in lowercase for the rest (`doge`, `link`, …).\n\n## Errors\n\nErrors are JSON: `{ \"statusCode\": 401, \"error\": \"Unauthorized\", \"message\": \"…\" }`.\n\n| Status | When |\n| --- | --- |\n| `400` | Unsupported `{asset}`; the message lists the accepted values. |\n| `401` | Missing, unknown or revoked API key. |\n| `429` | Over 120 requests a minute for this key; wait `Retry-After` seconds. |\n\n## Changelog\n\n- **2026-10-16** — Per-fund flows (`/v1/flows/{asset}/funds`, MCP `get_fund_flows`) and the fund directory with net assets (`/v1/funds`, MCP `get_funds`).\n- **2026-10-03** — CEFI v2: flows summed in dollars across 16 assets; new `components` field (`flow`, `trend`, `breadth`).\n- **2026-10-01** — NEAR, TRX and ZEC added: 16 assets.\n- **2026-08-29** — MCP server limited to 60 requests per minute per IP.\n- **2026-08-22** — DOGE, LINK, AVAX, HBAR, LTC, BNB, DOT and SUI added; CEFI became a single composite.\n- **2026-06-17** — `/v1` launched.\n\n## Terms\n\nUse of the API is covered by the [Terms of Service](https://cryptoetf.today/en/terms). The data is for information and research and is not investment advice. Questions and bug reports: [support](https://cryptoetf.today/en/support).","version":"1.0","contact":{}},"tags":[{"name":"Flows","description":"Daily net flows of US spot crypto ETFs per asset and per fund, USD millions."},{"name":"Index","description":"CEFI — Crypto ETF Flow Index: one 0–100 composite over all 16 assets."},{"name":"Funds","description":"Directory of the spot ETFs with their current net assets (AUM) and coins held."},{"name":"Tickers","description":"Directory of the 16 tracked assets."},{"name":"Prices","description":"Spot prices of the underlying coins from exchange tickers."},{"name":"Analytics","description":"Seven-day flow totals per asset."},{"name":"Paid datasets","description":"Holdings, fund mechanics, ETF prices, holder cost basis, issuer revenue, staking, 13F holders and SEC filings. Builder, Commercial and Enterprise plans; a Free key gets 403 `plan_required`."}],"servers":[{"url":"https://api.cryptoetf.today/api","description":"API Server"}],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"API key","type":"http"}},"schemas":{"FlowsSummaryItemDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Asset ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id."},"date":{"type":"object","example":"2026-06-16","nullable":true,"description":"Latest day with a non-zero net flow for this asset (UTC). Can differ between assets; null if there is no data."},"netFlowUsdM":{"type":"number","example":245.7,"description":"Net flow on that day in millions of USD, rounded to 0.1 (positive = inflow)."}},"required":["symbol","asset","date","netFlowUsdM"]},"FlowsSummaryDto":{"type":"object","properties":{"assets":{"description":"One entry per tracked asset.","type":"array","items":{"$ref":"#/components/schemas/FlowsSummaryItemDto"}},"updatedAt":{"type":"string","example":"2026-06-16T07:50:00.000Z","description":"Response generation time (UTC, ISO 8601)."}},"required":["assets","updatedAt"]},"ApiErrorDto":{"type":"object","properties":{"statusCode":{"type":"number","example":401,"description":"HTTP status code."},"error":{"type":"string","example":"Unauthorized","description":"HTTP status text."},"message":{"type":"string","example":"Invalid or revoked API key.","description":"What went wrong, in plain English."}},"required":["statusCode","error","message"]},"FlowPointDto":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-16","description":"Day in UTC (YYYY-MM-DD). btc, eth, sol, xrp and hyp list every calendar day; the other assets list trading days only."},"netFlowUsdM":{"type":"number","example":245.7,"description":"Net ETF flow for the day in millions of USD, rounded to 0.1. Positive = net inflow, negative = net outflow. For btc, eth, sol, xrp and hyp a weekend or a day not yet published is 0."}},"required":["date","netFlowUsdM"]},"AssetFlowsDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Asset ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id: bitcoin, ethereum, solana, xrp, hyp, then the lowercase symbol (doge, link, …)."},"windowDays":{"type":"number","example":30,"description":"Days of history this key can read: 30 for every key."},"days":{"description":"Daily net flows, ordered oldest → newest.","type":"array","items":{"$ref":"#/components/schemas/FlowPointDto"}},"updatedAt":{"type":"string","example":"2026-06-16T07:50:00.000Z","description":"Response generation time (UTC, ISO 8601)."}},"required":["symbol","asset","windowDays","days","updatedAt"]},"FundFlowDto":{"type":"object","properties":{"ticker":{"type":"string","example":"IBIT","description":"Fund ticker."},"issuer":{"type":"string","example":"BlackRock","description":"Issuer of the fund."},"netFlowUsdM":{"type":"number","example":112.4,"nullable":true,"description":"Net flow of the fund that day in millions of USD, rounded to 0.1 (positive = inflow). 0 = no creations or redemptions; null = no figure for the fund that day (usually not reported yet)."}},"required":["ticker","issuer","netFlowUsdM"]},"FundDayDto":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-16","description":"Trading day in UTC (YYYY-MM-DD)."},"totalUsdM":{"type":"number","example":245.7,"description":"Sum of the reported funds that day in millions of USD, rounded to 0.1. Funds that have not reported yet count as 0."},"funds":{"description":"Every fund of the asset that was trading on that day.","type":"array","items":{"$ref":"#/components/schemas/FundFlowDto"}}},"required":["date","totalUsdM","funds"]},"AssetFundFlowsDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Asset ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id."},"windowDays":{"type":"number","example":30,"description":"Days of history this key can read: 30 for every key."},"days":{"description":"Trading days with fund-level data, ordered oldest → newest.","type":"array","items":{"$ref":"#/components/schemas/FundDayDto"}},"updatedAt":{"type":"string","example":"2026-06-16T07:50:00.000Z","description":"Response generation time (UTC, ISO 8601)."}},"required":["symbol","asset","windowDays","days","updatedAt"]},"AssetNetAssetsDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Asset ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id."},"totalNetAssetsUsdM":{"type":"number","example":118450.2,"nullable":true,"description":"Sum of the funds’ net assets in millions of USD, rounded to 0.1."},"date":{"type":"string","example":"2026-06-16","nullable":true,"description":"Day the total belongs to (YYYY-MM-DD)."},"coinsHeld":{"type":"number","example":1292007.4,"nullable":true,"description":"Coins held by all US spot ETFs of the asset on `coinsDate`: reported by issuers, estimated where they do not publish coins."},"coinsDate":{"type":"string","example":"2026-10-21","nullable":true,"description":"Day `coinsHeld` belongs to (YYYY-MM-DD)."},"supplySharePct":{"type":"number","example":6.4273,"nullable":true,"description":"`coinsHeld` as a share of the asset’s circulating supply, percent."}},"required":["symbol","asset","totalNetAssetsUsdM","date","coinsHeld","coinsDate","supplySharePct"]},"FundFeeWaiverDto":{"type":"object","properties":{"feePct":{"type":"number","example":0.12,"description":"Fee charged under the waiver, percent per year."},"aumCapUsdM":{"type":"number","example":2500,"nullable":true,"description":"The waiver covers the first this many millions of USD of assets; null = all assets."},"until":{"type":"string","example":"2027-03-11","nullable":true,"description":"Last day of the waiver (YYYY-MM-DD)."}},"required":["feePct","aumCapUsdM","until"]},"FundStakingDto":{"type":"object","properties":{"status":{"type":"string","example":"active","enum":["active","allowed_not_started","pending_amendment","no","not_stakeable","unknown"],"description":"active = the fund stakes; allowed_not_started = its documents allow staking but it has not started; pending_amendment = a filing to allow staking is pending; no = it does not stake; not_stakeable = the asset cannot be staked (bitcoin, litecoin, dogecoin, zcash, XRP); unknown = not confirmed in filings."},"sharePct":{"type":"number","example":81.74,"nullable":true,"description":"Share of the fund’s coins staked as the issuer last disclosed it, percent."},"sharePctDate":{"type":"string","example":"2026-10-22","nullable":true,"description":"Day `sharePct` belongs to (YYYY-MM-DD)."},"yieldNetPct":{"type":"number","example":2.02,"nullable":true,"description":"Net staking yield, percent per year. See `yieldBasis` for where it comes from."},"yieldBasis":{"type":"string","example":"disclosed","nullable":true,"enum":["disclosed","computed","distributions"],"description":"disclosed = published by the issuer; computed = growth of coins per share from daily issuer snapshots; distributions = the last cash payout annualised."},"rewards":{"type":"string","example":"cash_distribution","nullable":true,"enum":["accrue_to_nav","cash_distribution","mixed","to_sponsor"],"description":"How rewards reach shareholders: kept in the fund, paid out in cash, partly both, or kept by the sponsor."},"providers":{"example":["Figment"],"description":"Staking providers named in filings or on the issuer’s page.","type":"array","items":{"type":"string"}},"filingUrl":{"type":"string","example":"https://www.sec.gov/Archives/edgar/data/1725210/000172521026000016/ethe-20260630.htm","nullable":true,"description":"The filing the staking status is taken from."}},"required":["status","sharePct","sharePctDate","yieldNetPct","yieldBasis","rewards","providers","filingUrl"]},"FundDto":{"type":"object","properties":{"ticker":{"type":"string","example":"IBIT","description":"Fund ticker."},"name":{"type":"string","example":"iShares Bitcoin Trust ETF","description":"Fund name."},"issuer":{"type":"string","example":"BlackRock","description":"Issuer of the fund."},"symbol":{"type":"string","example":"BTC","description":"Ticker symbol of the asset the fund holds."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id; works as the {asset} path parameter."},"exchange":{"type":"string","example":"NASDAQ","description":"Listing exchange."},"listedAt":{"type":"string","example":"2024-01-11","description":"First trading day on the exchange (YYYY-MM-DD)."},"delistedAt":{"type":"string","example":null,"nullable":true,"description":"Last trading day of a fund that has closed (YYYY-MM-DD); null while the fund trades."},"sponsorFeePct":{"type":"number","example":0.25,"nullable":true,"description":"Sponsor fee, percent per year; null if not stated."},"netAssetsUsdM":{"type":"number","example":71234.5,"nullable":true,"description":"Current net assets (AUM) in millions of USD, rounded to 0.1; null if unknown."},"coinsHeld":{"type":"number","example":652341.1234,"nullable":true,"description":"Coins held by the fund, as the issuer last reported them (see `coinsHeldDate`); null when the issuer does not publish holdings in coins."},"coinsHeldDate":{"type":"string","example":"2026-06-13","nullable":true,"description":"Day `coinsHeld` belongs to (YYYY-MM-DD). Can be a day or two older than `netAssetsDate`."},"netAssetsDate":{"type":"string","example":"2026-06-16","nullable":true,"description":"Day the net assets belong to (YYYY-MM-DD); null if unknown."},"netAssetsBasis":{"type":"string","example":"reported","nullable":true,"enum":["reported","repriced","estimated"],"description":"reported = the figure the issuer published for that day; repriced = the latest published figure moved to that day by the change in NAV of the other funds; estimated = coins held times the coin price, for issuers that publish no daily holdings."},"effectiveFeePct":{"type":"number","example":0.25,"nullable":true,"description":"Fee charged today, percent per year: the sponsor fee, or the lower rate of a fee waiver in effect."},"feeWaiver":{"nullable":true,"description":"A fee waiver in effect today; null when there is none.","allOf":[{"$ref":"#/components/schemas/FundFeeWaiverDto"}]},"feeRevenueUsdMPerYear":{"type":"number","example":165.5,"nullable":true,"description":"Current net assets times `effectiveFeePct`: the yearly sponsor fee revenue at today’s assets, millions of USD."},"supplySharePct":{"type":"number","example":4.1452,"nullable":true,"description":"Coins held by the fund (reported, or estimated where the issuer does not publish coins) as a share of the asset’s circulating supply, percent."},"staking":{"nullable":true,"description":"Staking of the fund; null when not available.","allOf":[{"$ref":"#/components/schemas/FundStakingDto"}]}},"required":["ticker","name","issuer","symbol","asset","exchange","listedAt","delistedAt","sponsorFeePct","netAssetsUsdM","coinsHeld","coinsHeldDate","netAssetsDate","netAssetsBasis","effectiveFeePct","feeWaiver","feeRevenueUsdMPerYear","supplySharePct","staking"]},"FundsDto":{"type":"object","properties":{"assets":{"description":"One entry per asset in the response.","type":"array","items":{"$ref":"#/components/schemas/AssetNetAssetsDto"}},"funds":{"description":"Every fund that has started trading.","type":"array","items":{"$ref":"#/components/schemas/FundDto"}},"updatedAt":{"type":"string","example":"2026-06-16T07:50:00.000Z","description":"Response generation time (UTC, ISO 8601)."}},"required":["assets","funds","updatedAt"]},"CefiComponentsDto":{"type":"object","properties":{"flow":{"type":"number","example":59,"description":"Flow: today's net flow, smoothed (40% of the index)."},"trend":{"type":"number","example":74,"description":"Trend: net flow over 20 trading days (30% of the index)."},"breadth":{"type":"number","example":62,"description":"Breadth: share of funds with inflows (30% of the index)."}},"required":["flow","trend","breadth"]},"IndexPointDto":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-16","description":"Date (UTC, YYYY-MM-DD)."},"value":{"type":"number","example":64,"description":"CEFI value for that trading day: an integer 0–100, 50 = zero net flow."}},"required":["date","value"]},"CefiIndexDto":{"type":"object","properties":{"index":{"type":"string","example":"CEFI-Composite","description":"Index id. Always CEFI-Composite: there is one index for all 16 assets."},"current":{"type":"number","example":64,"description":"Latest value: an integer 0–100. 50 = zero net flow; a typical inflow day is about 69, a typical outflow day about 31."},"components":{"nullable":true,"description":"Components of the current value; null while the history is too short to score all three.","allOf":[{"$ref":"#/components/schemas/CefiComponentsDto"}]},"date":{"type":"string","example":"2026-06-16","description":"Trading day of the current value (UTC, YYYY-MM-DD)."},"windowDays":{"type":"number","example":30,"description":"Days of history this key can read: 30 for every key."},"history":{"description":"Index history for trading days, ordered oldest → newest.","type":"array","items":{"$ref":"#/components/schemas/IndexPointDto"}}},"required":["index","current","components","date","windowDays","history"]},"TickerDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id; works as the {asset} path parameter."},"name":{"type":"string","example":"Bitcoin","description":"Human-readable asset name."}},"required":["symbol","asset","name"]},"PriceDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Ticker symbol."},"priceUsd":{"type":"number","example":67432.1,"description":"Last price of the coin against USDT on the exchange (≈ USD)."},"change24hPct":{"type":"number","example":1.83,"description":"Rolling 24-hour price change on the exchange, percent, rounded to 0.01."}},"required":["symbol","priceUsd","change24hPct"]},"PricesDto":{"type":"object","properties":{"prices":{"description":"One entry per tracked asset. An asset the exchange did not return is left out.","type":"array","items":{"$ref":"#/components/schemas/PriceDto"}},"updatedAt":{"type":"string","example":"2026-06-16T07:50:00.000Z","description":"When the prices were fetched from the exchange (UTC, ISO 8601). Cached for 60 s; can be up to 5 minutes old."}},"required":["prices","updatedAt"]},"WeeklyAssetDto":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC","description":"Ticker symbol."},"asset":{"type":"string","example":"bitcoin","description":"Internal asset id."},"netFlowUsdM":{"type":"number","example":1203.4,"description":"Total net flow over the window, millions of USD, rounded to 0.1."},"avgDailyUsdM":{"type":"number","example":171.9,"description":"Total divided by the number of days listed in the window: 7 for btc, eth, sol, xrp and hyp (weekends count as 0), trading days only for the other assets. Millions of USD."},"positiveDays":{"type":"number","example":3,"description":"Number of days with net inflow (> 0) in the window."},"negativeDays":{"type":"number","example":2,"description":"Number of days with net outflow (< 0) in the window."}},"required":["symbol","asset","netFlowUsdM","avgDailyUsdM","positiveDays","negativeDays"]},"WeeklyAnalyticsDto":{"type":"object","properties":{"from":{"type":"string","example":"2026-06-10","description":"Window start (UTC, inclusive): six days before `to`."},"to":{"type":"string","example":"2026-06-16","description":"Window end (UTC, inclusive): today, so the latest day may not be published yet."},"assets":{"description":"One entry per tracked asset.","type":"array","items":{"$ref":"#/components/schemas/WeeklyAssetDto"}}},"required":["from","to","assets"]}}}}