CryptoETF — Python SDK for spot crypto ETF flows
The official client for the CryptoETF API: daily net flows of every US-listed spot crypto ETF, fund by fund, plus fund AUM, the CEFI sentiment index and coin prices. Data by cryptoetf.today.
Sixteen assets: BTC, ETH, SOL, XRP, HYPE, DOGE, LINK, AVAX, HBAR, LTC, BNB, DOT, SUI, NEAR, TRX, ZEC. Zero dependencies (standard library only), typed, Python 3.9+.
Install
pip install cryptoetf
Get an API key
Sign in at cryptoetf.today and create a key in Profile → For developers. It is free.
Quick start
from cryptoetf import CryptoETF
etf = CryptoETF(api_key="...") # or set CRYPTOETF_API_KEY
# Latest daily net flow for every asset, US$ millions
for a in etf.flows.summary()["assets"]:
print(a["symbol"], a["date"], a["netFlowUsdM"])
# Bitcoin ETFs fund by fund
btc = etf.flows.funds("btc")
last_day = btc["days"][-1]
print([(f["ticker"], f["netFlowUsdM"]) for f in last_day["funds"]])
Responses are plain dicts with the same field names as the API, so they drop straight into pandas:
import pandas as pd
df = pd.DataFrame(etf.flows.asset("eth")["days"])
Methods
| Method | Endpoint | Returns |
|---|---|---|
flows.summary() |
GET /v1/flows/summary |
Latest net flow per asset |
flows.asset(asset) |
GET /v1/flows/{asset} |
Daily net flows of one asset |
flows.funds(asset) |
GET /v1/flows/{asset}/funds |
Daily net flows of one asset, per fund |
funds(asset=None) |
GET /v1/funds |
Fund directory with AUM, fees, coins held |
cefi() |
GET /v1/index/cefi |
CEFI sentiment index (0–100) and its history |
tickers() |
GET /v1/tickers |
Tracked assets |
prices() |
GET /v1/prices |
Spot prices of the 16 coins |
weekly() |
GET /v1/analytics/weekly |
Seven-day totals per asset |
asset is a code such as btc, eth, sol, hype or a full name such as
bitcoin. All values are net US$ millions: positive = inflow, negative = outflow.
Full field reference: docs.cryptoetf.today.
Errors and limits
Every failed call raises CryptoETFError with status, an optional code and,
on HTTP 429, retry_after in seconds:
from cryptoetf import CryptoETFError
try:
etf.prices()
except CryptoETFError as e:
if e.status == 429:
print(f"rate limited, retry in {e.retry_after}s")
- Rate limit: 120 requests per minute per key. The latest limit headers are
available as
etf.rate_limit. - History: the free tier covers the last 30 days. Full history will be available on a paid plan.
- Freshness: a trading day appears the next morning (UTC), before the US open. The newest day can be revised once later that day. SUI funds arrive a day later.
Options
CryptoETF(
api_key="...", # default: CRYPTOETF_API_KEY
timeout=15.0, # seconds per request
base_url="https://api.cryptoetf.today/api/v1",
)
Related
- TypeScript SDK: cryptoetf
- No-code access for AI agents: the hosted MCP server at
https://mcp.cryptoetf.today/api/mcp - Embeddable widgets: cryptoetf.today/en/crypto-etf-widgets
Not investment advice. MIT licensed.
Metadata
Release files for cryptoetf 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| cryptoetf-1.0.1.tar.gz | 7.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cryptoetf-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.8 kB
Release files / cryptoetf-1.0.1.tar.gz
| Download URL | cryptoetf-1.0.1.tar.gz |
|---|---|
| Size | 7.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dd120d745764a08ac29df7eb33587fc04372eaacb5425195521b9547aeae6735
|
|
BLAKE2b-256 checksum How to use checksums |
13d33710998450970690900f77d9ef7eba0772548f14348b44bf788f7ea4eba6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / cryptoetf-1.0.1-py3-none-any.whl
| Download URL | cryptoetf-1.0.1-py3-none-any.whl |
|---|---|
| Size | 7.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a4c0b6b9673b132c31b4db2315648206f02d3215c1382bb3dbbca93ddfc74d30
|
|
BLAKE2b-256 checksum How to use checksums |
252b1fd17f511af4c57d27d5b986e0c1ee92115069c543432b728e16350fa9ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for cryptoetf 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for cryptoetf-1.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.