ETF fund list
ETF fund list (ticker, issuer, AUM, fee, ...)
/api/etf/fundsRequest
Query parameters
| Name | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
| asset | string | Optional | BTC | BTC, ETH, SOL, HYPE | Underlying asset. Any other value returns 400 `INVALID_PARAM`. Example: BTC |
Example request
curl -s "https://www.coinboss.com/api/etf/funds?asset=BTC"Response fields
The field table is generated from real responses, so it lists exactly what the endpoint returns. Paths use a[] for array items and {*} for objects keyed by a dynamic name such as a coin or an exchange.
| Field | Type | Unit | Description |
|---|---|---|---|
| success | boolean | — | true when the request succeeded. On failure the body is `{ success: false, code, error, request_id }`. |
| asset | string | — | Asset symbol. |
| unit | string | — | Unit of the values in this object. |
| count | number | — | Number of items. |
| funds | array | — | All spot ETF funds of the asset, sorted by `latest_aum` descending. |
| funds[] | object | — | One fund with its latest flow, AUM and snapshot attributes. |
| funds[].ticker | string | — | Fund ticker. |
| funds[].issuer | string | — | Fund issuer. |
| funds[].latest_date | string | — | Most recent trading day (YYYY-MM-DD) with flow data for the fund; null when the fund has no rows. |
| funds[].latest_flow | number | million USD | Net flow of the fund on `latest_date`; negative = net outflow. |
| funds[].sum_7d | number | — | 7-day sum. |
| funds[].cum_total | number | — | Cumulative total. |
| funds[].latest_aum | number | million USD | Assets under management of the fund on `latest_date`; null when not available for that day. |
| funds[].latest_premium_pct | number|null | % | Premium (+) or discount (−) of the fund's market price to its net asset value on `latest_date`; null when not available for that day. |
| funds[].source | string | — | Where the value comes from. |
| funds[].fee_pct | number | % | Annual management fee of the fund in percent (0.25 = 0.25 % per year); last known value, see `frozen_fields` for its date. |
| funds[].volume_usd | number | USD | Volume in USD notional. |
| funds[].mkt_share_pct | number | % | Fund AUM as a percentage of the underlying coin's total market cap (not its share among ETFs); last known value, see `frozen_fields`. |
| funds[].cum_inflow_official | number | million USD | Cumulative net inflow since launch as published by a third-party source; last known value, see `frozen_fields` for its date. |
| funds[].etf_share_pct | number | % | `latest_aum` of the fund as a percentage of the summed `latest_aum` of all funds of the same asset. |
| frozen_fields | object | — | Fields whose source stopped updating; they carry the last known value and must not be read as current. `null` when nothing is frozen. |
| frozen_fields.fields | array | — | Names of the frozen fields. |
| frozen_fields.fields[] | string | — | Field name. |
| frozen_fields.as_of | string | — | Date of the last update of the frozen fields (YYYY-MM-DD). |
| frozen_fields.latest_date | string | — | Newest date of the fields that still update (YYYY-MM-DD). |
| frozen_fields.detail | array | — | Detail. |
| frozen_fields.detail[] | object | — | Detail. |
| frozen_fields.detail[].field | string | — | Frozen field name. |
| frozen_fields.detail[].as_of | string | — | Date of the last update of this field (YYYY-MM-DD). |
| frozen_fields.detail[].served | string | — | What the API returns for the field: `last_known_value` or `null`. |
| frozen_fields.by_ticker | object | — | Per fund: date of the last update of each frozen field. dynamic keys: IBIT,FBTC,GBTC,BTC,BITB,ARKB |
| frozen_fields.by_ticker.{*} | object | — | Frozen fields of one fund, keyed by field name. |
| frozen_fields.by_ticker.{*}.fee_pct | string | % | Date of the last update of `fee_pct` (YYYY-MM-DD). |
| frozen_fields.by_ticker.{*}.volume_usd | string | USD | Volume in USD notional. |
| frozen_fields.by_ticker.{*}.mkt_share_pct | string | % | Date of the last update of `mkt_share_pct` (YYYY-MM-DD). |
| frozen_fields.by_ticker.{*}.cum_inflow_official | string | — | Date of the last update of `cum_inflow_official` (YYYY-MM-DD). |
| frozen_fields.by_ticker.{*}.latest_premium_pct | string | % | Date of the last update of `latest_premium_pct` (YYYY-MM-DD). |
| frozen_fields.note | string | — | Note. |
Generated 2026-11-11 23:00 UTC from 1 real responses.
Example response
/api/etf/funds?asset=BTC · Real response captured 2026-11-13 03:58:19 UTC. Long arrays and maps are shortened for display: funds had 13 items; frozen_fields.detail had 5 items; frozen_fields.by_ticker had 13 items.
- "success"true
- "asset""BTC"
- "unit""million_usd"
- "count"13
- "funds"
- "frozen_fields"
- "fields"
- "as_of""2026-10-08"
- "latest_date""2026-11-12"
- "detail"
- "by_ticker"
- "note""fields 所列字段的数据源自 as_of 之后未再更新:served=last_known_value 的字段返回的是 as_of 当日的最后已知值(不是 latest_date 的值);served=null 的字段在 latest_date 无数据、返回 null。其余字段(latest_flow/sum_7d…"
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 5m
- Edge micro-cache
- 10s
- Update frequency
- hourly (minute 15); source publishes once per US trading day
- Window
- latest snapshot per fund (flows summed over 7 trading days and since listing)
- Data sources
- Per-fund list of US spot crypto ETFs: flows from a public ETF flow tracker, AUM from a public market-data site.
- Exchange coverage
- All funds of the selected asset (BTC, ETH, SOL, HYPE).
- Sorting
- latest AUM descending
- Units
- million USD (flows, AUM); percent (premium, fee, shares)
- Method
- cum_total = sum of daily flows; etf_share_pct = fund AUM / sum of AUM of all funds of the same asset x 100.
- Timestamps
- Unix epoch milliseconds (UTC) unless the field description says otherwise
- Response format
- json
- Stability
- Stable
Live status
Flows and holdings update daily. `fee_pct`, `volume_usd`, `mkt_share_pct` and `cum_inflow_official` come from a source that stopped publishing on 2026-10-08 and keep their last value until a replacement is live; do not treat those four fields as current. `latest_premium_pct` is `null` for the same reason. The `frozen_fields` object in the response names these fields with the date each value refers to.
Availability, last 30 days
100% of 410 checks passed
Errors
Failed calls share one shape on every endpoint. The full list is on the errors page. Errors and rate limits →
| Code | HTTP | Meaning | What to do |
|---|---|---|---|
| INVALID_PARAM | 400 | A required parameter is missing or a value is not accepted. `param` names the parameter when it is known. | Do not retry unchanged; fix the request. |
| UNAUTHORIZED | 401 | The `CB-API-KEY` header was sent but the key is unknown or revoked. Public data needs no key — drop the header or use a valid key. | Do not retry unchanged. |
| FORBIDDEN | 403 | The route is not part of the public API (internal or account-only). | Do not retry. |
| NOT_FOUND | 404 | Unknown route, or the requested coin / exchange / fund does not exist. | Do not retry; check the path and identifiers against the catalog. |
| RATE_LIMITED | 429 | More requests than the per-minute limit. `Retry-After` gives the seconds to wait. | Wait for `Retry-After`, then retry with backoff. |
| INTERNAL | 500 | Unexpected server error. The message is generic by design; quote `request_id` when reporting it. | Retry once after a few seconds; report it with the request id if it persists. |
| UPSTREAM_FAILED | 503 | The data source behind this endpoint did not answer in time. No stale or substitute numbers are returned in its place. | Retry with backoff; check the status page. |
| UNAVAILABLE | 501 / 503 | The dataset is temporarily not ready (cache warming) or the endpoint has no lawful public source yet. | Retry later; the catalog marks endpoints that are unavailable by design. |
| REQUEST_FAILED | 200 | Some older endpoints answer HTTP 200 with `success: false`. Always check `success`, not only the HTTP status. | Depends on the message; treat as a failed request. |
Try it
/api/etf/fundsPartialstring · default BTC — Underlying asset. Any other value returns 400 `INVALID_PARAM`.
https://www.coinboss.com/api/etf/funds?asset=BTCMore in this category
- Spot ETF funds /api/sd/etf/funds
- Spot ETF history /api/sd/etf/history
- Spot ETF overview (issuer disclosures) /api/sd/etf/overview
- Per-fund daily spot-ETF net flows /api/etf/detail
- Daily spot-ETF net-flow history /api/etf/flows
- Single ETF detail /api/etf/fund/:ticker
- ETF fund list /api/etf/funds
- ETF coin holdings per fund /api/etf/holdings
- ETF / trust products of one issuer /api/etf/issuer
- ETF overview /api/etf/overview
- Grayscale trust premium / discount /api/grayscale/premium
- Futures-based ETF volumes /api/indicators/futures-etf-volumes