net_flow = Δ(shares_outstanding) × to_nav where shares_outstanding = aum_usd / nav, from_date is the last snapshot carrying the old pair and to_date is the first snapshot carrying the new pair. This is the standard ETF creation/redemption proxy used by analysts; results are an ESTIMATE, not ICI-authoritative numbers. Snapshot aum_usd/nav derive from SEC filings (NPORT-P monthly, 485BPOS annual) and are constant between filings, so flows are reported on FILING CADENCE, not per calendar day (the previous per-day contract read 0.0 on every non-filing day). Consecutive snapshots with unchanged (aum_usd, nav) are a single plateau and produce NO entry. When fewer than 2 distinct plateaus exist in the window the response is 200 with period_flows=[] and total_net_flow_dollar_estimate=null (honest 'no change observed', not an error) - and since API-1.9 the BODY says why: reason (single_filing_plateau / no_computable_shares), plateaus_observed, and the backing filing's rep_pd_date + accession. Days where the snapshot blob is missing are silently skipped; plateaus span across missing dates. Use case: UC-3 Sector Rotation Detector per-ETF accumulation signal, complemented by ICI aggregate at /etf/flows/aggregate. BREAKING (DATA-N4.7.1): this endpoint replaced the per-calendar-day series contract with filing-cadence period_flows, and renamed the days query param to lookback_days. The old days param is SILENTLY IGNORED (FastAPI drops undeclared query params; it is not rejected) - a mid-migration client sending ?days=30 gets 200 with the default lookback window. Since API-1.14.5 the body also carries sec_monthly_flows - the fund's OFFICIAL monthly creations and redemptions from SEC Form NPORT-P Part B item B.6 (sales / reinvestment / redemption / net, USD, oldest month first, with rep_pd_date + accession) - next to the estimated period_flows; null with sec_monthly_flows_reason for 10-K filers, for symbols without an NPORT-P blob, and for blobs stored before B.6 parsing.x-api-key: ********************curl --location 'https://sugra.ai/api/v1/etf//flows?lookback_days=undefined' \
--header 'x-api-key: <api-key>'{
"data": {
"symbol": "SPY",
"lookback_days": 90,
"snapshots_available": 0,
"period_flows": [
{
"from_date": "2026-04-30",
"to_date": "2026-05-31",
"from_nav": 0,
"to_nav": 0,
"delta_shares": 0,
"net_flow_dollar_estimate": 0,
"from_nav_method": "string",
"to_nav_method": "string",
"from_shares_as_of": "string",
"to_shares_as_of": "string",
"from_aum_source": "string",
"to_aum_source": "string",
"basis_kind": "string",
"basis_note": "string",
"split_ratio_applied": 0,
"split_events_applied": [
{
"property1": "string",
"property2": "string"
}
],
"split_adjustment_reason": "string"
}
],
"total_net_flow_dollar_estimate": 0,
"reason": "string",
"plateaus_observed": 0,
"snapshots_unusable": 0,
"rep_pd_date": "string",
"accession": "string",
"sec_monthly_flows": [
{
"month": "string",
"sales": 0,
"reinvestment": 0,
"redemption": 0,
"net": 0,
"rep_pd_date": "string",
"accession": "string"
}
],
"sec_monthly_flows_reason": "string",
"methodology": "string"
},
"meta": {
"endpoint": "/api/v1/fred/us/cpi",
"data_time": "2026-04-16T14:30:00Z",
"response_time": "2026-04-16T14:30:12Z",
"provider": "Sugra API v1.0.1",
"data_age_days": 0,
"source": "string",
"attribution": "string",
"fallback_used": true,
"fallback_chain": [
"string"
],
"cached": true,
"stale": true,
"period": "string",
"notes": "string"
}
}