CryptoETF API V1 API

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://

Operations 19

GET /v1/flows/summary Latest net flow for every asset #
GET /v1/flows/{asset} Daily net flows of one asset #
GET /v1/flows/{asset}/funds Daily net flows of one asset, fund by fund #
GET /v1/funds Fund directory with assets under management #
GET /v1/index/cefi CEFI — Crypto ETF Flow Index #
GET /v1/tickers List tracked assets #
GET /v1/prices Spot prices of the coins #
GET /v1/analytics/weekly Seven-day flow totals #
GET /v1/holdings Coins held by ETFs, per fund and per asset #
GET /v1/funds/{ticker}/snapshots Daily fund mechanics: shares, NAV, net assets, premium #
GET /v1/etf-prices/{ticker} Daily OHLCV of one ETF #
GET /v1/metrics/cost-basis Average entry price of ETF holders #
GET /v1/metrics/issuer-revenue Estimated sponsor fee revenue #
GET /v1/metrics/staking Staking inside crypto ETFs #
GET /v1/metrics/vs-miners Bitcoin ETF net buying vs newly mined bitcoin #
GET /v1/institutions Institutional holders from 13F filings #
GET /v1/institutions/funds/{ticker} Institutional holders of one fund #
GET /v1/filings Crypto ETF filings at the SEC #
GET /v1/filings/{slug} One crypto ETF filing with its document history #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cryptoetf-today:cryptoetf-api-v1-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cryptoetf-today-v1-openapi.json Raw ↑
{"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

# --- truncated at 32 KB (58 KB total) ---
# Full source: https://artifacts.apis.io/cryptoetf-today/openapi/_original/cryptoetf-today-v1-openapi.json