XOOMAR

Free ETF Flows API

Spot BTC and ETH ETF holdings read from issuer files, with net flows computed as the day-over-day change in coins held times an exchange reference price. Raw holdings are always included so you can verify the math.

Endpoints

GET
/api/markets/etf-flows?asset=btc|eth&days=90

Per-fund daily rows, newest first.

GET
/api/markets/etf-flows/csv

Everything as CSV.

Honest Limits

  • We read primary issuer files only. Some issuers gate downloads behind bot protection, so per-fund coverage grows as files stay reachable rather than launching complete.
  • Flow is computed, not reported: Δ coins held × our reference price at collection. Both inputs are stored per row.
  • No weekend rows; issuer files update on trading days.

Response Shape

Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs }. The data field is an array of records with these fields:

FieldTypeDescription
datestring (date)File date
tickerstringFund ticker (IBIT, ETHA...)
issuerstringIssuer name
assetstringbtc or eth
holdingsstring | nullCoins held per the issuer file
flowUsdstring | nullComputed net flow vs prior day
aumUsdstring | nullHoldings × reference price

Rows upsert daily after US close. A null flow means no prior-day baseline existed yet.

Numeric values arrive as strings where precision matters (prices, rates); parse with your language's decimal type for accounting-grade math. Rate limiting is fair-use per IP; a 429 response includes a Retry-After header. No authentication or API key needed. Attribution is appreciated: xoomar.com/markets.

Need more headroom? A free account raises your limit to 120 requests a minute with an X-API-Key header.

Frequently Asked Questions

Why is coverage incomplete?
We refuse to scrape aggregator sites and read issuer files only. Issuers that gate downloads behind bot protection appear once their files are reachable; the pipeline retries daily and the admin freshness board tracks it.
How is the flow number computed?
Change in coins held between consecutive issuer files, times our own exchange reference price at collection time. The raw holdings figure ships in every row so the computation is auditable.
When does it update?
Weekdays at 22:30 UTC, after issuers post end-of-day files.
What are the rate limits?
30 requests per minute per IP keyless, 120 with a free account key.

Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.