Spot ETF Data API for AI Agents
Bitcoin and Ethereum spot ETF data through one API: the official fundamentals of the 19 US spot ETFs, issuer by issuer: shares outstanding, NAV, crypto held and net assets. No regulatory filings to collect and parse fund by fund: one key, one format, every fund.
The official fundamentals of the 19 US spot ETFs, 10 on Bitcoin and 9 on Ethereum, issuer by issuer. Whole market: these routes do not take a symbol.
#Spot ETF data for AI agents and LLMs
“How much Bitcoin do US spot ETFs hold?”, “Which issuer runs the largest Ethereum ETF?”, “How did IBIT’s net assets change?”: an AI agent answers from the official fundamentals of the 19 funds through the get_options_data MCP tool, which serves the asset-level families.
{
"name": "get_options_data",
"arguments": {
"asset": "BTC",
"fields": ["etf_fundamentals"]
}
}- For the LLM: these figures are quarterly, from regulatory filings; there is no daily net flow here, and an answer should say which quarter it describes.
- For developers:
/v1/etf/fundamentalsis one call per asset, a simple tool for your own AI agent (tool calling); its history route serves the past quarters. - Where it runs: Claude, ChatGPT, Cursor and any MCP client, including agent frameworks with MCP support such as LangChain or n8n.
Connect your AI agent with the MCP server guide, or teach it BytNode with the open-source Agent Skills.
#ETF fundamentals
All 11 fields of this route (from the contract)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The balance-sheet date of the filing — the day the holdings, NAV and net assets are measured (end of the quarter for a 10-Q), at midnight UTC. `filed_date` says when the filing reached the SEC. |
ticker | ETF ticker. | |
issuer | ETF issuer. | |
shares_outstanding | shares | ETF shares outstanding. |
nav_per_share_usd | USD | Net asset value per share. |
net_assets_usd | USD | Net assets (AUM). |
form | SEC form type of the filing (`10-Q`, `10-K`...). | |
filed_date | calendar date (YYYY-MM-DD) | Filing date at the SEC. |
filing_url | Link to the filing on SEC EDGAR. | |
holdings | units of the asset (BTC for asset=BTC, ETH for asset=ETH) | Crypto held by the fund, in units of the asset. |
is_holdings_estimated | `true` if the holdings are derived from net assets / price rather than read in the filing. |
All 12 fields of this route (from the contract)
time | ISO 8601 UTC, milliseconds (2026-09-28T14:00:00.000Z) | The balance-sheet date of the filing — the day the holdings, NAV and net assets are measured (end of the quarter for a 10-Q), at midnight UTC. `filed_date` says when the filing reached the SEC. |
ticker | ETF ticker. | |
issuer | ETF issuer. | |
shares_outstanding | shares | ETF shares outstanding. |
nav_per_share_usd | USD | Net asset value per share. |
net_assets_usd | USD | Net assets (AUM). |
form | SEC form type of the filing (`10-Q`, `10-K`...). | |
filed_date | calendar date (YYYY-MM-DD) | Filing date at the SEC. |
filing_url | Link to the filing on SEC EDGAR. | |
holdings | units of the asset (BTC for asset=BTC, ETH for asset=ETH) | Crypto held by the fund, in units of the asset. |
is_holdings_estimated | `true` if the holdings are derived from net assets / price rather than read in the filing. | |
is_closed | `true` = the row is final; `false` = provisional: the latest bucket while it still settles (a few seconds after its end, e.g. a candle whose volumes are not final yet), or the period in progress with `?live=1` on the routes that take it. Exception, rare: when a venue delivers trades LATE (seconds to minutes, e.g. during a burst), a closed row built from trades (trade candles, candle volumes, CVD, buy/sell ratio, trades per second) is corrected afterwards to include them, usually within minutes and at most one hour later; the correction only adds the late trades. |
The official anchor filed by the issuers: number of shares, net asset value, crypto held and net assets, per issuer. Ten Bitcoin issuers and nine Ethereum issuers are tracked.
The family has two parts, chosen with ?asset=, which is required: BTC serves the ten Bitcoin ETFs; ETH serves the nine Ethereum ETFs. The holdings are in holdings on both, in units of the asset of the part.
| Parameter | Type | Default | Description |
|---|---|---|---|
asset | string | required | BTC or ETH. Required: without it, or with any other value, 422 with the accepted values. |
ticker | string | — | On the history: a single issuer, by its ticker (IBIT, for example). |
since_ms / until_ms | integer | — | On the history: bounds on the balance-sheet date (time), in milliseconds. |
limit | integer | 100 | On the history, from 1 to 1000. |
# The nine Ethereum ETFs (?asset= is required: BTC or ETH)
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/etf/fundamentals?asset=ETH"
# The filing history of a single issuer
curl -H "X-API-KEY: $BYTNODE_API_KEY" \
"https://api.bytnode.com/v1/etf/fundamentals/history?asset=BTC&ticker=IBIT&limit=8"| Field | Type | Description |
|---|---|---|
ticker | string | The ticker of the ETF. |
issuer | string | The issuer. |
time | string | The balance-sheet date of the filing (the date the holdings are stated at), at midnight UTC — the end of the reporting period when the filing gives no balance-sheet date. Bounds, pages and sort order all use this instant. |
shares_outstanding | float | Number of shares outstanding. |
nav_per_share_usd | float | Net asset value per share, in dollars. |
net_assets_usd | float | Net assets, in dollars. |
holdings | float | null | Quantity of the asset held, in BTC on the Bitcoin part, in ETH on the Ethereum part. |
is_holdings_estimated | boolean | true when the holdings are an estimate rather than the filed figure. |
form, filed_date, filing_url | string | The form filed, its filing date and the link to the original document. |